浅谈IO概念与IO模型

什么是IO

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

316153-20200303180324730-2089960655.png

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

IO模型

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

  • 阻塞IO(同步)

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

316153-20200303175957798-41504472.jpg

  • 非阻塞IO(同步)

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

316153-20200303180345654-874639403.jpg

  • IO复用(同步)

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

316153-20200303180353179-2254526.jpg

  • 信号驱动IO(同步IO)

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

316153-20200303180403813-1691602343.jpg

  • 异步IO

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

316153-20200303180417267-1370949400.jpg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值