进程和线程:操作系统的两个概念
进程:计算机已运行的程序,是操作系统管理程序的一种方式(启动一个程序就会默认启动一个进程,也可能是多个进程)
线程:操作系统中能够运行运算调度的最小单位,一般包含在进程里。(每个线程都至少启动一个进程来启动代码,这个线程称之为主线程)
操作系统工作方式:cpu运算速度很快,可以在多个进程间来回切换
浏览器JavaScript线程:
浏览器每一个tab页,都会开启一个新的进程,每个进程又有多个线程, 其中就有javascript线程,JavaScript是单线程,意味着同一时刻只能做一件事,如果这件事耗时,线程就会堵塞,所以那些耗时的操作不要放在主线程里的啦,放其他线程里,例如(网络请求,定时器),我们只需要在特定的时候执行其该有的回调,即可。
浏览器的事件循环(EventLoop):
先从js线程放到其他线程做一些耗时操作,然后操作结束把回调函数加到事件队列里,js线程从队列里面拿函数
不同任务加入队列不一样,有两个队列:微任务和宏任务
宏任务: dom回调(点击事件)- ajax - 定时器
微任务:queueMicrotask - Promise的then回调
执行红任务前要保证微任务都被清空,如果不为空,先执行微任务,再执行宏任务。
node 的时间循环要比浏览器复杂
微任务:
next tick queue: process.nextTink(先执行)
other queque: queueMicrotask Promise的then回调
宏任务:
timer queue : 定时器
poll queue: IO 事件
check queue:setImmediate
close queue:close 事件
执行顺序:next tick queue > other queque >timer queue>poll queue>check queue>close queue
面试题:
主线程: script start /async1 start / async2 /promise1 / promise2/script end
next tick queue :nextTink1/nextTink2
other queque :async1 end/promise3
timer queue:setTimeout
check queue:setImmediate
300毫秒的定时放在最后面!