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设备完成一项任务,就在 任务队列中添加一个事件,表示相关的异步任务可以进入
执行栈了,
就是说 当前异步任务完成后 才会将回调函数添加 任务队列中,等待主线程读取