浅谈IO概念与IO模型

什么是IO

众所周知,Linux系统继承了Unix系统的概念 - 一切皆文件,那么这里讲的文件到底是指是什么呢?这里通常指Linux系统中的VFS文件系统下的文件,VFS文件系统提供通用的接口对接各种类型的二进制流。
如图所示:

因此,不管socket、还是FIFO、管道、终端等,对于LInux来说、一切都是文件、一切都是流。
在信息交换的过程中、我们都是对这些流进行数据的收发操作、简称为I/O操作(input and output)、往流中读出数据系统调用read、写入数据系统调用write。
在计算机中有许许多多的流,因此在程序操作中,需要针对指定的流进行操作的时候,我们需要创建对应的文件描述符,即通常所说的fd(file descriptor),文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。
因此对这个fd的操作、就是对这个文件(流)的操作,我们创建一个socket/读写一个文件,通过系统调用会返回一个文件描述符,那么接下来的操作就会转化为对这个描述符的操作,这就是IO操作。

IO模型

IO操作,指操作体(进程/线程/协程)与fd(文件、流)之间的通讯交互。因此IO模型是指该通讯交互的方式。主要有以下几种

  • 阻塞IO(同步)

主要指操作体在系统完成指定流的数据读取拷贝前,持续处于阻塞状态。

  • 非阻塞IO(同步)

主要指操作体在对应IO就绪之前不阻塞处于轮询状态,等待轮询返回就绪后,进入阻塞等待数据拷贝完成。

  • IO复用(同步)

主要指可以通过select/poll/epoll发起系统调用,可以同时监听多个IO,只要其中一个IO就绪,系统就返回通知,并拷贝对应IO的数据,在此期间持续阻塞。

  • 信号驱动IO(同步IO)

主要指操作体在发起系统调用后,不必处于阻塞状态,对应IO就绪后系统会通过信号量通知操作体可以发起操作。

  • 异步IO

主要指操作体在发起系统调用后,无需阻塞等待,系统内核在IO就绪后完成数据拷贝,再调起操作体的对应函数(回调)。

原文地址:https://www.cnblogs.com/kirachen/p/12403760.html