2022-2-23

本文介绍了I/O设备管理的基本原理,包括设备接口、中断机制和DMA(直接存储器访问)如何提高数据传输效率。讨论了中断与轮询的优缺点,并阐述了磁盘驱动器的调度算法,如SSTF和SPTF策略。设备驱动程序在操作系统中的作用也被提及,强调了通用接口与特定设备功能之间的权衡。
摘要由CSDN通过智能技术生成

I/O设备

标准协议

一个简化的设备接口包含三个寄存器:状态寄存器、指令寄存器、数据寄存器,操作系统与该设备的经典交互如下
在这里插入图片描述
该协议包含 4 步。第 1 步,操作系统通过反复读取状态寄存器,等待设备进入可以接收命令的就绪状态。我们称之为轮询(polling)设备(基本上,就是问它正在做什么)。第2 步,操作系统下发数据到数据寄存器。例如,你可以想象如果这是一个磁盘,需要多次写入操作,将一个磁盘块(比如 4KB)传递给设备。如果主 CPU 参与数据移动(就像这个示例协议一样),我们就称之为编程的 I/O(programmed I/O,PIO)。第 3 步,操作系统将命令写入命令寄存器;这样设备就知道数据已经准备好了,它应该开始执行命令。最后一步,操作系统再次通过不断轮询设备,等待并判断设备是否执行完成命令(有可能得到一个指示成功或失败的错误码)。
这个简单协议的问题是:在轮询的时候,cpu什么也不干,浪费了cpu时间

利用中断减小开销

利用中断后,cpu不用轮询设备,而是向设备发出一个请求后进入休眠,执行其他的进程,下面是轮询和中断的时间线
在这里插入图片描述
在这里插入图片描述
但这种方法也不是任何时刻都好用,如果设备性能非常高,在第一次轮询的时候就能返回结果,那么使用中断反而会拖慢进程

利用DMA进行更高效的数据传送

如果需要用cpu将一块数据传输给设备,也会浪费时间和算力
在这里插入图片描述
进程 1 在运行过程中需要向磁盘写一些数据,所以它开始进行 I/O 操作,将数据从内存拷贝到磁盘(其中标示 c 的过程)。拷贝结束后,磁盘上的 I/O 操作开始执行,此时 CPU 才可以处理其他请求。
这时我们可以使用DMA引擎,他负责协调内存和设备间的数据传输,cpu将要传输的数据的地址高速DMA,DMA负责完成传输
在这里插入图片描述

设备驱动程序

每个设备都有非常具体的接口,如何将它们纳入操作系统,而我们希望操作系统尽可能通用。并且我们希望这些操作对用户隐形
使用Linux文件系统栈作为例子

在这里插入图片描述
可以看出,文件系统(当然也包括在其之上的应用程序)完全不清楚它使用的是什么类型的磁盘。它只需要简单地向通用块设备层发送读写请求即可,块设备层会将这些请求路由给对应的设备驱动,然后设备驱动来完成真正的底层操作。
注意,这种封装也有不足的地方。例如,如果有一个设备可以提供很多特殊的功能,但为了兼容大多数操作系统它不得不提供一个通用的接口,这样就使得自身的特殊功能无法使用。这种情况在使用 SCSI 设备的 Linux 中就发生了。SCSI 设备提供非常丰富的报告错误信息,但其他的块设备(比如 ATA/IDE)只提供非常简单的报错处理,这样上层的所有软件只能在出错时收到一个通用的 EIO 错误码(一般 IO 错误),SCSI 可能提供的所有附加信息都不能报告给文件系统。

磁盘驱动器

磁盘调度

SSTF:最短寻道时间优先

SSTF 按磁道对 I/O 请求队列排序,选择在最近磁道上的请求先完成。例如,假设磁头当前位置在内圈磁道上,并且我们请求扇区 21(中间磁道)和 2(外圈磁道),那么我们会首先发出对 21 的请求,等待它完成,然后发出对 2 的请求。
在这里插入图片描述

SPTF:最短定位时间优先

这种方法可以简单称为:视情况而定。也即的情况是旋转与寻道相比的相对时间。如果在我们的例子中,寻道时间远远高于旋转延迟,那么 SSTF(和变体)就好了。但是,想象一下,如果寻道比旋转快得多。然后,在我们的例子中,寻道远一点的、在外圈磁道的服务请求 8,比寻道近一点的、在中间磁道的服务请求 16 更好,后者必须旋转很长的距离才能移到磁头下。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值