做一个好前端必须要知道的事——浏览器的线程与进程

浏览器是指chrome,没心情关心其他的

进程和线程

直接上总结,想深入理解的可以查阅文末的链接

  • 进程是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体
  • 线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位
  • 一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间),而进程之间相互独立
  • 不同进程之间也可以通信,chrome是通过IPC(Inter-Process Communication),这是Google搭的一套进程间通信的机制

也有一个比喻用来理解他们之间的关系

  • 工厂的资源 => 系统分配的内存(独立的一块内存)
  • 工厂之间的相互独立 => 进程之间相互独立
  • 多个工人协作完成任务 => 多个线程在进程中协作完成任务
  • 工厂内有一个或多个工人 => 一个进程由一个或多个线程组成
  • 工人之间共享空间 => 同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)

浏览器的多进程

浏览器是多进程的,主要有

  • Browser进程:浏览器的主进程(负责协调、主控),只有一个。作用有:

    • 负责浏览器界面显示,与用户交互。如前进,后退等
    • 负责各个页面的管理,创建和销毁其他进程
    • 将Renderer进程得到的内存中的Bitmap,绘制到用户界面上
    • 网络资源的管理,下载等
  • 第三方插件进程:每种类型的插件对应一个进程,仅当使用该插件时才创建
  • GPU进程:最多一个,用于3D绘制等
  • Renderer进程:默认每个Tab页面对应一个进程(具体可以看这里

Renderer进程

该进程(可以理解为一个tab页面实例)的主要线程有

  • GUI渲染线程,负责渲染浏览器界面,解析HTML,CSS,构建DOM树和RenderObject树,布局和绘制等。当界面需要重绘(Repaint)或由于某种操作引发回流(reflow)时,该线程就会执行
  • JS引擎线程,也称为JS内核,负责处理Javascript脚本程序,运行代码。
  • 事件触发线程,归属于浏览器而不是JS引擎,用来控制事件循环(JS引擎是等代码到来,然后执行)
  • 定时触发器线程,传说中的setInterval与setTimeout所在线程,浏览器定时计数器并不是由JavaScript引擎计数的(因为JavaScript引擎是单线程的, 如果处于阻塞线程状态就会影响记计时的准确)
  • 异步http请求线程,在XMLHttpRequest在连接后是通过浏览器新开一个线程请求,将检测到状态变更时,如果设置有回调函数,异步线程就产生状态变更事件,将这个回调再放入事件队列中。再由JavaScript引擎执行。

此文比较羞涩,都是概念总结,但想做一个好前端却也必须要知道,不过也不必太深究😄,由此引出下面的文章可能会更有价值,欢迎关注
下一篇文章讲 做一个好前端必须要知道的事——页面渲染

参考

编程思想之多线程与多进程(1)——以操作系统的角度述说线程与进程
从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章