js运行进制的梳理

参考连接: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的多线程?
 wechat
天生我才必有用