美文网首页我爱编程
Linux的五种I/O模型

Linux的五种I/O模型

作者: viean | 来源:发表于2018-04-12 09:38 被阅读0次

    一.引子

    linux进行磁盘、网络等I/O操作时,进程是无法直接操作I/O设备,所有操作都经由系统调用请求Linux Kernel来协助完成I/O动作,且内核会为每一个I/O设备维护一个Buffer。如下图展示了进程进行I/O操作时的流程: 用户进程进行I/O操作的流程

    流程介绍:process发起请求,Kernel接收请求,从I/O设备中获取数据至Kernel的Buffer,再将Buffer中的数据拷贝到用户进程的地址空间,进程获取到数据后,再响应客户端;(上图中红色线条的两阶段)

    二.I/O模型的划分

    在整个交互过程中数据输出至Kernel的buffer及将数据copy到用户进程的地址空间都需要时间。因此根据这两段时间内等待方式的不同,I/O模型分为五种模式:

    1.阻塞I/O (Blocking I/O)
    2.非阻塞I/O (Non-Blocking I/O)
    3.I/O复用 (I/O Multiplexing)
    4.信号驱动的I/O (Signal Driven I/O)
    5.异步I/O (Asynchrnous I/O)
    

    阻塞:调用进程一直处于等待状态,直到操作完成;
    非阻塞:在内核的数据还未准备好时,会先返回,进行进行其他操作;
    从同步异步,以及阻塞、非阻塞两个维度来划分来看:


    I/O模型同步及阻塞维度划分

    三.I/O模型分别介绍

    1.阻塞I/O

    特点:I/O执行的两阶段进行都被block.

    2.非阻塞I/O

    特点:用户只有在第二阶段被阻塞,第一阶段没有阻塞。第一阶段中,用户进程轮询内核,看数据是否准备好。与轮询方式对应的为信号驱动 的I/O,如下一个所示。

    3.信号驱动的I/O 或 基于事件驱动的I/O模型


    特点:第一阶段未阻塞,第二阶段阻塞;用户进程不需要轮询系统内核,等数据准备好时,内核主动通知用户进程。

    4.I/O复用


    特点:I/O执行的两个阶段都是阻塞的;两个阶段是独立的,一次完整I/O操作中,用户进程发起两个系统调用。

    注:I/O多路复用模型应用非常广泛,其核心思想可以用下图介绍;


    select, poll, epoll 都是I/O多路复用的具体的实现,之所以有三者的存在,其实是他们出现是有先后顺序的。具体介绍参考如下链接:
    https://www.cnblogs.com/creazylinux/p/7364685.html

    5.异步I/O


    特点:用户进程发起系统调用后,立即可做其他事情(不阻塞),直到I/O执行的两个阶段都完成后,内核会给用户进程发送通知,告诉用户进程已经完成。

    四.五种模型总结

    备注:参考 cnblog @子夜文章,在此感谢

    相关文章

      网友评论

        本文标题:Linux的五种I/O模型

        本文链接:https://www.haomeiwen.com/subject/wjtxkftx.html