Linux I/O 阻塞、非阻塞、同步、异步的理解

Linux I/O 阻塞、非阻塞、同步、异步的理解

在进行网络编程时,常见到同步、异步、阻塞、非阻塞四种调用方式。
同步、异步关注的时消息通信机制

  1. 同步:发出一个调用时,在没有得到结果时,该调用不返回,一旦调用返回,就得到返回值。
  2. 异步:调用发出后,该调用直接返回,没有返回结果,被调用者通过状态、通知来通知调用者,或通过回调函数处理该调用。

阻塞、非阻塞关注的是等待调用结果(消息、返回值)的状态

  1. 阻塞:调用结果返回之前,当前线程会被挂起,调用线程只有在得到结果之后才返回。
  2. 非阻塞:调用不能立即得到结果之前,该调用不会阻塞当前线程。

在处理IO的时候,阻塞和非阻塞都是同步IO。只有特殊的API才是异步IO。
对于unix而言:阻塞式I/O(默认)、非阻塞式I/O(nonblock)、I/O复用(select/poll/epoll)都属于同步I/O,因为在数据由内核空间复制回进程缓冲区时都是阻塞的。只有异步I/O模型(AIO)时符合异步I/O操作含义的,即在数据准备完成,由内核空间拷贝回缓冲区后通知进程的。

阻塞和非阻塞的区别:如果因为各种原因不能马上进行IO操作,继续等待则是阻塞IO,否则则为非阻塞IO。
同步和异步的区别:等待一次IO操作完成再返回则是同步,否则为异步。

阻塞式IO

非阻塞式IO