CPU、进程、线程
CPU、进程、线程之间的关系
cpu:计算机的核心,承担了所有的计算任务;
进程: 进程就好比工厂的车间,它代表CPU所能处理的单个任务,CPU使用时间片轮转进度算法来实现同时运行多个进程;
线程: 线程就好比车间里的工人,一个进程可以包括多个线程,多个线程共享进程资源;
浏览器是多进程的,其中包含了主进程、第三方插件进程、GPU进程、渲染进程,其中有渲染进程,也就是我们说的浏览器内核;
浏览器内核又包含多条线程
GUI渲染线程:
- 负责渲染页面,布局和绘制
- 页面需要重绘和回流时,该线程就会执行
- 与js引擎线程互斥,防止渲染结果不可预期
JS引擎线程:
- 负责处理解析和执行javascript脚本程序
- 只有一个JS引擎线程(单线程)
- 与GUI渲染线程互斥,防止渲染结果不可预期
事件触发线程:
- 用来控制事件循环(鼠标点击、setTimeout、ajax等)
- 当事件满足触发条件时,将事件放入到JS引擎所在的执行队列中
定时触发器线程:
- setInterval与setTimeout所在的线程
- 定时任务并不是由JS引擎计时的,是由定时触发线程来计时的
- 计时完毕后,通知事件触发线程
异步http请求线程:
- 浏览器有一个单独的线程用于处理AJAX请求
- 当请求完成时,若有回调函数,通知事件触发线程
同步与异步
javascript是单线程的,但是浏览器并不是单线程的;例如我们使用了setTimeout,在浏览器中就会有一个定时触发器线程去为我们执行代码;也就是说这些内部的API会用单独的线程去执行;
同步还是异步指的是 运行环境提供的API是以同步或异步模式的方式去工作;
js中的任务分为同步任务和异步任务
同步模式:
同步任务都在JS引擎线程上执行,形成一个执行栈
;
代码当中的任务依次执行,执行顺序与代码的编写顺序完全一致,在单线程的情况下,大多数任务都会以同步模式的方式去执行;但是如果其中有个任务执行的时间过长,就会产生阻塞,意味着页面会卡顿或者无法操作,所以需要有异步模式,来解决程序中无法避免的耗时操作;
console.log(1)
function b() {
console.log(3)
}
function a() {
console.log(2)
b()
}
a()
console.log(4)
异步模式:
事件触发线程管理一个任务队列,异步任务触发条件达成,将回调事件放到任务队列
中;
不会去等待这个任务的结束才开始下一个任务,开启过后就立即往后执行下一个任务,后续逻辑一般会通过回调函数的方式来定义;
console.log(1)
setTimeout(function time1() {
console.log(4)
}, 1800)
setTimeout(function time2() {
console.log(3)
setTimeout(function inner () {
console.log(5)
}, 1000)
}, 1000)
console.log(