当前位置: 代码迷 >> 综合 >> 2022-2-23
  详细解决方案

2022-2-23

热度:80   发布时间:2023-10-14 11:29:04.0

2022-2-23

  • I/O设备
    • 标准协议
    • 利用中断减小开销
    • 利用DMA进行更高效的数据传送
    • 设备驱动程序
  • 磁盘驱动器
    • 磁盘调度
      • SSTF:最短寻道时间优先
      • SPTF:最短定位时间优先

I/O设备

标准协议

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

利用中断减小开销

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

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

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

设备驱动程序

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

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

磁盘驱动器

磁盘调度

SSTF:最短寻道时间优先

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

SPTF:最短定位时间优先

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