天天看点

Unix下的I/O模型

Unix可用的5种I/O模型的基本区别:

1,阻塞I/O

2,非阻塞I/O

3,I/O复用(select和poll)

4,信号驱动I/O(SIGIO)

5,异步I/O(POSIX的aio_系列函数)

一个输入操作通常包含两个不同的阶段:

1,等待数据准备好。

2,从内核到进程拷贝数据。

对于一个套接口上的操作,第一步通常涉及等待数据从网络中到达。当所等待分组到达时,它被拷贝到内核的某个缓冲区。第二步就是从内核缓冲区拷贝到应用进程缓冲区。

>阻塞I/O模型

最流行的I/O模型是阻塞I/O(blocking I/O)模型。缺省情况下,所有套接口都是阻塞的。

>非阻塞I/O模型

进程把一个套接口设置成非阻塞是在通知内核:当所请求的I/O操作非得把本进程投入睡眠才能完成时,不要把本进程投入睡眠,而是返回一个错误。

>I/O复用模型

有了I/O复用(I/O multiplexing),我们就可以调用select或poll,阻塞在这两个系统调用中的某一个之上,而不是阻塞在真正的I/O系统调用上。使用select的优势在于我们可以等待多个描述符就绪。

>信号驱动I/O模型

我们也可以用信号,让内核在描述字就绪时发送SIGIO信号通知我们。我们称这种模型为信号驱动I/O(signal-driven I/O)。

>异步I/O模型

异步I/O(asynchronous I/O)由POSIX规范定义。一般的说,这些函数的工作机制是:告知内核启动某个操作,并让内核在整个操作(包括将数据从内核拷贝到我们自己的缓冲区)完成后通知我们。这种模型和信号驱动模型的主要区别在于:信号驱动I/O是由内核通知我们何时可以启动一个I/O操作,而异步I/O模型是由内核通知我们I/O操作何时完成。

同步I/O与异步I/O

POSIX把这两个术语定义如下: