浏览器端线程进程梳理

Posted by Asser's Blog on August 30, 2018

CPU

计算机的核心部分,负责计算机的计算任务。可看做是一个工厂。 ### 进程
    学术上:进程是一个具有一定独立功能
    的程序在一个数据集上的一次动态执行,
是操作系统进行资源分配和调度的独立单元(拥有独立的内存空间),
是应用程序的载体。
   任一时刻,CPU总运行一个进程,其他进程处于非运行状态。
   可以看做是工厂中的一个车间。  ### 线程
    由于进程切换时开销较大,所以发明了线程。
线程是程序执行流的最小单元。可以看做车间里面的工人  ### 进程和线程的区别
1. 进程是操作系统资源分配的最小单位,线程是程序执行的最小单位
2. 一个进程由一个或多个线程组成
3. 进程之间相互独立,同一进程下的不同线程共享内存空间
(代码段,数据集,堆等)以及进程级的资源,如打开文件和信号  ### 多进程和多线程
多进程:同时(相对的同一时间)运行几个不同的程序,
比如一边听歌一边用ide敲代码,这两个进程互不影响
多线程:一个程序中有多个执行流,类似于车间中的不同工人负责
自己手里的工作  ### chrome架构
chrome属于多进程浏览器,每个tab是一个进程。其中每个进程中又
拥有多个线程。
1. GUI渲染线程
2. JavaScript引擎线程
3. 定时器触发线程
4. 事件触发线程
5. 异步http请求线程  ### GUI线程
负责渲染页面html,当页面需要重绘(repaint)或者由于某种操作
触发回流(reflow)时,该线程就会执行。在JavaScript引擎线程执行
期间,GUI线程处于挂起状态(所以说JavaScript引擎线程和GUI线程处于
互斥关系,这也是js阻塞页面加载的原因)  ### JavaScript引擎线程
也成js内核,负责处理js脚本,如V8引擎  ### 定时器触发线程
定时器由专门的线程。由于js是单线程,线程
阻塞就会导致定时器不准确,故使用单独线程
进行计时  ### 事件触发线程
当一个事件触发时,该线程会将对应的回调事件
添加到任务队列尾部,包括但不仅限于定时任务,点击事件等  ### 异步http请求线程
在XMLHttpRequest在连接后,通过浏览器新
开一个线程请求,(个人的理解是同时发起
n个ajax请求,即新开的n个异步线程)  ### js多线程
为了更好的利用多核CPU的能力,Html5中提出
web worker标准,允许js创建子线程来处理数
据。但是子线程完全受主线程控制,并且没有操作
DOM的能力。所以js本质上还是属于单线程。  ### 常见误区
1. 浏览器tab并不是单线程的,只是js引擎是单线程。
同理,node也是,node并不是单线程,只是
node中的js引擎为单线程 
2. 异步函数的调用不光光只包括异步任务的执行,还包括异步任务完成后对
主线程的通知,主线程调用回调函数等很多步骤。