IO的过程

  1. 等待流数据准备好

  2. 从内核向进程复制数据(决定同步还是异步)

对unix来讲:阻塞式I/O(默认),非阻塞式I/O(nonblock),I/O复用(select/poll/epoll)都属于同步I/O,因为它们在数据由内核空间复制回进程缓冲区时都是阻塞的(不能干别的事)。

只有异步I/O模型(AIO)是符合异步I/O操作的含义的,即在1数据准备完成、2由内核空间拷贝回缓冲区后 通知进程,在等待通知的这段时间里可以干别的事

同步,异步,阻塞,非阻塞

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

  • 同步意味着会等待在操作完成后继续执行

  • 异步则是函数调用后,继续执行,进行的操作结果采用其他方式通知或处理(如回调函数,信号,消息等)

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。

为什么需要异步IO?

假设一种场景,某任务需要从磁盘文件读取数据,需要时间m。从网络读取数据,需要时间n。

考虑这段代码:

1
2
getFileFromDisk("file_path");
getFileFromNet("url");

  • 若采用同步方式,则需要时间为m+n
  • 若采用异步方式,则需要时间为max(m, n)

由此可见,当存在多个类似IO操作时,异步能极大地提高程序效率!

参考

  1. 怎样理解阻塞非阻塞与同步异步的区别?

留言

2015-04-14