睡前小故事——多进程架构与多线程协作

540 阅读4分钟

浏览器的多进程架构与多线程合作

浏览器的多进程架构与多线程协作看似没什么用。但是作为鱼塘第一云中君,能只看到问题表面吗?不能。要深入去理解它,了解浏览器为何要采用多进程架构与多线程协作。

多进程架构

什么是进程?

进程是CPU分配资源的基本单位。意思就是,进程A占用的内存不会和进程B重合。

为什么需要多进程架构?

假设有一天你打开了P站,正在看老师解题到关键部分。页面突然崩溃了。究其原因是你另一个页面打开的B站崩溃了。你说你崩不崩溃?所以,浏览器需要让页面之间不知道其他页面的存在,一个进程崩溃了不会牵连到其他进程。

浏览器都有哪些进程?

这个问题打开任务管理器就明了了。插件有插件进程,下载记录有下载记录进程,历史记录有历史记录进程,GPU进程负责3D绘制和硬件加速,路由,tab页有渲染进程 ......

如果没有多进程会怎么样?

想象一下,你的P站和社交平台共享内存数据。或者B站一崩,P站也跟着崩,浏览器一看,也跟着崩了。

为了保证浏览器数据的安全性、浏览器的健壮性、并且在运行时有更快的响应速度。浏览器的多进程架构应运而生。

安全性:进程间不共享资源,降低恶意修改其他进程数据的可能性。

健壮性:一个进程的崩溃不会关联到其他进程。

响应速度: 进程间相互协作的速度,肯定没有单进程多线程协作快。

多线程协作

什么是渲染进程

上面提到了浏览器的渲染进程,为什么要把它提出来说呢?

  1. 因为这个进程和前端交集比较多
  2. 这个概念容易和(渲染线程)搞混
  3. 渲染进程就是chromium内核,也可以被称为渲染引擎

通过页面内容/信息、CSS、计算和组合最终输出图像结果。

什么是线程?

线程是CPU调度的最小单位。意思就是CPU操作的就是这个玩意。

渲染进程里面都有哪些线程?

  • 渲染线程/GUI渲染线程:

    这个线程负责浏览器渲染路径上的工作,如token html,构建DOM树,生成CSSOM树,合成Render树,布局,绘制。

    这里要注意的一点,CSSOM构建本身和DOM构建是并行的,如果中间插足了JS Core线程,打断了DOM构建,那么CSSOM也会打断JS Core线程先行构建CSSOM。

  • JavaScript引擎线程/JS Core/V8:

    可以看到名号很多啊,其实都是一个东西,负责解析、执行js脚本。JavaScript是单线程,但是它为什么要单线程呢,假设两个线程的js同时对一个DOM元素进行不同操作,那到底怎么处理呢?当然可以处理,但是要引入的概念了,有点得不偿失。所以没必要多线程。

    这里引出一个问题,为什么GUI线程与JS Core线程互斥?

    因为JS有操作DOM的可能,如果并行运行,可能会造成渲染出错误页面的问题,于是在JS Core运行时GUI会被保存在队列中,等JS Core空闲立即执行。

  • 事件触发线程:

    就是管你注册的事件的。因为JavaScript是单线程,所以事件触发之后回调得一个一个排队等JavaScript线程执行,不光是事件,后面提到的定时器回调,异步http请求回调也是放在此队列的。这就是为什么会有事件循环这个东西。

  • 定时器触发线程:

    就是setInterval与setTimeout所在线程,回调也是排队等JavaScript线程执行。因为Js单线程原因,阻塞时会影响计时准确。

  • 异步http请求线程:

    在连接后会新开一个线程,状态变更时,请求的回调函数排队等JavaScript线程执行。

以上线程被称为:常驻线程。其余还有很多其他线程,比如用来和其他进程通信的IO线程、worker线程等等。

多线程协作有哪些优势?

  • 多线程之间共享内存及进程级别资源。
  • 线程切换比进程切换更快。
  • 多个线程互通有无,相互配合

总结

渲染进程中的线程协作既浏览器渲染路径就不在此篇多做赘述了,之后会新开一篇。如果感兴趣请关注我。

看到这里了麻烦点个赞吧,求求了!!!

我是Lew,一个喜欢给你讲故事的人。