zoukankan      html  css  js  c++  java
  • Linux下的五种I/O模型

    堵塞I/O(blocking I/O)

    非堵塞I/O (nonblocking I/O)

    I/O复用(select 和poll) (I/O multiplexing)

    信号驱动I/O (signal driven I/O (SIGIO))

    异步I/O (asynchronous I/O (the POSIX aio_functions))

    前四种都是同步。仅仅有最后一种才是异步IO。


    I/O过程分为两个过程,数据准备和数据拷贝


    堵塞I/O模型:

    该模型在两个过程中一直处于堵塞状态,直到数据拷贝完毕,系统调用返回.

    堵塞I/O模型图:


    当调用recv()函数时,系统首先查是否有准备好的数据。

    假设数据没有准备好,那么系统就处于等待状态。

    当数据准备好后。将数据从系统缓冲区拷贝到用户空间。然后该函数返回。

    在套接应用程序中。当调用recv()函数时。未必用户空间就已经存在数据,那么此时recv()函数就会处于等待状态。

         

    非堵塞IO模型 

    非堵塞I/O在第一个过程中会进行多次调用系统调用(假设数据没有准备好的话)并马上返回.在数据拷贝过程中,仍然处于堵塞状态.       

           我们把一个SOCKET接口设置为非堵塞就是告诉内核,当所请求的I/O操作无法完毕时,不要将进程睡眠。而是返回一个错误。

    这样我们的I/O操作函数将不断的測试数据是否已经准备好。假设没有准备好。继续測试,直到数据准备好为止。在这个不断測试的过程中。会耗费大量的占用CPU的时间。

    有点类似于轮询

    堵塞I/O模型图:

        


      

    IO复用模型:

          I/O复用模型经常使用的函数有select、poll和epoll,详细的差别请查阅相关文档。

    这几个函数也会使进程堵塞(请注意和I/O堵塞进行区分)该函数能够监听多个socket,看是否有socket就绪。假设就绪就返回就绪的socket数(或者超时返回)。然后对就绪的socket依照相应的就绪事件进行相关的操作(读数据或者写数据)

    I/O复用模型图:


    信号驱动IO

        首先我们同意套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续执行并不堵塞。

    当数据准备好时。进程会收到一个SIGIO信号,我们能够在信号处理函数中调用I/O操作函数处理数据。


    异步IO模型

    在两个过程中都不会发生堵塞,直到数据拷贝完毕后收到通知。

    当一个异步过程调用发出后,调用者不能立马得到结果。实际处理这个调用的模块在完毕I/O操作后。通过状态或者回调来通知调用者



    同步IO和异步IO的差别:数据拷贝的过程中,进程是否堵塞!

    堵塞IO和非堵塞IO的差别:数据准备的过程中,进程是否堵塞



    5种I/O模型的比較:





  • 相关阅读:
    互动留言赠书:《Oracle高性能系统实战大全》
    超融合硬件损坏导致Oracle RAC异常恢复实录
    架构师不得不了解的硬件知识
    加班做的可视化被老板嫌弃,是因为你不会用这些数据工具
    iOS开发之七:常用控件--UISlider、UISegmentedControl、UIPageControl的使用
    iOS开发之六:常用控件--UIImageView的使用
    iOS开发之五:常用控件--UITextField的使用
    Objective-C实现常用的4种排序算法
    C语言实现4种常用排序
    面试常用的4种数组排序
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/7099624.html
Copyright © 2011-2022 走看看