IO模型
一个输入操作包括两个阶段:
(1)等待数据准备好
(2)从内核向进程复制数据
对于套接字输入来说,第一步是等待数据从网络中到达,当所等待分组到达时,它被复制到内核中某个缓冲区;第二步是把数据从内核缓冲区复制到应用进程缓冲区.
阻塞式IO
默认情况下,所有IO都是阻塞式的
recvfrom作为一个阻塞式IO,系统调用直到数据报到达,且被复制到应用进程的缓冲区中或返回错误才返回。
非阻塞式IO模型
进程把一个套接字设置成非阻塞是在通知内核:
当所请求的IO操作要把本进程投入睡眠才能完成时,不要把本进程投入睡眠,而是返回一个错误。
非阻塞式IO采用轮询的方式。调用recvfrom时,一旦内核没有数据报准备好,就返回错误EWOULDBLOCK;过一段时间再次调用recvfrom,一直到复制数据报,返回成功指示。
IO复用模型
系统阻塞于select进程,直到我们指定的数据报变为可读,再调用recvfrom进行IO操作。单纯来看,select似乎并不比阻塞式IO有效,且由于有两个系统调用,因此可能存在劣势。select的优势在于可以等待多个描述符准备就绪。
信号驱动式IO模型
使用信号。让内核在描述符准备就绪时,通过信号通知进程。从而让进程调用IO。
信号为SIGIO。
异步IO
异步IO的机制是:IO操作不会影响到主程序主循环。进程告知内核去完成IO操作,内核在整个操作(包括将数据从内核复制到缓冲区)完成以后,才会通知我们,期间进程继续执行。
异步IO和信号驱动式IO的区别在于,信号驱动式IO是内核通知我们什么时候可以执行IO操作,而异步IO是内核通知我们IO操作何时完成。