一、简介
本文向大家介绍五种I/O模型。分别是阻塞I/O、非阻塞I/O、I/O复用、信号驱动式I/O、异步I/O等。内容参考《UNIX网络编程》,大家想进深入学习网络编程,建议去读读这本书。
二、模型介绍
(一)、阻塞I/O模型
阻塞I/O是最简单的I/O,一般表现为进程或线程等待某个条件,如果条件不满足,则一直等下去。条件满足,则进行下一步操作。
上图中,应用进程通过系统调用 recvfrom 接收数据,但由于内核还未准备好数据报,应用进程就阻塞住了。直到内核准备好数据报,recvfrom 完成数据报复制工作,应用进程才能结束阻塞状态。
这里简单解释一下应用进程和内核的关系。内核即操作系统内核,用于控制计算机硬件。同时将用户态的程序和底层硬件隔离开,以保障整个计算机系统的稳定运转(如果用户态的程序可以控制底层硬件,那么一些病毒就会针对硬件进行破坏,比如 CIH 病毒)。应用进程即用户态进程,运行于操作系统之上,通过系统调用与操作系统进行交互。上图中,内核指的是 TCP/IP 等协议及相关驱动程序。客户端发送的请求,并不是直接送达给应用程序,而是要先经过内核。内核将请求数据缓存在内核空间,应用进程通过 recvfrom 调用,将数据从内核空间拷贝到自己的进程空间内。大致示意图如下:
阻塞 I/O 理解起来并不难,不过这里还是举个例子类比一下。
例1:假设大家日常工作流程设这样的(其实就是我日常工作的流程