浏览器的进程与线程

什么是进程

操作系统上有很多 app,app 就是应用程序,应用程序就是一个软件包,一个代码集合。而应用程序是静态的,想要运行应用程序,操作系统就会对应的启动一个进程,负责该程序的运行。

把浏览器看做一个大集团,那进程就是集团下的某一个工厂。

总结进程有以下特点:

  • 动态性:进程的实质是程序的一次执行过程
  • 并发性:集团可以有多个工厂,浏览器也可以同时运行多个进程
  • 独立性:工厂是独立的,进程是一个能独立运行的基本单位
  • 异步性:因为是独立的,因此可以按照自己逻辑不可预知的运行
  • 协同性:应用程序之间能够协作完成一些任务

浏览器进程

与操作系统一样,浏览器也有一个任务管理器,每一个任务,都是独立的进程。
pic.1708326642981

浏览器主要包括如下进程:

一、浏览器主进程

浏览器只会创建一个主进程,它主要负责:

  • 浏览器界面提供的交互,如前进、后退、标签栏、设置等
  • 各页面进程的管理,如创建、关闭等
  • 网络资源的管理,如下载内容、缓存等

二、网页进程

网页进程:浏览器网页的渲染和 JS 执行在一个单独的进程中执行。这个进程也称为render 进程。每启动一个页面,都会启动一个 render 进程。

说到网页进程,又引入了线程的概念。

如果说进程是一个工厂,那线程就是工厂中的流水线。一个工厂的正常运行,往往需要多个流水线通力合作才能完成。在网页进程中也是一样,想要网页进程能正常渲染运行,也需要多个线程参与合作。

网页的渲染运行,有如下线程参

GUI 渲染线程

GUI(Graphical User Interface)表示图形用户界面的意思,render tree 的渲染。用一张图看一下渲染路径
pic.1708326653199
HTML 会解析出 DOM(Document Object Model)树,样式文件会解析出 CSSOM(CSS Object Model)树,在 Attachment 环节,GUI 线程将 DOM 树与 CSSOM 树合并在一起,生成渲染树(render tree),并将渲染树绘制到页面。

JS 引擎线程

浏览器是不支持直接运行 JS 代码的,所以需要在浏览器中植入一个内核,来支持 JS 的解析和运行。在 chrome 中,这个内核叫 V8。

一个网页只会启动一个 JS 线程来处理 JS 脚本。

JS 线程是单线程。这点不难理解,如果是多线程,一个线程删除 DOM,一个线程新增 DOM,浏览器要如何处理呢?

还有一点,JS 线程和 GUI 线程是互斥的。所以在渲染路径阶段,存在阻塞问题。

定时触发器线程

专门负责 setTimeout/setInterval 的逻辑。应该结合事件循环中的队列来理解定时器线程的执行过程。

事件触发线程

当我们鼠标点击与滑动、键盘的输入等都会触发一些事件,而这些事件的触发逻辑的处理,就是依靠事件触发线程来帮助浏览器完成。

该线程也会把事件的逻辑放入队列中,等待 JS 引擎的处理。在事件循环中,事件触发为宏任务。

http 线程

使用无状态短链接的 http 请求,在应用层基于 http 协议的基础之上,达到与服务端进行通信的目的。

该线程的触发罗家,不是在 JS 引擎线程之中,过程是异步的。

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×