之前被问到,js引擎是单线程的话,那么是如何处理异步的请求的;后来发现自己对浏览器的进程、线程这块,还是没把握住...
所以记录一下补充巩固的内容
浏览器主要分为四大进程:
-
主进程
负责浏览器界面的显示与交互,各个页面的管理,创建和销毁其他进程。
-
第三方插件进程
每种类型的插件对应一个进程,使用当前插件时,才会创建
-
GPU进程
最多只有一个,用于3D绘制
-
渲染进程(我们常关注的一个过程)
浏览器渲染进程也是浏览器内核,内部是多线程的。主要负责页面渲染,脚本执行,事件处理等等
回到最初的那个问题,
Q: 单线程的js如何处理异步请求?
A: 浏览器的渲染进程是多线程的,有js引擎线程,也有专门的异步请求处理线程。
主要分为以下几个线程:
1.JS引擎线程
与GUI互斥;执行JS脚本,任务队列空的时候,才会执行GUI线程
2.GUI(图形用户界面)渲染线程
与JS引擎互斥,其中如果JS脚本执行时间过长的话,会导致页面渲染阻塞,渲染中断
3.HTTP异步处理线程
XMLHttpRequest 连接后,将一些异步回调加入到JS线程的尾部队列中
4.定时器处理线程
将计时(setTimeout、setInterval所在线程)结束的待执行任务加入到JS线程中
5.事件触发线程
用户点击等动作触发的事件方法,会被放到JS队列尾部
相关常见知识点
常见的宏任务:
- setTimeout
- setInterval
- script脚本
- I/O操作
- UI渲染
常见的微任务:
- new promise.then后面的方法体
- mutation observer
网友评论