浏览器的进程和线程
浏览器的进程和线程
前言
??要理解浏览器的进程和线程,首先需要理解一句话:进程是CPU分配资源的最小单位,线程是CPU调度的最小单位。
??应用程序在运行时,CPU会分配一块可独立运行的内存,即进程,他是应用程序运行的载体。进程一般由程序,数据集合和进程控制块三部分组成。程序用于描述进程要完成的功能,是控制进程执行的指令集;数据集合是程序在执行时所需要的数据和工作区;程序控制块包含进程的描述信息和控制信息,是进程存在的唯一标志;
??线程是一种比进程还小的抽象,在早期的操作系统中并没有线程的概念,进程是能拥有资源和独立运行的最小单位,也是程序执行的最小单位,他相当于一个进程只有一个线程,进程本身就是线程。所以线程有时被称为轻量级进程。
??后来,随着计算机的发展,对多个任务之间上下文切换的效率要求越来越高,就抽象出一个更小的概念--线程,一般一个进程会有多个线程。线程的特点是:线程廉价,线程之间切换的花销较小,启动和退出较快,对系统资源的冲击也比较小。
文章图片
文章图片
对于进程和线程有一个通俗的比喻:进程就像一个工厂,线程就像工厂中的员工,工厂与工厂之间相互独立,工厂中的员工相互协作完成任务,每个工厂至少都有一个员工,员工之间共享工厂的空间。
这段话对应的是:
- 工厂=进程=cpu分配的一块可独立运行的内存;
- 进程与进程之间相互独立;
- 进程中至少有一个线程;
- 进程中的所有线程共享同一空间;
- 进程中的线程相互协作;
- Browser进程,是浏览器的主进程,负责协调,主控,只有一个进程,浏览器打开时会创建这个进程;
作用:
(1)负责浏览器页面呈现(放大,缩小,关闭等),与用户交互,如前进后退;
(2)管理各个页面,负责创建,销毁其他进程。(如tab页的新建与关闭);
(3)网络资源的管理,下载等。 - 第三方插件进程:每种类型的插件只有一个进程,只有当插件运行时才会创建;
- GPU进程:最多创建一个,用于3D绘制;
- 浏览器渲染进程(Renderer进程),内部是多线程的,也是每个标签页所拥有的进程,互不影响,负责页面渲染,js执行,事件处理等。
每打开一个tab页都会创建一个Renderer进程,一般几个空tab页会合并成一个Renderer进程以节省资源。Renderer是多线程的,接下来学习下各个线程在页面中的作用。
- 图形用户界面GUI渲染线程
· 负责构建HTML,css,构建Dom树,Renderer树,布局与绘制等。
· 当界面需要重绘(repaint)或由于某种操作引发回流(reflow)时,该线程就会执行; - JS引擎线程
· JS内核,也称js引擎(比如Chrome的V8引擎),负责处理执行js脚本。
??· 等待任务队列任务的到来,然后加以处理,浏览器渲染进程无论什么时候都只有一个js引擎在运行js; - 事件触发线程
· 当js引擎执行代码块,如setTimeout时(也可以来自其他线程,如鼠标点击,ajax异步请求等),会将对应任务添加到事件线程中;
· 当对应的事件符合触发条件被触发时,该线程会把事件添加到待处理队列的队尾,等待js引擎的处理;
注: 所有在处理队列的任务都要等待JS引擎空闲时才会执行。 - 定时器触发线程
· setTimeout和setInterval所在的线程;
· 定时任务不是在js引擎线程中进行的(会阻塞js的执行),而是另外开一线程进行计时。
· 及时完成时,即符合事件触发条件,后事件触发线程会把事件添加到大爱处理队列的队尾(定时器最小时间间隔为4ms). - 异步http请求线程
· 在XMLHttpRequest连接后,通过浏览器开一个线程请求;
· 当检测到状态变更时,如果设置回调函数,异步线程就会产生状态变更事件,将这个事件推入到事件队列的队尾。
GUI线程负责将DOM渲染到页面上,JS引擎线程涉及到DOM的一些增删改的操作。如果两个线程同时运行,GUI线程渲染DOM的同时,进行一些增删改的操作,必将造成冲突(渲染结果与DOM操作结果不一致)。因此,这两个线程设计为互斥的关系。当GUI线程运行时,JS引擎线程处于冻结状态,同理,JS引擎线程运行时,GUI线程处于冻结状态。
注: 当JS执行较长时间时,页面就会出现卡顿现象,所以要尽量避免长时间执行的代码。
推荐阅读
- MySQL的四种事务隔离级别
- 新手安装Liunx出现的一些问题
- 可不要忽视了TypeScript中函数和类的重要性
- Vue项目
- 全链路压测(5)(生产全链路压测实施全流程)
- 【包真】我的第一次webpack优化,首屏渲染从9s到1s
- 生成式预训练语言模型能否视作闭卷问答的知识库()
- pygame|Maze_AI: 一款基于 Python + Pygame + AI 算法的迷宫小游戏
- 程序员|[Python-Pygame]无中生有开发自己的2D动作游戏生成敌人
- 技术分享|2022年,一款比Postman还要好用的接口工具