进程和线程的区别是什么?什么是Even Loop?异步任务是如何被执行的?

1. 进程和线程的区别是什么?

ans:我们知道javascript是单线程的语言,在讨论为什么是单线程之前,先弄清楚进程和线程的区别是什么。
若将CPU比作一个工厂,进程就是这个工厂的车间。单个CPU一次只能运行一个任务,其他进程处于非运行状态,所以我们可以假设这个工厂的电力每次只能供一个车间工作。车间里面有很多工人,他们协同完成一个任务,线程就好比车间里面的工人,一个进程可以包括多个线程。车间的空间是工人共享的,即进程的内存空间可以被线程共享。但车间里的房间有大有小,有的只能容纳一个人,如厕所,有的可以容纳几个人,如厨房。为了防止线程之间冲突,有两个解决方案:

  • 互斥锁(保证内存区域独占)
  • 信号量(某些内存区域只能供固定数目的线程使用)

总结:

  • 多进程:允许多个任务同时运行
  • 多线程:允许单个任务分成不同的部分执行

参考:进程与线程的一个简单解释

2. 为社么javascript是单线程?

ans:JavaScript的主要用途是与用户互动,以及操作DOM。假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?

3. 什么是Event Loop?

ans:先大致概括步骤,具体涉及到的概念后面慢慢解释。

  • 所有同步任务都在主线程上执行,形成一个执行栈
  • 主线程之外,还存在一个"任务队列"(task queue)。只要异步操作执行完成,就到任务队列中排队
  • 一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
  • 主线程不断重复上面的第三步。
4. 什么是同步任务,什么是异步任务 ?

ans:
同步任务: 指的是在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务。简单来说,同步任务就是在函数返回的时候,调用者就能够得到预期结果。
异步任务: 指的是不进入主线程,而是先进入任务队列的任务,某个异步任务可以执行了,该任务才会进入主线程执行。简单来说,如果在函数返回的时候,调用者还不能够得到预期结果,而是需要在将来通过一定的手段得到,那么这个函数就是异步的。
另外,除了广义的同步任务和异步任务,我们对任务有更精细的定义:
宏任务(macro-task): 包括整体代码script,setTimeout,setIntervalsetImmediate,I/O,UI rendering.
微任务(micro-task): Promise,process.nextTick,MutationObserver
在ES6规范中,microtask 称为 jobs,macrotask 称为 task.

注:在实践过程中,发现虽然同为微任务,但process.nextTick总会在执行栈任务执行完之后立刻执行,跟与其他微任务的在代码中的位置前后无关

5. 异步任务如何被存放进任务队列?

ans:
(1)一个异步过程通常是这样的:主线程发起一个异步请求,异步任务接收请求并告知主线程已收到(异步函数返回);主线程可以继续执行后面的代码,同时异步操作开始执行;执行完成后通知主线程;主线程收到通知后,执行一定的动作(调用回调函数)。
因此,一个异步过程包括两个要素:注册函数和回调函数,其中注册函数用来发起异步过程,回调函数用来处理结果。
在这里插入图片描述
如上图所示 :

  • 同步和异步任务分别进入不同的执行"场所",同步的进入主线程,异步的进入Event Table并注册函数。

  • 当指定的事情完成时,Event Table会将这个函数移入Event Queue。

  • 主线程内的任务执行完毕为空,会去Event Queue读取对应的函数,进入主线程执行。

  • 上述过程会不断重复,也就是常说的Event Loop(事件循环)。

    (2)异步任务类型:

    • 普通事件,如click、resize等
    • 资源加载,如load、error等
    • 定时器,包括setInterval、setTimeout等

    (3)不同的异步任务会分别进入微任务队列和宏任务队列。

6. 从宏任务和微任务角度来看事件循环Event Loop

在这里插入图片描述
以下面代码为例:

setTimeout(function() {
    console.log('setTimeout');
})

new Promise(function(resolve) {
    console.log('promise');
}).then(function() {
    console.log('then');
})

console.log('console');
  • 这段代码作为宏任务,进入主线程。
  • 先遇到setTimeout,那么将其回调函数注册后分发到宏任务Event Queue。
  • 接下来遇到了Promise,new Promise立即执行,then函数分发到微任务Event Queue。
  • 遇到console.log(),立即执行。
  • 好啦,整体代码script作为第一个宏任务执行结束,看看有哪些微任务?我们发现了then在微任务Event Queue里面,执行。
  • ok,第一轮事件循环结束了,我们开始第二轮循环,当然要从宏任务Event Queue开始。我们发现了宏任务Event Queue中setTimeout对应的回调函数,立即执行。
  • 结束。

参考:
深入理解javascript中的事件循环event-loop
这一次,彻底弄懂 JavaScript 执行机制
什么叫异步
JavaScript 运行机制详解:再谈Event Loop

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值