浏览器原理学习--Chrome架构略谈

“js是一门单线程的语言”。这是初级前端都知道的一个最基本的知识点,虽然看起来平淡无奇的一个知识点,但以此为入口就会学到更多的知识点

首先解释一下为什么js会被设计成单线程:这主要还是由于js是运行的环境和功能所决定的。js是运行在浏览器环境下,给前端用户提供操作页面元素,也就是DOM的一门语言。如果两段js代码同时运行在两个不同的线程上,对DOM做完全相反的操作,那浏览器就不知道该听谁的了,就会让用户很疑惑。为了避免复杂性,就设计成单线程的了。

一个线程可以理解为完成一个逻辑功能的运行实例,把哪一块逻辑分配到一个线程里需要浏览器来计算决定

在chrome浏览器中:

  • 线程是不能单独存在的,它们由进程来启动和管理,一个进程可以有多个线程同时运行
  • 一个进程是一个程序的运行实例,启动一个程序的时候,操作系统会为该程序创建一块内存,用来存放代码、运行中的数据和一个执行任务的主线程,我们把这样的一个运行环境叫进程
  • 线程是依附于进程的,而进程中使用多线程并行处理能提升运算效率

 

可以看到,进程和线程之间是包含、管理关系,除了这个基本的关系外,还有如下关系:

  • 进程中的任意一线程执行出错,都会导致整个进程的崩溃(因为线程之间是有逻辑关联的,比如线程1要用到线程2运算的结果作为入参,多线程并行并不是逻辑业务层面的并行,而是功能上的并行)
  • 线程之间共享进程中的数据
  • 当一个进程关闭之后,操作系统会回收进程所占用的内存
  • 进程之间的内容相互隔离

进程隔离是为保护操作系统中进程互不干扰的技术,为了整个浏览器的安全。每一个进程只能访问自己占有的数据,也就避免出现进程 A 写入数据到进程 B 的情况。正是因为进程之间的数据是严格隔离的,所以一个进程如果崩溃了,或者挂起了,是不会影响到其他进程的。如果进程之间需要进行数据的通信需要使用用于进程间通信(IPC)机制。

打开一个网页时,chrome浏览器一般来说会有以下几个进程:

  1. 浏览器进程:主要负责界面显示、用户交互、子进程管理,同时提供存储等功能
  2. GPU进程:初衷是为了实现 3D CSS 的效果,随着现如今网页的丰富和复杂程度的增加,GPU已经是浏览器的基本需求了
  3. 渲染进程:核心任务是将 HTML、CSS 和 JavaScript 转换为用户可以与之交互的网页,排版引擎 Blink 和 JavaScript 引擎 V8 都是运行在该进程中,默认情况下,Chrome 会为每个 Tab 标签创建一个渲染进程。出于安全考虑,渲染进程都是运行在沙箱模式下(可以把沙箱看成是操作系统给进程上了一把锁,沙箱里面的程序可以运行,但是不能在你的硬盘上写入任何数据,也不能在敏感位置读取任何数据,例如你的文档和桌面。Chrome 把插件进程和渲染进程锁在沙箱里面,这样即使在渲染进程或者插件进程里面执行了恶意程序,恶意程序也无法突破沙箱去获取系统权限)
  4. 插件进程:主要是负责插件的运行,因插件易崩溃,所以需要通过插件进程来隔离,以保证插件进程崩溃不会对浏览器和页面造成影响。也可以防止第三方插件病毒对浏览器的攻击。
  5. 网络进程:主要负责页面的网络资源加载