网络&操作系统-异步,同步,阻塞,非阻塞

异步 & 同步

同步与异步主要从消息通知机制的角度来说。

消息通知

消息通知的方式有三种:

  1. 状态
  2. 通知
  3. 回调 如果用状态来通知,那调用者要每隔一段时间检查一次,效率极低 通知和回调效率较高,执行部件几乎不需要做额外的操作。

场景比喻

去银行办理业务

阻塞与非阻塞

阻塞与非阻塞与程序(线程)等待消息通知时的状态(无所谓同步或者异步)有关。

场景比喻

在银行等业务(不论是排队还是等叫号)

同步/异步与阻塞/非阻塞

  1. 同步阻塞 效率最低
  2. 异步阻塞 异步非阻塞 想想上面银行的例子,效率也都不是很高 可以对fd设置O_NONBLOCK标志位,这样就可以将同步操作变成非阻塞
  3. 异步非阻塞

同步阻塞和异步非阻塞出现的较多,但不代表同步等于阻塞,异步等于非阻塞。

异步执行的步骤如下:

1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。

2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。

3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。

4)主线程不断重复上面的第三步。

reference

  1. JavaScript 运行机制详解:再谈Event Loop
  2. Linux IO模式及 select、poll、epoll详解
  3. 聊聊同步、异步、阻塞与非阻塞
Table of Contents