webkit多线程

浏览器多线程

在《webkit技术内幕》中提到,在Chrome中,浏览器是多进程架构。那么在Firefox、IE中是否采用的多进程架构呢。webkit里面的代码都是开源的,但是Firefox、IE这先代码都不是,所以以下说的浏览器都指的是webkit。

为什么webkit是多线程架构

在IE6的时候,IE6是一个多线程的架构。如果大家还有印象的话,我们在IE6进行前端调试的时候,往往会遇到浏览器卡住、崩溃的现象。这时候你可能打开的多个Tab标签页,假如你把当前Tab关闭是不行的,你需要把整个浏览器强制关闭才行。在我们的现代浏览器里面,假设在Chrome中,循环打印一个字符,打印上千万次,那么当前的tab是会卡住,并且在控制台不断输出字符,可我们还是可以切换至其它的标签页,甚至我们可以在Chrome的进程管理中,强制关闭当前Tab标签页。
进程管理
虽然多线程在架构设计上确实会新增了复杂度,多线程不仅仅解决了上面所说的场景,但是也带了三点好处:

  1. 避免某一个Tab崩溃影响到其它Tab页面以及整个浏览器的运行
  2. 第三方插件崩溃的时候不会影响到浏览器的稳定性
  3. 方便了安全模型的实施,也就是说沙箱模型是基于多进程(这块不理解,安全模型指的是不是浏览器的安全机制)

webkit主要进程工作职责

上面说了webkit是一个开源的浏览器内核,所以有很多浏览器厂商都根据webkit实现了他们自己的浏览器功能。但绝大多数的浏览器线程主要是下面进程类型:

  • Browser进程
  • Renderer进程
  • Plugin进程
  • GPU进程
Browser进程

浏览器的主线程,负责浏览器界面显示、各个页面的管理,在浏览器中有且只有一个Browser进程。

Browser进程

Renderer进程

网页的渲染进程,负责网页的渲染工作,如某一个Tab就是一个Renderer进程。Renderer,但是并不是说打开N个Tab就是N条Renderer进程。原因是,在Chromium(webkit指的是Chromium)中,Renderer进程的创建方式可以被配置:

  • Process-per-site-instance:一个页面就是一个进程。N个页面 = N个Renderer进程,好处相互不影响,坏处就是资源浪费。
  • Process-per-site:同一个域共享同一个Renderer进程。N个页面 < N个进程
  • Process-per-tab:一个Tab就是一个Renderer进程。N个页面 = N个Renderer。(这个和Process-per-site-instance是一样么?一个page instace和一个tab在浏览器中不是一个道理么?)
  • Single Process:没有多进程,所有的渲染都在Browser进程上面。
Plugin进程

负责控制网页的插件进程。Plugin进程有两种

  1. NAAPI插件进程,为NAAPI类型的插件创建进程,基本原则是每种类型的插件只会被创建一次,且在使用时才会被创建。假如有多个网页使用该插件,那么该插件只创建一个进程,其它网页共享该进程
  2. Pepper进程:和NAAPI一样,只是为Pepper创建的进程
GPU进程

最多只有一个,切当GPU硬件加速打开的时候才会被创建,主要用于对3D图形加速调用实现。

进程中的多线程模型

在进程中,每个进程都会有线程,不同的线程处理不同的任务。
在浏览器中,我们在做文件操作、点击、发送请求、socket等等行为操作的时候,如果等待浏览器响应完这些事件后才能去做其它事情的话,那么我们的操作就会被阻塞。在硬件愈来愈发达的今天,我们的电脑拥有多核计算能力,所以在浏览器中,我们采用多核优势,在不同阶段处理各个阶段的事件。

进程中的多线程模型

多进程通信(IPC, Inter-Process Communication

多进程通信是在不同进程中传播或者交换信息。进程之间有以下几种方式进行传播信息或者交换信息:

  • 信号,异步通信,用来提醒某一个进程一个事件已经发生。
  • Socket,基于TCP/IP协议
  • 消息队列,进程通信,或者同一进程,不同线程之间的通信。它是一个异步通信,需要轮询的方式去获取最新的消息。
  • 管道,将一个进程的输出当作另一个进程的输入。在Linux中,以管道符 | 。例如在shell中输入
    pwd | \
    j f

获取当前的路径,跳转autojump到f路径

  • 命名管道,FIFO。是传统管道的升级版,它是先进先出的模式。具体可以查看维基百科
  • 信号量,是一个同步对象。在Linux中,二进制的信号量其实是一个互斥锁。
  • 共享内存

在Chromium中,使用的是FIFO(命名管道)是一个异步通信。因为在浏览器中,文件操作、I/O线程、资源加载等等。这些操作不能Block用户的行为。并且在命名通道是一个长期存在的通道。进程间通信

总结

在webkit浏览器中,采用的是多进程的架构,它们之间的消息通信则是使用的FIFO(异步命名管道)。

参考资料

webkit技术内幕

图解浏览器的基本工作原理

浏览器的工作原理:新式网络浏览器幕后揭秘

进程间通信

文章作者: 韦宗圻
文章链接: https://www.weizongqi.com/2018/06/16/浏览器多线程/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 wiki
支付宝打赏
微信打赏