Published on

进程和线程: 浏览器中的多进程模式

Authors
  • avatar
    Name
    Joy Peng
    Twitter

多任务操作系统

现代操作系统大多是支持多任务的操作系统,这里的多任务指的是操作系统可以同时运行多个任务,例如我们可以一边用浏览器查资料,一边听音乐,一边打开word写论文。看起来至少有三个任务在同时运行, 还有很多任务再后台同时运行着,例如系统监控、更新、杀毒等,只是在桌面上没有显示。

单核和多核CPU

现在多核CPU已经非常普及,但是单核CPU也可以执行多任务,只是因为CPU执行的速度非常快,所以我们感觉不到。操作系统轮流让各个任务交替执行,这样就造成了多任务的错觉。

真正的并行执行多任务只能在多核CPU上实现,但是由于任务数量远远多于CPU的核心数量,所以,操作系统也会自动把很多任务轮流调度到每个核心上执行。

进程和线程

对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就是启动一个记事本进程。

有些进程还不止同时干一件事,比如Word,它可以同时进行打字、拼写检查、打印等工作。这些进程内的子任务就是线程(Thread)。由于每个进程至少要干一件事,所以一个进程至少有一个线程。

这样我们就很容易理解进程和线程的概念了:进程是任务的总称,线程是任务的执行单元。 如果一个我们要实现一个多任务的程序,我们可以通过多进程模式、多线程模式、多进程+多线程模式来实现。

浏览器中的多进程模式

在浏览器运行过程中,有多个进程在同时运行,这些进程之间是互相独立的,互不干扰。这样做的好处是,当一个页面崩溃了,不会影响到其他页面,当一个进程崩溃了,也不会影响到其他进程。

浏览器的多进程模式主要有以下几个进程:

  • Browser进程:浏览器的主进程,负责协调、主控
  • 第三方插件进程:每种类型的插件对应一个进程,仅当使用该插件时才创建
  • GPU进程:最新的浏览器都会使用GPU来加速绘制,这个进程负责处理GPU任务
  • 浏览器渲染进程(Renderer):负责页面渲染,脚本执行,事件处理等
  • 网络进程:负责网络资源的加载

通信方式

每个进程中又有多个线程,以渲染进程为例,它包含了多个线程,主要有:

  • GUI渲染线程:负责渲染浏览器界面,解析HTML,CSS,构建DOM树和Render树,布局和绘制等
  • JS引擎线程:负责处理JavaScript脚本
  • 事件触发线程:负责事件处理
  • 定时触发器线程:负责定时任务的处理
  • 异步HTTP请求线程:负责处理异步请求

线程间的通信

线程间的通信主要有两种方式:共享内存和消息传递。 以渲染主线程和IO线程为例,渲染主线程负责页面渲染,IO线程负责网络请求,当IO线程获取到网络请求的数据后,需要将数据传递给渲染主线程,这时就需要线程间的通信。 消息队列是一种常用的线程间通信方式,IO线程将数据放入消息队列,渲染主线程从消息队列中取出数据进行处理。如下图所示:

进程间的通信

进程之间也需要通信,以渲染进程、网络进程和浏览器(Browser进程)为例,用户在浏览器中输入一个网址,浏览器进程会通知网络进程去请求数据,网络进程获取到数据后,会将数据传递给渲染进程,渲染进程进行页面渲染。在这种

进程之间的通信主要使用IPC来实现。常见的进程间通信方式有:管道、信号、消息队列、共享内存、Socket等。

  • 管道:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。
  • 信号:信号是一种异步通信方式,用于通知进程发生了某种事件,例如进程终止、中断等。
  • 消息队列:消息队列是一种消息传递机制,进程可以通过消息队列发送消息给其他进程。
  • 共享内存:共享内存是一种共享内存区域,多个进程可以访问同一块内存区域。
  • Socket:Socket是一种网络通信方式,进程可以通过Socket进行网络通信。

参考资料

[1] https://liaoxuefeng.com/books/python/process-thread/ [2] https://time.geekbang.org/column/intro/100033601