认识IO模型

本文详细介绍了Linux操作系统中的常见IO函数,并深入探讨了多种IO模型,包括阻塞IO、非阻塞IO、IO复用、信号驱动IO和异步IO。重点解释了IO模型的工作原理以及如何在实际应用中选择合适的IO模型来提高程序的性能。

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

常见的IO函数主要有read()/write(),recv()/send(),recvmsg()/sendmsg(),readv()/writev()。谈到IO模型,首先了解一下网络数据是如何被处理及接收的,当我们使用某一IO函数时候,会向linux内核发送命令请求,内核空间创建相应文件描述符,网络数据由网络线路传播至本地主机,经网络层解析过后得到数据,内核将数据缓存在所创建文件描述符指向的缓冲区中(在内核空间中)。最后将该缓冲区的内容复制到应用程序缓冲区(在用户空间中),完成网络数据处理。

IO的方式有阻塞IO、非阻塞IO、IO复用、信号驱动、异步IO等

阻塞IO

阻塞IO是最通用的IO类型,使用这种模型进行数据接收的时候,在数据没有到之前程序会一直等待。

非阻塞IO

当把套接字设置成非阻塞的IO,则对每次请求,内核都不会阻塞,会立即返回;当没有数据到的时候,会返回一个错误(EMOULDBLOCK),直到有数据到来。相当于有个循环,一直在测试文件描述符是否可读,这显然是一种极度浪费cpu资源的IO操作模式。

IO复用

在等待数据的时候加入超时的时间,当超时时间没有用到达的时候与阻塞情况一致,而当超时时间到达仍然没有数据接收到,系统会返回,不再等待。一般使用select()或者poll()函数按照一定的超时时间轮询,直到需要等待的套接字有数据到来。

信号驱动IO

在进程开始的时候注册一个信号处理的回调函数,进程继续执行,当信号发生时,即有了IO的时间,这里即有数据到来。

异步IO模型

与信号驱动IO类似,区别在于信号驱动IO当数据到来的时候,使用信号通知注册的信号处理函数,而异步IO则在数据复制完成的时候才发送信号通知注册的信号处理函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值