跳到主要内容

进程与线程

进程

  • 浏览器进程:主要负责界面显示、用户交互、子进程管理,同时提供存储等功能。 主要负责协调、主控。它控制应用中的包括地址栏,书签,回退与前进按钮等这些用户操作部分以及处理 web 浏览器不可见的特权部分,如网络请求与文件访问;负责各个标签页的管理,创建和销毁其他进程,并将浏览器渲染进程得到的结果绘制到用户界面上。

  • 渲染进程:核心任务是将 HTML、CSS 和 JavaScript 转换为用户可以与之交互的网页,排版引擎 Blink 和 JavaScript 引擎 V8 都是运行在该进程中,默认情况下,Chrome 会为每个 Tab 标签创建一个渲染进程。出于安全考虑,渲染进程都是运行在沙箱模式下。(V8 运行在渲染进程) 默认情况下,我们在浏览器中新打开一个标签页,就会创建一个渲染进程,就是说每一个标签页都会有一个独立的渲染进程,当然也不是绝对的,浏览器有时会将多个进程合并,比如打开多个空白标签页后,会发现多个空白标签页被合并成一个进程。这些进程间互不影响,主要负责各自标签页的页面渲染、脚本执行、事件处理等。

  • GPU 进程:其实, GPU 的使用初衷是为了实现 3D CSS 的效果,只是随后网页、Chrome 的 UI 界面都选择采用 GPU 来绘制,这使得 GPU 成为浏览器普遍的需求。最后,Chrome 在其多进程架构上也引入了 GPU 进程。

  • 网络进程:主要负责页面的网络资源加载,之前是作为一个模块运行在浏览器进程里面的,直至最近才独立出来,成为一个单独的进程。

  • 插件进程:主要是负责插件的运行,因插件易崩溃,所以需要通过插件进程来隔离,以保证插件进程崩溃不会对浏览器和页面造成影响。 插件进程的作用是控制站点使用的任意插件,如 Flash 等。

所以,打开一个网页,最少需要四个进程:1 个网络进程、1 个浏览器进程、1 个 GPU 进程以及 1 个渲染进程。如果打开的页面有运行插件的话,还需要再加上 1 个插件进程。

线程

浏览器的多线程主要是指浏览器渲染进程是多线程的。渲染进程包含:

  • GUI 渲染线程:负责渲染浏览器界面,解析 HTML、CSS、构建 DOM 树、布局和绘制等。 JS 引擎线程:也称为 JS 内核,负责处理 JavaScript 脚本程序(例如我们熟知的 V8 引擎),它负责解析 JavaScript 脚本,运行代码。
  • 事件触发线程:用来控制事件循环的,当对应的异步事件符合触发条件被触发时,该线程会把事件添加到一个待处理的任务队列的队尾,等待 JS 引擎空闲后执行。
  • 定时器触发线程:是 setInterval 和 setTimeout 所在的线程。浏览器定时计数器并不是由 JS 引擎计数,而是通过定时器触发线程来计时并触发,当计时完毕时,执行事件触发线程,把任务添加到任务队列中,等待 JS 引擎空闲后执行。
  • 异步 http 请求线程:是 XHR 在连接后通过浏览器新开的线程请求,设置有回调函数时,异步线程在检测到状态变更时,执行事件触发线程,把这个回调放到任务队列中,等待 JS 引擎空闲后执行。

https://juejin.cn/post/7002594855436156936