IO模型

一个输入操作包括两个阶段:
(1)等待数据准备好
(2)从内核向进程复制数据
对于套接字输入来说,第一步是等待数据从网络中到达,当所等待分组到达时,它被复制到内核中某个缓冲区;第二步是把数据从内核缓冲区复制到应用进程缓冲区.

阻塞式IO

默认情况下,所有IO都是阻塞式的
IO模型
recvfrom作为一个阻塞式IO,系统调用直到数据报到达,且被复制到应用进程的缓冲区中或返回错误才返回。

非阻塞式IO模型

进程把一个套接字设置成非阻塞是在通知内核:
当所请求的IO操作要把本进程投入睡眠才能完成时,不要把本进程投入睡眠,而是返回一个错误。
非阻塞式IO采用轮询的方式。调用recvfrom时,一旦内核没有数据报准备好,就返回错误EWOULDBLOCK;过一段时间再次调用recvfrom,一直到复制数据报,返回成功指示。

IO复用模型

系统阻塞于select进程,直到我们指定的数据报变为可读,再调用recvfrom进行IO操作。单纯来看,select似乎并不比阻塞式IO有效,且由于有两个系统调用,因此可能存在劣势。select的优势在于可以等待多个描述符准备就绪。
IO模型

信号驱动式IO模型

使用信号。让内核在描述符准备就绪时,通过信号通知进程。从而让进程调用IO。
信号为SIGIO。

异步IO

异步IO的机制是:IO操作不会影响到主程序主循环。进程告知内核去完成IO操作,内核在整个操作(包括将数据从内核复制到缓冲区)完成以后,才会通知我们,期间进程继续执行。
异步IO和信号驱动式IO的区别在于,信号驱动式IO是内核通知我们什么时候可以执行IO操作,而异步IO是内核通知我们IO操作何时完成。