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。
读完此兄文章 也谈谈自己的感悟。
文章中主要比较了四种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。
相关文章推荐
- 转载一个关于阻塞/非阻塞以及同步/异步IO的分析
- IO中同步、异步与阻塞、非阻塞的区别
- IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇) .
- IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)
- 网络IO之阻塞、非阻塞、同步、异步总结
- python# 进程/线程/协程 # IO:同步/异步/阻塞/非阻塞 # greenlet gevent # 事件驱动与异步IO # Select\Poll\Epoll异步IO 以及selector
- IO中同步、异步与阻塞、非阻塞的区别
- 同步,异步,阻塞,非阻塞IO
- 同步 异步 阻塞 非阻塞 IO
- IO中同步、异步与阻塞、非阻塞的区别
- JAVA基础知识之网络编程——-关于阻塞IO/非阻塞IO/同步IO/异步IO的一些参考文章
- IO的阻塞与非阻塞、同步与异步以及Java网络IO交互方式
- IO操作:同步,异步,阻塞,非阻塞
- 网络IO之阻塞、非阻塞、同步、异步总结
- 关于IO的同步,异步,阻塞,非阻塞
- IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)
- linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO
- IO中同步、异步与阻塞、非阻塞的区别
- IO中同步、异步与阻塞、非阻塞的区别
- IO - 同步异步,阻塞非阻塞 详细解释