代码已经关联到github: 链接地址 文章有更新也会优先在这,觉得不错可以顺手点个star,这里会持续分享自己的开发经验(:
什么是进程与线程
进程=火车,线程=车厢,一个进程由一个或多个线程组成。
要想了解进程与线程的话,需要先了解 并行处理
,并行处理是程序在同一时间处理多个任务,处理一个就是 单线程
,处理多个就是 多线程
。
而进程则是用来启动和管理线程。
- 线程在进程下行进,一个进程可以包含多个线程(一辆火车可以有多个车厢)
- 进程间不会相互影响,进程中的任意一线程执行出错,都会导致整个进程的崩溃。(一列火车不会影响到另外一列火车,但是如果一列火车上中间的一节车厢着火了,将影响到所有车厢)
- 线程之间共享进程中的数据。(A车厢换到B车厢很容易)
- 不同进程间数据很难共享。(A火车和B火车不能随意换乘,除非到了站点)
- 当一个进程关闭之后,操作系统会回收进程所占用的内存
单进程浏览器
早期的浏览器(比如早期的火狐),所有的模块都运行再同一个进程里的就是单线程浏览器。这会带来一些问题,比如:
- 稳定性:当一个网页崩溃的时候,整个浏览器也会崩溃掉。
- 流畅性:当一个网页渲染较慢时,也会拖慢其他网页。
- 安全性:插件可以获取到系统资源;页面脚本可以通过浏览器漏洞获取系统资源。
多进程浏览器
1. 早期多进程(2008年Chrome 发布时的进程架构)
将之前单线程优化成 浏览器主进程
、 插件进程
和 渲染进程
(同一个浏览上下文组内的同一站点会共用一个渲染进程,否则是另启动一个渲染进程),这样做的好处:
- 稳定性:进程相互隔离,一个页签崩溃不会影响其他的页签(除非二者是同一渲染进程)
- 流畅性:不同网页进程不同,一个页签渲染较慢不会影响其他页签的渲染
- 安全性:插件进程和渲染进程放在沙箱里面,这样即使在渲染进程或者插件进程里面执行了恶意程序,恶意程序也无法突破沙箱去获取系统权限。
2. 目前多进程( Chrome )
最新的 Chrome 浏览器包括:1 个 浏览器(Browser)主进程
、1 个 GPU 进程
、1 个 网络(NetWork)进程
、多个 渲染进程
和多个 插件进程
。
浏览器主进程
主要负责界面显示、用户交互、子进程管理,同时提供存储等功能。GPU进程
3D绘制、加速渲染等网络进程
网络资源加载渲染进程
核心任务是将 HTML、CSS 和 JavaScript 转换为用户可以与之交互的网页,排版引擎 Blink 和 JavaScript 引擎 V8 都是运行在该进程中,一般情况下,Chrome 会为每个 Tab 标签创建一个渲染进程。出于安全考虑,渲染进程都是运行在沙箱模式下。GUI线程
:HTML、CSS的解析以及网页渲染,与JS线程互斥JS线程
:负责解析运行JS,一个渲染进程中只有一个,是单进程。与GUI渲染线程互斥事件触发线程
:也就是JS的事件池,用来管理一个JS引擎线程内的事件执行,将所有待处理事件添加到待处理队列的队尾。定时触发器线程
:由于JS引擎是单线程,所以setInterval 与 setTimeout 需要单独的进程,计时完毕会将事件放到待处理的队列队尾(这一步也导致了两个事件的执行时间可能不是设置好的时间)。异步http请求线程
:XMLHttpRequest在连接后是通过浏览器新开一个线程请求,将检测到状态变更时,如果设置有回调函数,异步线程就产生状态变更事件,将这个回调再放入事件队列中。
插件进程
插件运行的进程,多个插件会启用多个。
3. 多进程浏览器的缺点
- 多进程带来的高系统资源占用率
- 浏览器各模块之间耦合性高、扩展性差等问题。
未来浏览器展望
2016 年,Chrome 官方团队使用“面向服务的架构”(Services Oriented Architecture,简称 SOA)的思想设计了新的 Chrome 架构。原来的各种模块会被重构成独立的服务(Service),每个服务(Service)都可以在独立的进程中运行,这样做的好处是降低耦合性,不像之前的多进程,可能很多进程之间的服务不能通用,同时降低系统资源占用率。