您的位置:首页 > 其它

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

2012-02-29 16:15 351 查看
原文地址: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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: