Skip to content

Latest commit

 

History

History
42 lines (33 loc) · 3.48 KB

浏览器线程线程模型.md

File metadata and controls

42 lines (33 loc) · 3.48 KB

浏览器线程线程模型

进程是 cpu 资源分配的最小单位(是能拥有资源和独立运行的最小单位),线程是 cpu 调度的最小单位(线程是建立在进程的基础上的一次程序运行单位,一个进程中可以有多个线程)

  1. 浏览器是多线程的

    • 浏览器之所以可以运行,是因为系统给他们分配了资源(CPU,内存)
    • 每打开一个 tab 页面,就相当于创建了一个独立的浏览器进程
  2. 浏览器包含哪些进程?

      1. Browser 进程,浏览器主进程,只有一个,作用是:
        1. 负责浏览器界面显示,与用户交互,比如前进后退。
        1. 负责各个页面的管理,创建和销毁其它进程。
        1. 将 renderer 进程得到的内存中的 Bitmap 绘制到用户界面上。
        1. 网络资源的管理下载等。
      1. 第三方插件进程:每种类型的插件对应一个进程,仅当使用插件时才创建
      1. GPU 进程,最多一个,用于3D绘制
      1. 浏览器渲染进程(浏览器内核)(renderer进程,内部是多线程的):默认每个 tab 页一个进程,互不影响,主要用来页面渲染,脚本执行,事件处理等。
  3. 浏览器多进程的优势?

      1. 避免单个 page crash ((计算机)瘫痪,死机) 影响整个浏览器
      1. 避免第三方插件 crash 影响整个浏览器
      1. 多线程充分利用多核优势
      1. 有利于提高浏览器的稳定性

就是如果浏览器是单线程,某个 tab 页面崩了,就影响了整个浏览器,插件崩了也会影响整个浏览器。

浏览器内核(渲染过程)

浏览器的渲染进程是多线程的,它包含:

  1. GUI 渲染进程: 负责渲染浏览器界面,解析 HTML, CSS, 构建 DOM 树 和 RenderObject 树,布局和绘制等,当页面需要重绘 或者 回流时,该线程就会 执行, 它与JS线程是互斥的,当js引擎执行时GUI线程就会被挂起(冻结), GUI更新会被保存再一个队列中,等到js引擎空闲时被立即执行
  2. JS引擎线程:负责解析js脚本,运行代码,一直等待任务队列中任务到来,然后加以处理,一个tab页无论什么时候都有一个js线程在运行js程序,(?) 因为JS线程和GUI线程是互斥的,如果js执行时间过长,就会造成页面渲染不连贯,导致页面渲染加载阻塞
  3. 事件触发线程:归属浏览器而不是JS引擎,用来控制事件循环,当JS引擎执行代码块如setTimeOut时,或者鼠标点击事件,ajax异步请求等, 都会将对应的任务添加到事件线程里面,当对应的事件符合触发条件被触发时,该线程会把事件添加到待处理队列的队尾,等待js引擎的处理。由于js是单线程,所以这些待处理队列中的事件都得排队等待JS引擎处理
  4. 定时触发线程:传说中的setInterval与setTimeout所在线程,浏览器的定时计数器不是通过js引擎计数的,因为js是单线程,如果处于阻塞线程状态就会影响计时器的准确。 因此通过单独的线程来计时并触发定时(计时完毕后,添加到事件队列中,等待JS空闲后执行)
  5. 异步http请求线程:在XMLHttpRequest连接后通过浏览器新开的线程请求, 将检测到状态变更时,如果设置的有回调函数,异步线程就会产生状态变更事件,将这个回调再放入事件队列中,再由JavaScript引擎执行

https://github.com/webVueBlog/Leetcode