Chrome 中的进程架构

1,596 阅读3分钟

What is 进程 & 线程?

进程:一个程序的运行实例,操作系统会为其分配一块内存,用来存放代码、运行中的数据与执行任务的主线程;
线程:负责执行进程中的具体任务;

单线程与多线程

多线程可以实现并行,提高任务执行效率;
线程越多越好吗?
No,CPU 资源是有限的,当线程过多时,会导致 CPU 切换频繁,对性能有不少损耗。

进程与线程的特点

  • 进程中任意线程出错,都会导致进程崩溃
  • 线程之间可以共享进程中的数据
  • 一个进程关闭后,操作系统会回收其内存
  • 进程之间内容相互隔离,避免互相影响

浏览器的演进过程

IE6 时代,一个浏览器开启的多个 tab 页都存在于一个进程下面,会导致以下问题:

  • 一个 tab 页崩溃会导致整个进程(浏览器)崩溃
  • 各个页面的数据都可以共享

Chrome 采用多进程架构来避免上述问题。

  • 每个 tab 页都相当于一个进程,一个崩溃不影响其他
  • 每个进程都放在一个沙箱里,禁止读取硬盘上数据,即使进程里有恶意程序,也无法突破沙箱

最新 Chrome 包括的进程

  • 浏览器进程:负责界面显示、用户交互、子进程管理等功能
  • 渲染进程:负责解析 html,css,js;排版引擎 Blink 与 JS 的 V8 引擎都在该进程中;运行在沙箱模式下
  • GPU 进程:负责绘制 repaint 后的 UI 界面
  • 网络进程:负责页面网络资源加载
  • 插件进程:负责插件的运行,插件易崩溃,所以隔离出来

Chrome 中的任务管理器

由下图可以看出 Chrome 中包含的进程,相同域名的页面放在了同一进程下; 只要打开 Chrome,不管你用不用插件,他都会将每个插件当作一个进程加载;(终于知道为啥以前的 4G 内存的电脑开个浏览器都那么卡,原来是这么多插件在背后偷偷加载了)

浏览器里 UA 的作用

UA 是浏览器的身份证,会附带在 HTTP 请求的 user-agent 中,服务器根据不同的 UA 返回不同的页面内容,比如:手机和 PC 会返回不同的样式。

// 手机
"Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"
// PC
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"

服务器会根据不同的 UA 来设计不同的页面;每一款新的浏览器如果使用自己独一无二的 UA,那么之前很多服务器要针对他做适配,这显然是不可能的。所以 Chrome 会使用 Mozilla,AppleWebkit 等关键字段表示同时支持这两个,然后再最后加上自己的表示 Chrome/xxx

Chrome 过去与现在架构对比

  • before
  • after