四种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操作
对资源利用率最高,但是流程也最复杂

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

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

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

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

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

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

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

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

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值