5种IO模型

阻塞IO

很常见的一种IO模型,即在进行IO操作时该进程或者线程阻塞挂起,等待IO操作完成返回结果如套接字、管道等默认均为阻塞IO,一个文件描述符, 默认都是阻塞IO。
在这里插入图片描述

非阻塞IO

非阻塞IO 即在调用时,如果不满足条件,如管道现在为空(前提是管道的写端没有关闭,否则阻塞和非阻塞在管道为空时去读均会返回0)或者接受缓存区为空时不会阻塞,直接返回并且设置错误码为EWOULDBLOCK
在这里插入图片描述
改变文件描述符的阻塞或非阻塞属性
通过fcntl系统调用可以实现, 函数原形如下
int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd ,struct flock* lock);

其中根据cmd的不同后面参数不同,
复制一个现有的描述符(cmd=F_DUPFD)
获得/设置文件描述符标记(cmd=FGETFD或FSETFD)
获得/设置文件状态标记(cmd=FGETFL或FSETFL)
获得/设置异步I/O所有权(cmd=FGETOWN或FSETOWN)
获得/设置记录锁(cmd=FGETLK,FSETLK或F_SETLKW)

#include <unistd.h>
#include <fcntl.h>

void SetNoBlock(int fd)
{
	int fl = fcntl(fd, FGETFL);  //获得当前文件描述符状态属性
	if(fl < 0){
		perror("fcntl error");
		return;
	}
	fcntl(fd, FSETFL, fl|O_NONBLOCK); //添加非阻塞属性
}
信号驱动IO

内核将数据准备好的时候, 使用SIGIO信号通知应用程序进行IO操作
在这里插入图片描述

IO多路转接(IO多路复用)

同时等待多个IO事件,IO多路转接的几种模型就实现了帮我们监控是否具备IO条件,如果具备条件则返回,然后发起调用即可,如果不具备条件则等待
在这里插入图片描述

异步IO

当遇到IO操作时,代码只负责发出IO请求,不等待IO结果,然后直接结束本轮消息处理,进入下一轮消息处理过程。当IO操作完成后,将收到一条“IO完成”的消息,处理该消息时就可以直接获取IO操作结果。

在“发出IO请求”到收到“IO完成”的这段时间里,同步IO模型下,线程只能挂起,但异步IO模型下,线程没有挂起,而是在消息循环中继续处理其他消息。这样,在异步IO模型下,一个线程就可以同时处理多个IO请求,并且没有切换线程的操作。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值