0
点赞
收藏
分享

微信扫一扫

Linux | 五种io模型以及比较

吃面多放酱 2022-02-13 阅读 55
linux

同步阻塞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模型都会在复制数据到用户空间时阻塞

举报

相关推荐

0 条评论