001 浏览器进程与线程
学习浏览器原理后很多问题都得到了解释,比如拦截301、302请求码?能拦截吗?确定吗?还有很多开发技巧、调试技巧、奇淫巧技等等;本篇先从线程和进程角度出发简单说一下,为后面做一下铺垫。
# 进程与线程
问:进程与线程是什么关系?
工厂:假设CPU是一个工厂,由于电力有限,工厂内一个车间工作其他车间必须停工,那么进程就好比工厂内的车间(车间可以理解为CPU所能处理的单个任务)。
车间:一个车间会有很多工人,他们协同完成一个任务,那么线程就好比工人,一个进程(车间)会有多个线程(工人)。
空间:车间的空间是工人们共享的,那也就是说每个线程都可以使用进程的内存空间。可是,每间房间的大小不同,有些房间最多只能容纳一个人,比如厕所。里面有人的时候,其他人就不能进去了。这代表一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。
阮一峰老师的博客 (opens new window)
# 浏览器线程
问:浏览器是单线程?多线程?单进程?多进程?
早期浏览器如IE6时代,使用的是单线程、单进程;所有工作都在一个进程中执行,如 页面渲染、插件等等,这导致了许多性能及安全问题;
问:单进程出现了什么问题?
回顾早期浏览器不难发现早期ie是单标签【每个页面一个窗口】,且所有页面都依赖于一个线程。而当时国内浏览器厂商则开始开发多标签浏览器,导致一个tab崩溃会形象整个浏览器。多个页面依赖一个线程导致了卡顿崩溃的问题(共用同一个js运行环境),后来则转到了多线程,让不同页面运行在多个单独线程下,但同时也出现了通讯问题,一个session运行在一个线程下,导致了同源页面无法访问session;
# 转折
而后谷歌推出chrome,现代chrome为多线程+多进程,每个进程分管不同任务,简单概括如下
- 渲染进程: 负责html、js、css转换为用户交互的网页,排版引擎及V8引擎运行在该进程下;【默认情况下会为每一个Tab页面创建一个渲染引擎】
- 插件进程: 负责插件运行,因为早期ie可以安装很多插件,正式因为这些插件导致许多安全问题(直接访问系统)及性能问题(内存泄漏等);chrome则单独将插件运行环境进行隔离,即使该进程崩溃也不会影响其他进程及线程
- GPU进程:早期并没有GPU进程,后来为了CSS3D渲染增加了该进程;而现在的的ui及页面也都使用GPU进程进行绘制;
- 网络进程:顾名思义负责网络资源加载
- 主进程: chrome主进程,用于界面显示(其实chrome显示的是图片),用户交互,子进程管理,存储等
# 页面崩溃
问:既然是多进程架构 为何会遇到一个页面崩溃导致所有页面崩溃
同源机制 process-per-site-instance,当域名相同时,chrome会直接复制父页面的渲染进程;总结一下就是同一站点会被分配到一个渲染进程里去,这样的话同站点就会共享javascript执行环境,由于使用同一个环境一旦一个页面崩溃则所有页面崩溃。