四种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‘的主要内容,如果未能解决你的问题,请参考以下文章