Linux中的五种IO模型

Linux中有以下五种IO模型

一、同步阻塞IO(Blocking IO, BIO)

用户进程发起IO调用后就阻塞线程让出CPU,等待内核处理完毕返回结果再唤醒继续执行。
Linux中的五种IO模型_第1张图片

二、同步非阻塞IO(Non-Blocking IO, NIO)

用户进程发起IO调用后就立即返回然后可以去做其它事,在这个过程中询问内核IO执行完没有,完了就获取返回结果。
Linux中的五种IO模型_第2张图片

三、IO多路复用

线程通过read()、write()这些系统调用只能阻塞在一个文件描述符(fd)上,而IO多路复用是指通过一个结构绑定监听多个文件描述符,在线程中通过一次IO系统调用可阻塞在多个文件描述符上,内核发现这些文件有新的IO事件时就通知线程并返回结果让线程去处理这些IO事件。这样就可以更加高效地同时完成对多个文件的操作。Linux中提供的IO多路复用实现有select/poll/epoll

Linux中的五种IO模型_第3张图片

什么是I/O 多路复用:select、poll、epoll讲解

四、信号驱动 I/O

信号驱动式IO是在NIO的基础上,事先向内核注册信号处理程序 (设置回调),内核在IO就绪之后,将直接向进程发送SIGIO信号 (执行回调),这样用户进程就不需要一直去询问。

Linux中的五种IO模型_第4张图片

实际上,SIGIO 一般只用在UDP协议,而TCP基本无效。原因是,UDP协议中能触发SIGIO信号的IO事件只有两种:

  • 有数据报可读
  • 套接字发生异步错误

而 TCP中能触发SIGIO的IO事件太多,且信号处理程序不能直接获取到就绪的事件类型和事件源fd。此外信号IO也不能用于IO多路复用,因为没法区分是哪个fd引发的信号。

五、异步 I/O(Async IO, AIO)

与前面的IO模型不同的是,AIO是将用户空间与内核之间的数据拷贝也交给内核处理了,用户进程执行了AIO调用后就可以去做其它事了,内核完成整个IO操作后就会给用户进程发送信号或者直接执行设置的回调函数。
Linux中的五种IO模型_第5张图片
Linux 实现的AIO在网络IO中一般也不使用,原因有:

  • 不好实现IO多路复用 (通过信号不能区分)
  • lO处理过程中出现异常用户进程不好干预内核
  • 进行CPU Copy同样需要占用CPU资源,高并发场景下性能提升有限

参考:

  1. https://www.zhihu.com/question/382972191/answer/1113293711
  2. https://blog.csdn.net/weixin_39411321/article/details/97645862

你可能感兴趣的:(#,操作系统,linux,io)