Linux网络编程(四) I/O模型

本文详细对比了阻塞式I/O、非阻塞式I/O、I/O复用、信号驱动式I/O及异步I/O五种模型。重点介绍了它们在数据准备和复制过程中的工作方式及差异,帮助读者理解不同场景下选择合适的I/O模型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面分析一下5种基本模型的区别:
·阻塞式IO;

·非阻塞使IO;

·IO复用

·信号驱动式IO

·异步IO

一个输入操作通常包含两个不同的阶段

(1)等待数据准备好

(2)从内核向进程复制数据

对于一个套接字上的输入操作,第一步通常涉及等待数据从网络中到达。当所等待的分组到达时,它被复制到内核的某个缓冲区中。第二步就是把数据从内核缓冲区复制到应用进程的缓冲区

1.阻塞式I/O模型

image

 

进程调用recvfrom,其系统调用直到数据报到达且被复制到应用进程的缓冲区中或者发生错误才返回

2.非阻塞式I/O模型

当进程把一个套接字设置为非阻塞时是通知内核:当所请求的I/O操作非得把进程投入睡眠时,不要将其投入睡眠,而是返回一个错误。

image

3.I/O复用模型

有了IO复用,我们可以使用epoll或select,阻塞在这两个系统调用之上,而不是阻塞在真正的I/O系统调用之上。

image

我们阻塞于select调用,等待数据报套接字变为可读

4. 信号驱动式模型

让内核在描述符就绪时发送SIGIO信号通知我们

image

我们既可以在信号处理函数中调用recvfrom读取数据报,也可以立即通知主循环,让它读数据

5. 异步I/O模型

工作机制:告知内核启动某个操作,并让内核在整个操作(包括数据从内核复制到我们自己的缓冲区)完成后通知我们

信号驱动模式是由内核通知我们何时启动一个IO操作,而异步I/O模型是由内核通知我们I/O操作何时完成

image

6.各种I/O模型的比较

·同步I/O操作:导致请求进程阻塞,直到I/O完成

·异步I/O操作:不导致请求进程阻塞

上述的前四种模型都是同步I/O模型,因为其中真正的IO操作将阻塞进程。

image

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值