一、进程和线程
- 进程
资源分配的最小单位;应用程序的执行实例,每一个进程都是由私有的虚拟地址空间、代码、数据和其它系统资源所组成;进程拥有独立的堆栈空间和数据段,每当启动一个新的进程必须分配给他独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段。 - 线程
程序执行的最小单位;线程是进程内的一个独立执行单元,在不同的线程之间是可以共享进程资源的;线程拥有独立的堆栈空间,但是共享数据段,他们彼此之间使用相同的地址空间,共享大部分数据,比进程更节俭,开销比较小,切换速度比进程快,效率高。
二、同步任务和异步任务
- 同步任务
同步任务就是在主线程上排队执行的任务,智能执行完一个再执行下一个 - 异步任务
异步任务则不进入主线程,而是先在event table中注册函数,当满足触发条件后,才可以进入任务队列来执行。只有任务队列通知主线程说,我这边异步任务可以执行了,这个时候此任务才会进入主线程执行。
console.log('a')
setTimeout(() => {
console.log('b')
}, 0)
console.log('c')
// a c b
三、宏任务和微任务
- 宏任务
- setTimeout
- setInterval
- setImmediate
- MessageChannel
- requestAnimationFrame
- I/O
- UI交互事件
- 微任务
- Promise.then
- MutationObserver
- Object.observe
- process.nextTick
执行方式:执行一个宏任务,过程中遇到微任务时,将其放到微任务的事件队列里,当前宏任务执行完后,会查看微任务的事件队列,依次执行里面的微任务。如果还有宏任务的话,再重新开启宏任务
console.log('1')
setTimeout(() => {
console.log('2')
}, 1000)
new Promise((resolve, reject) => {
setTimeout(() => {
console.log('3')
}, 0)
console.log('4')
resolve()
console.log('5')
}).then(() => {
console.log('6')
})
console.log('7')
// 运行结果
1
4
5
7
6
3
2
通俗的理解为,首先执行script(整体代码)宏任务,从上往下执行,遇到宏任务放入宏任务队列,遇到微任务放入微任务队列,执行微任务队列的任务,然后执行宏任务队列的第一个任务