I/O模型

Unix下5种I/O模型。

There are normally two distinct phases for an input operation:
一个输入操作通常包含两个不同的阶段:
1.Waiting for the data to be ready
1.等待数据准备好
2.Copying the data from the kernel to the process
2.将数据从内核复制到进程

For an input operation on a socket:
The first step normally involves waiting for data to arrive on the network. When the packet arrives, it is copied into a buffer within the kernel.
The second step is copying this data from the kernel’s buffer into our application buffer.
对于一个套接字上的输入操作而言:
第一步是等待数据通过网络传输到达。当数据到达后,会被复制到内核中的某个缓冲区。
第二步是将数据从内核缓冲区复制到应用进程缓冲区。

阻塞式I/O (blocking I/O)

By default, all sockets are blocking.
默认情况下,所有套接字都是阻塞的。

The process calls function and the system call does not return until the datagram arrives and is copied into our application buffer, or an error occurs.
当进程调用函数获取数据时,系统调用直到(数据到达内核并且被复制到进程缓冲区后 OR 调用发生错误时)才会返回。

The process is blocked the entire time from when it calls function until it returns.
进程从调用函数到函数返回的整段时间内都是被阻塞的。

非阻塞式I/O (nonblocking I/O)

When we set a socket to be nonblocking, we are telling the kernel “when an I/O operation that I request cannot be completed without putting the process to sleep, do not put the process to sleep, but return an error instead.”
进程把一个套接字设置为非阻塞就是在通知内核:“当进程请求I/O操作且只有把进程阻塞才能完成工作时,才把进程阻塞,否则不要阻塞进程而是返回一个错误。”

进程会在数据通过网络到达内核前,不断地循环调用函数(轮询(polling)),函数会立即返回,在此期间进程并不阻塞。
在数据到达内核缓冲区后,进程再次调用函数才会阻塞,等待数据从内核缓冲区复制到进程缓冲区。

I/O复用 (I/O multiplexing)

I/O复用需要两个函数来完成获取数据的操作:
进程调用第一个函数会阻塞在等待数据通过网络到达内核时期。
进程调用第二个函数会阻塞在等待数据从内核缓冲区复制到进程缓冲区时期。

信号驱动式I/O (signal driven I/O)

与非阻塞式I/O对比,在等待数据通过网络到达内核时期,信号驱动式I/O并不通过轮询来查询数据是否到达,而是数据到达后内核会向进程发送信号来通知进程数据已达到内核。

在数据通过网络到达内核前,进程是非阻塞的。
在等待数据从内核复制到进程期间,进程是阻塞的。

异步I/O (asynchronous I/O)

与信号驱动式I/O相比,采用异步I/O,内核并不会在数据到达内核时通知进程,而是数据到达进程缓冲区后才会通知进程。在整个获取数据的过程中,进程都是非阻塞的。

In general, these functions work by telling the kernel to start the operation and to notify us when the entire operation (including the copy of the data from the kernel to our buffer) is complete.
一般来说,这些函数的工作机制是:告知内核启动某个操作,并且让内核在整个操作(包括将数据从内核复制到进程缓冲区)完成后再通知调用函数的进程。

同步/异步

A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes.
“同步I/O”操作会导致请求进程阻塞,直到I/O操作完成。
An asynchronous I/O operation does not cause the requesting process to be blocked.
“异步I/O”操作不会导致请求进程阻塞。

The first four I/O models—blocking, nonblocking, I/O multiplexing, and signal-driven I/O—are all synchronous.
前4种I/O模型——阻塞式I/O、非阻塞式I/O、I/O复用、信号驱动式I/O均是“同步I/O”。