高级I/O
在Linux中,我们可以将所有的I/O都分为两步,第一步就是等,第二步是数据拷贝。
在学习编程的初级阶段,就可以发现I/O是一种十分浪费资源的行为,而这种资源的浪费主要是存在I/O的第一个阶段,即就是等待阶段。
对于I/O的理解,主要可以通过scanf函数,如果调用scanf函数,则执行流就会等待用户进行I/O操作,之后执行流才会执行下面的内容,但是scanf这种I/O模型只是Linux中I/O模型的一种。
阻塞式I/O
阻塞式I/O就是执行流会阻塞在要发生I/O的位置,等待I/O时间的发生。
阻塞式I/O是我目前最常见的I/O模型,从最早的scanf函数开始,就已经接触到了阻塞式I/O。
非阻塞式I/O
非阻塞式I/O表示执行流不会停在将要发生I/O的位置,当执行流到达I/O发生的位置,执行流会去检测目前I/O动作是否发生,如果没有发生则并不阻塞,而是设置error,可以去做另外的一些任务,但必须对I/O时间进行循环检测,该循环机制是由程序员来控制的。
目前我接触过的非阻塞I/O并不多,仅仅是在做项目时使用过recv的非阻塞I/O模式。
信号驱动I/O
信号驱动I/O是指执行流到达将要发生I/O的位置时也并不会去检测此时I/O是否发生,而是继续执行程序的代码,当I/O动作发生时,操作系统会向进程发送信号,此时进程就会立即进行数据的拷贝。
键盘输入即就是一种信号驱动I/O,当键盘发生I/O动作时会立即触发CPU中断。
多路转接/多路复用I/O
多路转接I/O的意思是将多个文件描述符交给一个对象来管理,每一次检测,管理的对象就会检测相应的文件描述符是否有进行I/O行为。
异步I/O
前四种I/O模型都是同步I/O,同步I/O必须自己进行等待和数据的拷贝,异步I/O不用自己进行等待和数据的拷贝。
非阻塞I/O
一个文件描述符默认情况下都是采用阻塞I/O的。使用系统调用接口可以改变文件描述符的I/O模式。
#include <fcntl.h>
#include <unistd.h>
int