2

IO - 同步异步,阻塞非阻塞

 2 years ago
source link: https://zsmhub.github.io/post/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B/%E7%90%86%E8%A7%A3%E5%90%8C%E6%AD%A5%E5%BC%82%E6%AD%A5%E5%92%8C%E9%98%BB%E5%A1%9E%E9%9D%9E%E9%98%BB%E5%A1%9E/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)

两者定义的针对目标不同,异步同步是针对 响应 本身的,阻塞非阻塞是针对 请求 本身的。

本质上没有关系

  1. 同步与异步是关于指令执行顺序的。
  2. 阻塞非阻塞是关于线程与进程的。

所以两者本身并没有必然的关联系。

同步与异步

同步和异步关注的是消息通信机制

  • 同步是指代码调用IO操作时,必须等待IO操作完成才返回的调用方式。
  • 异步是指代码调用IO操作时,不必等IO操作完成就返回的调用方式。

举个通俗的例子:

  • 你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下",然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。
  • 而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。

阻塞与非阻塞

阻塞非阻塞是跟进程/线程密切相关的,阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态

  • 阻塞是指调用线程或者进程被操作系统挂起。
  • 非阻塞是指调用线程或者进程不会被操作系统挂起。

举个通俗的例子:

  • 你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,
  • 而如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要偶尔过几分钟 check 一下老板有没有返回结果。

在这里阻塞与非阻塞与是否同步异步无关。跟老板通过什么方式回答你结果无关。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK