【Linux系列】从本质上理解五种IO模型的区别

IO模型

输入操作通常包括两个不同的阶段:
(1)等待数据准备好;
(2)从内核向进程复制数据。
对于一个套接字上的输入操作,第一步通常涉及等待数据从网络中到达。当所等待分组到达时,它被复制到内核中的某个缓冲区。第二步就是把数据从内核缓冲区复制到应用进程缓冲区。

根据各自的特性不同,IO模型被分为阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO五类。

最主要的两个区别就是阻塞与非阻塞,同步与异步。

阻塞与非阻塞
阻塞与非阻塞最主要的区别就是程序在等待调用结果时的状态。

阻塞:为了完成一个功能发起调用,如果不具备完成功能的条件,则调用会一直等待
非阻塞:为了完成一个功能发起调用,如果不具备完成功能的条件,则立即报错返回

同步与异步
同步与异步最主要的区别就是功能完成的流程是否是顺序化的,且完成的是自身还是系统。

同步:功能完成的流程是顺序化的,并且功能由自身完成。导致请求进程阻塞,直到I/O操作完成;
异步:功能完成的流程是不确定的,并且功能由系统完成。不导致请求进程阻塞。

阻塞IO

发起IO调用,如果不具备IO条件,则一直等待直到条件就绪。
在这里插入图片描述
优点:流程以及代码实现都非常简单,任务顺序操作。

缺点:任务处理效率较低,无法充分利用资源。

非阻塞IO

发起一个IO调用,如果不具备IO条件,则立即报错返回,继续执行其他命令。通过一个循环来不断发起IO请求,直到条件就绪。
在这里插入图片描述
前三次调用recvfrom时没有数据可返回,因此内核转而立即返回一个EWOULDBLOCK错误。第四次调用recvfrom时已有一个数据报准备好,它被复制到应用进程缓冲区,于是recvfrom成功返回。我们接着处理数据。

当一个应用进程像这样对一个非阻塞描述符循环调用recvfrom时,我们称之为轮询(polling)。应用进程持续轮询内核,以查看某个操作是否就绪。这么做往往耗费大量CPU时间。

优点:与阻塞IO相比较来说,利用了等待的时间去做了其他的事情,对资源的利用更加充分。

缺点:与阻塞IO对比,IO调用需要循环发起,流程更加复杂。并且如果IO条件就绪了,也要等待上一轮循环结束后进入当前循环,才能进行处理,这就导致了IO不够实时。

非阻塞IO可以通过fcntl函数设置描述符状态来实现
例如:

void SetNoBlock(int fd) 
{
	int flag = fcntl(fd, F_GETFL, 0);
	
	flag |= O_NONBLOCK;
	fcntl(fd, F_SETFL, flag);
}

多路复用IO

用于对大量的IO事件进行监控,能够让用户只针对就绪了指定事件(可读、可写、异常) 的IO进行IO操作。只针对就绪的描述符进行操作,避免了阻塞,并且提高了效率。

在Linux下,操作系统提供了三种模型:select模型、poll模型、epoll模型。
在这里插入图片描述

信号驱动IO

自定义一个IO就绪的信号,当IO就绪时就发出这个信号。在没有收到信号时,可以继续处理其他事情,一旦收到信号,就会中断当前操作,来优先处理IO事件。
在这里插入图片描述
通过sigaction系统调用安装信号处理函数。该系统调用将立即返回,我们的进程继续工作,也就是说它没有被阻塞。当数据报准备好读取时,内核就为该进程产生一个sIgIo信号。我们随后既可以在信号处理函数中调用recvfrom读取数据报,并通知主循环数据已准备好,也可以立即通知主循环,让它读取数据报。,这种模型的优势在于等待数据报到达期间进程不被阻塞。主循环可以继续执行,只要等待来自信号处理函数的通知。

优点:相较于非阻塞IO,因为信号到来后就直接强行中断进行处理,更加实时。并且在没收到信号的时候可以执行其他工作,资源利用更加充分。

缺点:因为需要自定义信号,又要有主控流程也要有信号处理流程,并且还需要考虑信号是否可靠导致的事件丢失情况,流程会更加的复杂。

异步IO

IO处理的顺序不确定,整个IO的过程(等待 + 数据拷贝)由操作系统来完成而并非用户。

这种模型与信号驱动模型的主要区别在于:信号驱动式I/O是由内核通知我们何时可以启动一个I/O操作, 而异步I/O模型是由内核通知我们I/O操作何时完成。

在这里插入图片描述
流程:

  • 自定义一个IO完成信号
  • 发起异步调用后返回,此时用户可以继续处理其他事情
  • 系统进行IO事件的等待以及数据拷贝
  • IO完成后通过信号通知进程IO

优点:对资源的利用最为充分, 以最高的效率进行任务的处理

缺点:资源消耗较高, 流程最为复杂

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值