参考连接:https://mp.weixin.qq.com/s/0tLxTybwJ7NCLBPtQClXoA
js运行进制的梳理
进程与线程
- 两者区别
- 简单来讲,能看到的就是进程,例如:资源管理器中的进程列表;看不到的就是线程;
- 进程是cpu资源分配的最小单元(系统会给他分配资源,能拥有资源和独立运行的最小单位);
- 线程是cpu调度的最小单位(线程是建立在进程的基础上的一次程序运行单位);
浏览器是多线程的,它包括哪些进程
- Browser线程:浏览器的主线程,只有一个
- 第三方的插件进程:每个类型的插件对应一个进程,使用时才会创建
- GPU进程(最多一个,用于3D绘制等)
- 浏览器渲染进程(浏览器内核) Renderer进程,每个tab页面一个进程:用于页面渲染、脚本执行、事件处理
为什么浏览器是多线程的
如果是单线程的,某个tab页面崩溃或者插件崩溃,就会影响到整个的浏览器
浏览器内核(渲染进程)多线程的
- GUI渲染线程(渲染页面,解析html、css)
- js引擎线程(js内核,处理js脚本程序,一个tab页面只有一个js线程来运行js程序)
- GUI渲染线程和js线程是互斥的
- 事件触发归属于浏览器,用于控制事件循环;js是单线程,事件队列中的任务都是排队等待js引擎处理
- 定时触发器线程
- 异步http请求线程
Browser进程和浏览器内核(Renderer进程)的通信过程
- B进程收到用户请求,需要获取页面内容,随后将该任务通过RendererHost接口传递给Renderer进程;
Renderer接口收到信息后,交给渲染线程(加载网页开始渲染网页,可能会使用到Brwerer进程获取资源或者GPU进程来帮助渲染-可能会有js线程操作DOM-最后Renderer进程将结果传递给Browser进程),Browser进程收到结果并绘制出来
浏览器内核线程之间的关系
- GUI渲染线程和js引擎线程互斥
- js是可以操作DOM的,如果在修改这个元素属性的同时渲染界面,那渲染线程前后获取的元素数据就不一样了;
- js阻塞页面加载
- 避免js执行实践过长,这样会造成页面的渲染不连贯,导致渲染加载阻塞,用户体验不佳
- WebWorker,js的多线程?