浏览器多进程

一、从大的方面来说,浏览器是一个多进程架构。
二、它可以是一个进程包含多个线程,也可以是多个进程中,每个进程有多个线程,线程之间通过IPC通讯。每个浏览器有不同的实现细节,并没有标准规定浏览器必须如何去实现。

【示例】chrome架构
1、下面这张图是目前chrome的多进程架构图。 浏览器进程、线程 - 图1(图片引自Mariko Kosaka的《Inside look at modern web browser》)
2、我们来看看这些进程分别对应浏览器窗口中的哪一部分: 浏览器进程、线程 - 图2(图片引自Mariko Kosaka的《Inside look at modern web browser》)
浏览器进程、线程 - 图3
3、那么,怎么看浏览器对应启动了什么进程呢? chrome中,我们可以通过更多->More Tools->Task Manager看到启动的进程。
image.png

三、从chrome官网和源码,我们也可以得知,多进程架构中包含这些进程:
浏览器多进程-detail

浏览器多进程查看

一、新开一个tab页,会新打开一个进程吗?

  • Browser进程、GPU进程是打开浏览器后,始终只有一个,所以不会新打开
  • 一般会新打开一个Renderer进程,但是不一定会新开
    • 打开浏览器的多个标签页,会有一个主进程以及每个Tab页有一个独立的进程。
    • 但是浏览器也会有自己的优化机制。有时候打开多个tab页后,有些进程会被合并。如打开多个空白标签页后,多个空白页标签会被合并成一个进程。 | 【示例】打开了chrome浏览器的多个标签页,然后可以在chrome的任务管理器中看到有多个进程(分别是每个)Tab页有一个独立的进程,以及一个主进程。如果再多打开一个tab页,进程正常会+1以上。
      image.png | | —- |
【示例】打开多个空白标签页后,多个空白标签页被合并成了一个进程。
可以通过chrome的更多工具-任务管理器验证。
image.png

浏览器多进程的优势

一、相比于单进程浏览器,多进程有如下优点

  • 避免单个page crash影响整个浏览器
  • 避免第三方插件crash影响整个浏览器
  • 多进程充分利用多核优势
  • 方便使用沙盒模型隔离插件等进程,提高浏览器稳定器

Browser进程和浏览器内核(Renderer进程)的通信过程

一、Browser进程和Renderer进程的通信过程

  • Browser进程收到用户请求,首先需要获取页面内容(譬如通过网络下载资源),随后将该任务通过RendererHost接口传递给Renderer进程
  • Renderer进程的Renderer接口收到消息,简单解释后,交给渲染线程,然后开始渲染
    • 渲染线程接收请求,加载网页并渲染网页,这其中可能需要Broswer进程获取资源和需要GPU进程来帮助渲染
    • 当然可能会有JS线程操作DOM(这样可能会造成回流并重绘)
    • 最后Rnederer进程将结果传递给Browser进程
  • Browser进程接收到结果并将结果绘制出来