IO 其实就是 Input 和 Output,在操作系统中就对应数据流的输入与输出。这个数据流的两端,可以是文件,也可以是网络的一台主机。但无论是文件,还是网络主机,其传输都是类似的,我们今天就以源头为文件进行说明。
一个文件要从磁盘到我们的内存,需要经过很复杂的操作。首先,需要将数据从硬件读取出来,然后放入操作系统内核缓冲区,之后再将数据拷贝到程序缓冲区,最后应用程序才能读取到这个文件。简单地说,无论什么 IO 模型,其读取过程总会经历下面两个阶段:
而我们 Linux 根据这两个阶段的是否阻塞,分成了 5 个经典的 IO 的模型,分别是: