同步和异步IO
IO的过程
等待流数据准备好
从内核向进程复制数据(决定同步还是异步)
对unix来讲:阻塞式I/O(默认),非阻塞式I/O(nonblock),I/O复用(select/poll/epoll)都属于同步I/O,因为它们在数据由内核空间复制回进程缓冲区时都是阻塞的(不能干别的事)。
只有异步I/O模型(AIO)是符合异步I/O操作的含义的,即在1数据准备完成、2由内核空间拷贝回缓冲区后 通知进程,在等待通知的这段时间里可以干别的事
同步,异步,阻塞,非阻塞
同步和异步关注的是消息通信机制。
同步意味着会等待在操作完成后继续执行
异步则是函数调用后,继续执行,进行的操作结果采用其他方式通知或处理(如回调函数,信号,消息等)
阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。
为什么需要异步IO?
假设一种场景,某任务需要从磁盘文件读取数据,需要时间m。从网络读取数据,需要时间n。
考虑这段代码:1
2getFileFromDisk("file_path");
getFileFromNet("url");
- 若采用同步方式,则需要时间为m+n
- 若采用异步方式,则需要时间为max(m, n)
由此可见,当存在多个类似IO操作时,异步能极大地提高程序效率!