• Linux IO 同步/异步 阻塞/非阻塞


    同步IO:导致请求进程阻塞,直到IO操作完成;

                是内核通知我们何时进行启动IO操作,而实际的IO操作需要当前进程本身阻塞完成;

                包括:阻塞式IO模型,非阻塞式IO模型,IO复用模型,信号驱动式IO模型

    异步IO:不导致请求进程阻塞;

                是告知内核,内核将IO操作完成之后,通知当前进程,整个过程不需要阻塞;

                 POSIX的aio_系列函数,目前支持POSIX异步IO的系统比较少见;

    如下图(UNP),我们从纵向看,分为两个过程:(1) 等待数据 (2) 将数据从内核复制到用户空间

    可以看到前面4种同步IO虽然第一个步骤方式不尽相同,但是在第(2)步的时候均是阻塞的完成数据从内核到用户空间的复制;

    而异步IO是内核来完成这两个步骤,并通知当前进程,整个过程不需要阻塞,如图最后一种方式;

     

    下面在结合上图说明下同步IO中的这4种有什么区别,主要是体现在上述过程的第(1)阶段,即等待数据的过程;

    阻塞IO:发起操作,如果数据尚未准备就绪,则一直处于阻塞状态,直到数据准备好,完成数据的复制;如上图,阻塞IO的第(1)阶段也是一个阻塞过程;

    非阻塞IO:发起操作,检查数据是否准备就绪,未准备就绪立即返回,然后不断检查,直到数据准备继续,阻塞完成数据复制;如上图,非阻塞IO的第(1)阶段是一个反复检查的过程;

    IO复用:自己等不如大家一起等,多个描述符添加到epoll/select中一起阻塞等待数据准备就绪,当有数据准备就绪之后,触发事件,对应阻塞完成数据复制;如上图,IO复用的第(1)阶段是阻塞在IO复用的系统调用上的过程;

    信号驱动IO:注册一个SIGIO的信号处理函数,当有数据准备好的时候,产生SIGIO信号,触发信号处理函数,阻塞完成数据复制;如上图,信号驱动IO第(1)阶段不需要任何操作,只需要等待信号触发;

  • 相关阅读:
    maven引入tomcat插件
    Maven更新jdk1.7
    ehcashe
    response的json
    ajax
    180411
    清空select标签中option选项
    jackson
    ajax
    mysql主从
  • 原文地址:https://www.cnblogs.com/wanpengcoder/p/5207211.html
Copyright © 2020-2023  润新知