进程与线程

进程与线程

一、概念


  • 进程是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引擎线程执行。