一.IO 模型的分类
IO 模型根据实现的功能可以划分为为阻塞 IO、非阻塞 IO、信号驱动IO,IO多路复用和异步 IO。根据等待 IO 的执行结果进行划分,前四个 IO 模型又被称为同步IO.
同步IO与异步IO:
以现实生活去餐馆吃饭为例,根据菜单进行点餐之后,这时会存在两个选择,第一个选择是在餐馆等待饭菜制作完毕,这就是同步 IO 的具体表现。第二个选择是,离开餐馆去做其他的事情,工作人员会在饭菜制作完成之后提醒你回餐馆取餐,这就是异步IO的具体表现。
二.阻塞IO
以阻塞读为例:进程进行 IO 操作时(如 read 操作),首先会发起一个系统调用,从而转到内核空间进行处理,内核空间的数据没有准备就绪时,进程会被阻塞,不会继续向下执行,直到内核空间的数据准备完成后,数据才会从内核空间拷贝到用户空间,最后返回用户进程,由用户空间进行数据的处理。
阻塞 IO 比较有代表性的是 C 语言中的 scanf()函数。
#include <stdio.h>
int main(void){
int i;
scanf("%d",&i);
printf("i = %d\n",i);
return 0;
}
编译完成之后,输入“./io”运行可执行文件,如下所示,键盘没有输入数据时,该任务会持续阻塞,当在键盘上输入“123”之后,输入的值才会被打印出来。