Linux支持五种IO模型,分别是:
阻塞式I/O (Blocking I/O)
非阻塞式I/O (Non-blocking I/O)
I/O复用 (I/O Multiplexing)
信号驱动式I/O (Signal-driven I/O)
异步I/O (Asynchronous I/O)
一. 阻塞式I/O
应用程序执行一个I/O操作后,必须等待I/O操作的完成
具体流程如下:
调用I/O操作
等待数据准备就绪
数据拷贝到应用程序
I/O操作完成
二.非阻塞式I/O
应用程序执行一个I/O操作后立即返回,不等待数据准备
具体流程如下:
调用I/O操作
如果数据准备好了,立即拷贝;如果没有准备好,就返回一个错误代码
应用程序需要不断地重试I/O操作,直到数据准备好
三.I/O复用
使用select或poll等系统调用来监视多个文件描述符,看其是否准备就绪
具体流程如下:
调用select或poll等待数据准备
一旦数据准备就绪,操作系统将通知应用程序
应用程序再执行I/O操作读取数据
四.信号驱动式I/O
具体流程如下:
应用程序请求接收一个信号来告知数据何时准备就绪。
当数据准备好时,操作系统发送一个信号。
在信号处理器中,应用程序启动I/O操作来读取数据。
五.异步I/O
应用程序请求I/O操作并立即返回,操作系统完成所有的工作(包括等待和数据拷贝),并在整个I/O操作完成后通知应用程序
具体流程如下:
应用程序发起一个异步I/O请求。
操作系统等待数据准备,然后拷贝数据。
操作系统通知应用程序I/O已完成。
ps:全是自己画的图,所以希望大家点点赞!