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

原文地址: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。




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值