I/O模型(Linux)

概念

I/O输入/输出,分为IO设备和IO接口两部分,不同的I/O方式有不同的实现方式和性能,在不同的应用中可以选择不同的I/O方式。

Linux中的五种I/O模型

同步模型:阻塞IO、非阻塞IO、多路复用IO、信号驱动式
异步IO

在此之前,需要明白用户空间与内核空、进程切换、进程阻塞、文件描述符、缓存IO

用户空间与内核空间
操作系统将虚拟空间分为两部分,一部分是内核空间、一部分是用户空间。系统虚拟存储空间最高的1G供内核使用,成为内核空间;较低的3G供各个进程使用,称为用户空间。

进程的切换

进程是在CPU上面运行,内核有能力挂起正在CPU上运行的进程,并恢复以前在CPU上面挂起的某个进程。这叫进程的切换。
进程的切换会发生以下的变化

保存处理机上下文,包括程序计数器和其他寄存器。
更新PCB信息。
把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列。
选择另一个进程执行,并更新其PCB。
更新内存管理的数据结构。
恢复处理机上下文。

进程的阻塞

执行中的进程,期待某些事件未发生(请求资源失败、等待某种操作的完成、数据尚未到达等)由运行状态变为阻塞状态,进程的阻塞是进程自身的一种主动行为,只有运行态的进程才能将其转换为阻塞状态。

注意:进程进入阻塞状态时,是不会占用CPU资源的

文件描述符fd

文件描述符是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表,(当程序打开一个现有文件或者创建一个新的文件时,内核向进程返回一个文件描述符),文件描述符这一概念只适用于Unix、Linux这样的操作系统。

缓存IO

大多数文件系统的默认IO操作都是缓存IO,又称标准IO。
缓存IO缺点:在数据传输过程中的数据拷贝操作对内存和CPU的开销非常大

IO的本质就是socket的读取,也可理解为是对流的操作。、

同步阻塞IO

同步阻塞是最常见用的一个模型,也是最简单的。
用户应用程序执行一个系统调用,导致应用程序的阻塞,整个进程都被阻塞,不能处理其他的IO,调用的程序不消费CPU而是简单的等待状态。
在这里插入图片描述优点

能够及时返回数据,无延迟

缺点

用户的等待需要付出性能的待见

同步非阻塞 IO

同步非阻塞是采用轮询的方式;在执行该进程的时候中途可以执行其他进程(轮询检测内核数据,是否准备完成,准备完成之后进行数据处理),准备数据的过程中可以干别的事儿。

注意:数据的准备 过程中,进程处于阻塞状态

在这里插入图片描述优点

“后台”可以多任务在同时执行

缺点

任务完成的响应延迟增大,整体的TPS降低

IO多路复用

对多个IO接口进行监听,不断轮询对所有的socket,某个socket有数据到达,就通知用户的进程,IO之间的顺序会变。
优势:系统开销小、降低了系统的维护工作量、节省系统资源。

在这里插入图片描述

信号驱动式的IO

允许socket进行信号驱动,安装一个信号处理的函数。进程运行但是不阻塞。

在这里插入图片描述

异步非阻塞IO

相比较同步IO,异步IO不是顺序执行。(会先返回给用户进程,然后等到数据准备好,内核再向进程发送通知)
此时的两个阶段进程都是非阻塞的

在这里插入图片描述

小结

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45641605/article/details/105698819