浏览器中的线程

1 进程与线程的区别

进程是操作系统分配资源的最小单位, 线程是程序执行的最小单位

一个进程由一个或多个线程组成, 线程是一个进程中代码的不同执行路线

进程之间相互独立, 但同一进程下的各个线程之间共享程序的内存空间(包括代码段,数据集, 堆等)以及一些进程

级的资源(如打开文件和信号)

调度和切换:线程上下文切换比进程上下文切换要快得多

2 多进程与多线程

多进程: 指在同一时间内, 同一个计算机系统中如果允许两个或两个以上的进程处于运行状态

eg: 在听歌的同时, 打开编辑器写代码, 这两个进程之间不会相互干扰

多线程: 程序中包含多个执行流, 在一个程序中可以同时运行多个不同的线程执行不同的任务,

允许单个程序创建多个并行执行的线程完成各自的任务

3 浏览器多进程架构

chrome多进程架构的原因: 如果一个进程处理多个网页, 面临健壮性, 响应速度, 安全性

一个tab网页崩溃会导致其他网页崩溃,进程之间是不共享资源和地址空间的, 不会存在太多的

安全问题, 由于多个线程共享资源,会存在线程之间可能会恶意修改 或获取非授权数据

4 浏览器内核

通过取得页面内容, 整理信息(应用CSS),计算 和 组合最终输出可视化的图像的结果

chrome浏览器为每个tab页面单独启用进程, 因此每个tab网页都有独立的渲染引擎实例

5 js 是单线程的原因

如果js是多线程 就会遇到同一个DOM元素, 一个线程负责修改, 一个线程负责删除, 这时候需要浏览器来裁决哪个线程的执行结果生效,为了避免加锁造成更多的复杂性, js选择了单线程。

6 浏览器常驻线程

GUI渲染线程

js引擎线程

定时触发器线程

事件触发线程

异步http请求线程

a: GUI渲染线程

负责渲染浏览器界面的HTML元素, 当界面需要重绘或由于某种操作引发回流(reflow),该线程就会执行, 当js 引擎执行脚本期间, GUI 渲染线程处于挂起状态的, 也就是 冻结 状态

b: JS引擎线程

处理js脚本程序, 负责解析js脚本, 运行代码

c: GUI线程与js引擎线程互斥原因

由于js是可操作DOM的, 如果在修改这些元素属性同时渲染界面, 渲染线程前后获得的元素数据就可能不一致, 防止渲染出现不可预期的结果【个人觉得原因是js可以修改dom节点, 渲染dom节点后, 执行js代码,再次渲染dom节点,前一次的渲染属于浪费】所以浏览器设置GUI线程与js线程引擎为互斥的关系

d: 定时触发器线程

浏览器定时计数器并不是 js引擎计数的, 因为js引擎是单线程的, 如果处于阻塞线程状态就会影响计时的准确性, 单独线程来计时并触发定时更为合理的方案

e: 事件触发线程

当一个事件被触发时该线程会把事件添加到待处理队列的队尾,等待js引擎处理,这些事件可以是当前执行的代码块如 定时任务, 也可以来自浏览器内核的其他线程如 鼠标点击, ajax异步请求, 但由于js的单线程关系所有这些事件都需要排队等待js引擎处理

f: 异步http请求线程

在xmlhttpRequest连接后是通过浏览器新开一个线程请求, 将检测到状态变更时, 如果设置有回调函数, 异步线程就产生状态变更事件放到js引擎的处理队列中等待处理

事件和回调函数

任务队列 是一个事件的队列,IO设备完成一项任务,就在 任务队列中添加一个事件,表示相关的异步任务可以进入

执行栈了, 

就是说  当前异步任务完成后  才会将回调函数添加  任务队列中,等待主线程读取

猜你喜欢

转载自blog.csdn.net/wangyoucaoxiaoxiao/article/details/86232759
今日推荐