进程与线程
一、概念
- 进程是CPU资源分配的最小单位,线程是CPU调度的最小单位。
- 可以把进程比作现实中的工厂,每一个工厂就代表一个进程,每个工厂(进程)都有自己的独立资源
- 而线程就好比是工厂中的工人(1:n的关系),一个进程有一个或多个线程组成,线程是一个进程中代码的不同执行路线。
- 进程的内存空间可以被线程共享,就好比工厂里的空间是工人们共享。
二、多进程与多线程
- 多进程:同一个时间同一个计算机系统里,可以允许有两个或两个以上的进程运行,且不会相互干扰,如:可以听歌的同时,打开浏览器浏览网页。谷歌浏览器的每一个tab页就是一个线程
- 多线程:允许单个程序中可以同时运行多个不同的线程来执行不同的任务。可以创建多个并行的线程来完成各自的任务。
经常说的JavaScript是一门单线程语言,指的就是只有一个线程来运行js
三、浏览器内核
浏览器内核是多线程,在内核的控制下各线程相互配合保持同步。通常由以下常驻线程组成。
- GUI渲染线程
- JavaScript引擎线程 (这就是为什么js是一门单线程语言)
- 定时触发线程
- 事件触发线程
- 异步http请求线程
1.GUI渲染线程
- 该线程主要负责渲染UI,解析HTML、CSS、构建DOM树、布局和绘制等。
- 与js引擎线程互斥,当执行js引擎线程时,GUI渲染线程会挂起。任务队列空闲时,待主线程才会继续执行。
2.JavaScript引擎线程
- 该线程主要负责处理javascript脚本,执行代码。
- 该线程与GUI渲染进程互斥,会阻塞GUI渲染线程。这就是为什么在页面中JS的执行会阻塞HTML解析的原因,所以一般会将JS脚本放到页面最下面。
3.定时触发线程
- 执行异步定时器函数的线程,如:setTimeout,setInterval。
- 主线程执行代码时遇到定时器就会把它交给该线程,计时完成后,事件触发线程会将计时完成后的事件加入到任务队列的尾部,等待JS引擎线程执行。
4.事件触发线程
- 负责将准备好的事件交给JS引擎线程执行,将事件依次加入到任务队列的尾部,等待JS引擎线程执行。
5.异步http请求线程
- 负责执行异步请求函数的线程,如:Promise、fetch、ajax等
- 主线程执行代码时遇到异步函数会交个该线程处理,处理完之后由事件触发线程将回调函数加入到任务队列的尾部,等待js引擎线程执行。