Linux | 五种io模型以及比较

同步阻塞io

默认情况下所有的socket都是阻塞的.

在这个IO模型中,用户空间的应用程序执行一个系统调用(recvform),这会导致应用程序阻塞,什么也不干,直到数据准备好,并且将数据从内核复制到用户进程,最后进程再处理数据

img

同步非阻塞

同步非阻塞就是 “每隔一会儿瞄一眼进度条” 的轮询(polling)方式,设备是以非阻塞的形式打开的,意味着 IO 操作不会立即完成,read 操作可能会返回一个错误代码

在网络IO时候,非阻塞IO也会进行recvform系统调用,检查数据是否准备好,与阻塞IO不一样,“非阻塞将大的整片时间的阻塞分成N多的小的阻塞, 所以进程不断地有机会 ‘被’ CPU光顾”。

也就是说非阻塞的recvform系统调用调用之后,进程并没有被阻塞,内核马上返回给进程,如果数据还没准备好,此时会返回一个error,返回值后,可以继续干点别的事情,然后再发起recvform系统调用,重复直到数据准备好,拷贝数据整个过程,进程仍然是属于阻塞的状态

img

io多路复用

elect轮询相对非阻塞的轮询的区别在于----前者可以等待多个socket,能实现同时对多个IO端口进行监听

信号驱动式io

允许Socket进行信号驱动IO,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。

img

异步非阻塞io

用户进程进行aio_read系统调用之后,无论内核数据是否准备好,都会直接返回给用户进程,然后用户态进程可以去做别的事情,IO两个阶段,进程都是非阻塞的

img

异步阻塞

业务逻辑需要的是做完一件事后做另一件事,这样的业务逻辑就需要调用者是以阻塞方式来工作

另外一种使用阻塞方式的理由是降低响应延迟

对实时系统或者延迟敏感的事务,有时采用阻塞方式比非阻塞方式更好

比较

在这里插入图片描述
除了异步io之外,所有的io模型都会在复制数据到用户空间时阻塞

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值