四种IO模型‘阻塞IO/非阻塞IO/信号驱动IO/异步IO‘

Posted 程序字母K

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了四种IO模型‘阻塞IO/非阻塞IO/信号驱动IO/异步IO‘相关的知识,希望对你有一定的参考价值。


IO过程:等待IO就绪,数据拷贝

1、阻塞IO

若IO条件不具备,一直等待
流程简单,效率低

图解:

2、非阻塞IO

IO条件不具备,直接报错返回
相较于阻塞IO非阻塞IO对于资源的利用率有所提高,操作复杂度有所提升,因为这种非阻塞操作通常要循环进行,IO操作不够实时

图解:

在这里插入图片描述

非阻塞IO的实现:
1.非阻塞的实现:recv/send(fd, buf, len, flag);
其中flag设置为MSG_DONTWAIT

  • 设置描述符属性:int fcntl(int fd, int cmd, …);

其中cmd有:

  • 复制一个现有的描述符 :
    cmd = F_DUPFD

  • 获得/设置文件描述符标记:
    cmd = F_GETFD或F_SETFD

  • 获得/设置文件状态标记

  • cmd = F_GETFL或F_SETFL

  • 获得/设置异步IO所有权
    cmd = F_GETOWN或F_SETOWN

  • 获得/设置记录锁

  • cmd = F_GETLK或F_SETLKW

通常设置非阻塞时,我们将一个描述符的属性给设置为非阻塞属性,往后这个描述符的所有操作都是非阻塞的(非阻塞—O_NONBLOCK)

void SetNoBlock(int fd){
    int fl = fcntl(fd, F_GETFL);
    if(fl < 0){
        perror("fcntl");
        return ;
    }
    fcntl(fd, F_SETFL, fl | O_NONBLOCK); 
}

3、信号驱动IO

注册一个信号处理函数,通过信号中断实现IO实时操作
效率及实时性较于非阻塞IO更高,但是操作的流程负责度要更高

图解:
在这里插入图片描述

4、异步IO

异步IO操作使用AIO控制块来描述IO操作
对资源利用率最高,但是流程也最复杂

图解:
在这里插入图片描述

同步、异步;阻塞、非阻塞:

同步:完成一个功能,如果条件不具备则一直等待,直到功能完成,才进行下一个任务;

异步:发起一个调用,让别人完成,不用等待完成后继续推进

阻塞:发起一个功能操作,如果条件不具备一直等待

非阻塞:发起一个功能操作,如果条件不具备则立即报错返回

同步与异步:主要强调流程上一个功能的时序性的完成流程,更多的是描述一个任务的完成流程,任务是否由自己完成

阻塞与非阻塞:主要强调操作是否在不满足条件的情况下会立即返回

以上是关于四种IO模型‘阻塞IO/非阻塞IO/信号驱动IO/异步IO‘的主要内容,如果未能解决你的问题,请参考以下文章

四种IO模型

四种IO模型

四种IO模型

典型I/O模型——阻塞IO,非阻塞IO,信号驱动IO,异步IO,IO多路转接(select&poll&epoll)

五种IO模型

透彻Linux(Unix)五种IO模型