Linux IO 模型

IO对象

IO操作涉及两个对象,一个是调用这个IO的请求进程,另一个就是系统内核。当一个read操作发生时,它会经历两个阶段:

  1. 等待数据准备好,并被拷贝到内核态的缓冲区
  2. 内核将内核态的缓冲区数据拷贝到用户态的进程缓冲区

阻塞与非阻塞

阻塞是指调用结果返回之前,当前请求进程会被挂起,只有在得到结果之后才会返回。非阻塞是指在不能立刻得到结果之前,会立刻返回。阻塞和非阻塞是针对请求进程而言的,主要区别在于第一阶段等待数据准备好的时候,但是在第二阶段,阻塞和非阻塞其实是没有区别的。

同步与异步

同步I/O会导致请求进程阻塞,直到I/O操作完成,异步I/O不会导致请求进程阻塞。同步和异步是针对系统内核而言的,描述了第二阶段系统内核如何把内核态缓冲区数据返回给用户态进程缓冲区。如果是请求进程自己去向系统内核获取,不管是阻塞还是非阻塞的方式,都是同步的; 如果是内核主动把内核态缓冲区数据拷贝到用户态进程缓冲区,则是异步的。

严格的讲,IO多路复用(select,poll,epoll)仍然是同步阻塞的,只是把阻塞点从同步阻塞的read改到了select等函数上。

只有Linux AIO,Windows IOCP可以做到异步非阻塞。


不严格的IO模型矩阵

不存在原生的异步阻塞IO模型

Simplified Matrix of Basic Linux I/O Models

同步阻塞模型

进程会一直阻塞,直到数据拷贝完成

Typical Flow of the Synchronous Blocking I/O Model

同步非阻塞模型

请求进程反复调用IO函数(多次系统调用,并马上返回);在数据拷贝的过程中,进程是阻塞的;

Typical Flow of the Synchronous Non-Blocking I/O Model

IO复用模型

其实还是一个同步阻塞模型,对一个IO端口,两次调用,两次返回,比阻塞IO并没有什么优越性;关键是能实现同时对多个IO端口进行监听;

信号驱动模型

是一个同步非阻塞模型,两次调用,两次返回。首先我们允许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。

异步非阻塞模型

模型比较

猜你喜欢

转载自blog.csdn.net/happykillerxxx/article/details/84582160