浏览器至少有四个进程:
- 浏览器主进程
- GPU进程
- 网络进程
- 渲染进程
其中渲染进程又有五个线程:
-
主线程(js引擎线程)
-
GUI渲染线程
-
事件触发线程
-
定时器触发线程
-
http请求线程
一、主线程
主线程主要用于处理js代码(解析、执行)。只要消息队列不为空,就会一直从中取任务执行。由于主线程和GUI线程的互斥,所以当一个js任务执行过长时,会阻塞页面的渲染,造成页面的卡顿。
二、GUI渲染线程
GUI渲染线程负责解析HTML、CSS、合成CSSOM树、布局树、绘制、分层、栅格化、合成,所以重绘、重排、合成都在改线程中执行。
GUI线程和JS引擎线程是冲突的,当GUI线程执行时,js引擎线程会被挂起,当js引擎线程执行任务时,有需要GUI线程执行的任务,会被保存到一个队列中,等待js引擎执行完执行。
三、事件触发线程
当js代码在解析时,遇到事件比如鼠标事件时,会将这些任务添加到事件触发线程中,等事件触发时,会将任务从事件触发线程中取出,放到消息队列的队尾等待执行。
四、定时器触发线程
用于存放setTimeout、setInterval等任务,在解析遇到这些任务时,js引擎会将这些任务放到定时器触发线程中,并开始计数,时间到了之后,将任务放到消息队列中等待执行。
五、http请求线程
用于检测XMLHttpRequest请求,当请求状态改变时,将设置的回调函数添加到消息队列中等待执行。