Linux—IO模型

本文详细介绍了IO模型的五种类型:阻塞IO、非阻塞IO、IO多路复用、信号驱动IO和异步IO。对比了它们的工作原理和效率,重点讨论了它们在数据传输过程中的状态变化和资源利用。信号驱动IO与异步IO的主要区别在于数据拷贝的时机和效率,异步IO由于其推数据的机制,通常具有更高的性能。
摘要由CSDN通过智能技术生成

只要具有输入输出类型的交互系统都可以认为是 I/O 系统

Input:输入数据到内存中
Output:输出数据到IO设备(磁盘 、 网络等需要与内存进行数据交互的设备)中

阻塞IO

阻塞:不占用资源CPU,在原处休眠,等待数据唤醒。

非阻塞IO

并不会等待函数的返回值;如果没有数据返回,执行其他任务。

缺点:任务完成的响应延迟增大了,因为每过一段时间才去轮询一次 read 操作,而任务可能在两次轮询之间的任意时间完成。这会导致整体数据吞吐量的降低。当执行别的任务是来了数据,会无法读到数据。

IO多路复用

举个栗子:
一个人十个杆子钓鱼,人正常在休眠,鱼儿上钩了就去依次检查每一个杆子,提起杆子再放下。

这种模型其实和BIO 是一模一样的,都是阻塞的,只不过在 socket 上加了一层代理 select,select 可以通过监控多个 socket 是否有数据,通过这种方式来提高性能。
一旦检测到一个或多个文件描述有数据到来,select 函数就返回,这时再调用 recv 函数(这块也是阻塞的),数据从内核空间拷贝到用户空间,recv 函数返回。

信号驱动IO

在用户态程序安装SIGIO信号处理函数(用 sigaction 函数或者 signal 函数来 安装自定义的信号处理函数),而recv 函数就在信号处理函数中间。然后用户态程序可以执行其他操作不会被阻塞。
一旦有数据到来,操作系统以信号的方式来通知用户态程序,用户态程序跳转到自定义的信号处理函数
在信号处理函数中调用recv 函数,接收数据。数据从内核空间拷贝到用户态空间后, recv 函数返回。

异步IO

异步IO 通过 aio_read 函数实现,aio_read提交请求并递交一个用户态空间下的缓冲区 。即使内核中没有数据到来,aio_read 函数也立刻返回,应用程序就可以处理其他的事情 。

当数据到来后操作系统自动把 数据从内核空间拷贝到 aio_read 函数递交的用户态缓冲区 。 拷贝完成以信号的方式通知用户态程序,用户态程序拿到数据后就可以执行后续操作 。

当数据来的时候,内核自动帮你把数据拷贝到用户态缓存区。

IO 和信号驱动 IO 的不同?

1、所处的位置不同:
在于信号通知用户态程序时数据所处的位置。 异步 IO 已经把数据从 内核空间拷贝到用户空间 了;而信号驱动 IO的数据还在内核空间 ,等着 recv 函数把数据拷贝到用户态空间。

2、效率不同:
异步 IO 主动把数据拷贝到用户态空间,不需要调用 recv方法把数据从内核空间拉取到用户态空间。异步 IO 是一种推数据的机制,相比于信号处理 IO 拉数据的机制效率更高。

推数据是直接完成的,而拉数据是需要调用 recv 函数,调用函数会产生额外的开销,故效率低。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值