原文地址:http://blog.csdn.net/historyasamirror/article/details/5778378
读完此兄文章 也谈谈自己的感悟。
文章中主要比较了四种IO Model:
blocking IO
nonblocking IO
IO multiplexing
asynchronous IO
背景知识:
对于一个network IO (这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的process (or thread),另一个就是系统内核(kernel)。当一个read操作发生时,它会经历两个阶段:
1 等待数据准备 (Waiting for the data to be ready)
2 将数据从内核拷贝到进程中 (Copying the data from the kernel to the process)
记住这两点很重要,因为这些IO Model的区别就是在两个阶段上各有不同的情况。
asynchronous /synchronous 的区别:
在进行I/O操作的过程中 Pocess 是否会发生block.
分析:
blocking IO 如果想要的数据还没有准备好,那就一直等待,直到数据准备好,此阶段 process block。
nonblocking IO 如果想要的数据还没有准备好,I/0请求就立即返回,但是此后 进程会不断询问kernel数据已经十分准备好,此阶段process noblock,但是一旦数据准备好 进入阶段2 的拷贝过程中,此时 Process block。
IO multiplexing 应用实例是 select,epoll。 基本流程是 select,epoll 维护一个描述符列表,对于select 是不断轮询这个描述符表,看是否有描述符状态发生变化,而epoll 机制是 一旦其维护的描述符表中元素有状态变化,kernel 会通知epoll。
在select ,epoll 等待的阶段 process block.
asynchronous IO 如果想要的数据还没有准备好,I/0请求就立即返回,其后不管数据是否准备好 进程都没有任何操作,直到 数据从内核缓冲区拷贝到用户缓冲区完成,kernel 发出完成通知,所以在阶段1、阶段2 process no block.
结论:
1 区别阻塞与非阻塞只需要看 有I/O请求是 对数据没有准备好的处理情况。
看同步与异步 要看 阶段 1、 阶段 2 是否会造成 Process block.
因此 blocking IO nonblocking IO IO multiplexing 都是 synchronous I/O.
select 模型,epoll 模型都是同步I/O.
epoll 与IOCP相比 ,epoll将数据从内核缓存区拷贝到用户缓冲区的过程会使得 Process block,所以不能算作 异步I/O.
纵观linux、windows 也只有这一种模型是异步I/O -----IOCP。