【操作系统学习笔记⑬】——设备管理(上) [直接查询、中断方式、DMA方式、缓冲技术、驱动调度技术与算法]

2023-05-16



文章目录

  • 一、导语
  • 二、设备管理的基础知识点
    • 2.1 设备的分类
    • 2.2 设备管理的功能
  • 三、I/O 控制方式 ⭐️
    • 3.1 程序直接查询控制方式
    • 3.2 中断方式
    • 3.3 DMA 方式
    • 3.4 通道方式
  • 四、缓冲技术
    • 4.1 单缓冲
    • 4.2 双缓冲
    • 4.3 循环缓冲
    • 4.4 缓冲池
  • 五、驱动调度技术
    • 5.1 磁盘的物理结构(磁盘、盘片、盘面、磁道、扇区、柱面)
    • 5.2 磁盘的访问时间
    • 5.3 磁盘调度 —— 4种算法⭐️⭐️⭐️
      • 5.3.1 先来先服务算法(FCFS)
      • 5.3.2 最短寻道时间优先(SSTF)
      • 5.3.3 扫描算法(SCAN)
      • 5.3.4 循环扫描算法(CSCAN)
      • 5.3.5 分步扫描算法(N-Step-SCAN)+ FSCAN算法 —— 只作了解
    • 5.4 提高磁盘 I/O 速度的一些方法 —— 只作了解
  • 六、参考附录:


Device Management… 💻

上一篇文章地址链接:【操作系统⑫】——存储管理(下)【分段存储管理 虚拟存储管理 段页式存储管理方案 页面置换算法 OPT FIFO LRU】.
下一篇文章地址链接:【操作系统学习笔记⑭】——设备管理(下) [ 设备分配、虚拟设备——SPOOLing ].

期末考试总复习——地址链接:《操作系统期末总复习——绝地求生版》.


一、导语

本文脉络
  ① 首先介绍常用的设备和 CPU 之间的数据传送控制的四种方式:程序查询方式、中断方式、DMA方式、通道方式。
  ② 为了匹配设备和 CPU 之间的处理速度,介绍了三种常用的缓冲技术:单缓冲、双缓冲和循环缓冲。
  ③ 然后介绍了磁盘这种特殊设备的结构及其调度算法。
  ④ 接着介绍设备分配的过程,以及分配时所用到的数据结构和其他需考虑的因素。(下一篇文章讲)
  ⑤ 最后介绍了虚拟设备及其实现技术。(下一篇文章讲)



二、设备管理的基础知识点

设备管理:指操作系统对计算机系统中除 CPU 和内存以外的设备的管理。

设备管理的主要任务:完成用户提出的输入输出请求,提高输入输出的速率,以及改善输入输出设备的利用率。

● 设备不但种类繁多,而且它们的特性和操作方式相差很大,因此,设备管理是操作系统资源管理中最为复杂、最多样化,且与硬件密切相关的部分


2.1 设备的分类

  • 按传输速率分类
    低速设备:指每秒传输 几B~几百B 的一类设备。这类设备中典型的如键盘、鼠标器、语音的输入和输出等设备。
    中速设备:指每秒传输 几千B~数十千B 的一类设备。这类设备中典型的如行式打印机、激光打印机等设备。
    高速设备:指每秒数传输 几百KB~数十MB 的设备。这类设备中典型的如磁带机、磁盘机、光盘机等。

  • 按信息交换的单位分类
    块设备:用于存储信息。由于信息的存取是以数据块为单位,故称块设备,它属于有结构设备。块设备的基本特征是可寻址,可随机地读/写任意一块;块设备的另一特征是其输入/输出采用DMA方式。典型的块设备是磁盘。
    字符设备:用于数据传输的基本单位是字符,它属于无结构设备。其基本特征是不可寻址。此外,字符设备在I/O时常采用中断驱动方式。字符设备的种类较多,如交互式终端、打印机等。

  • 按资源分配分类
    独占设备:指在一段时间内只允许一个用户(进程)使用的设备。独占设备的分配可能会引起进程死锁。
    共享设备:指在一段时间内允许多个进程同时访问的设备。典型的共享设备是磁盘。
    虚拟设备:指通过某种技术将一台独占设备变换为能供若干个用户共享的设备,从而提高设备的利用率。


2.2 设备管理的功能

① 提高系统的利用率的关键之一是实现设备的并行性

② 为了提高设备的利用率,在进行设备分配时系统通常采用动态分配方式。对于独占设备往往采用虚拟技术将其改造为共享设备。

③ 设备的速率相对 CPU 而言要慢得多。为了平滑两者之间的差异,在设备管理中采用多种缓冲技术

④ 设备管理还要方便用户的使用



三、I/O 控制方式 ⭐️

● “I/O 控制方式” 即是 “输入/输出控制方式”。控制设备和内存之间的数据传送是设备管理中最为重要的任务之一。

  • 选择和衡量数据传输控制方式的原则有
    ① 数据传输速度足够高,既能满足用户的要求,又不会丢失数据。
    ② 系统开销小,需要的处理控制程序少。
    ③ 充分发挥主机和设备的功能,提高两者并行的程度。

常见的 I/O 控制方式有:程序直接查询控制方式、中断方式、DMA方式和通道方式。

I/O 控制方式发展的宗旨和目标是 ——> 尽可能减少主机对外设的干预,即尽可能把主机从繁杂的 I/O 控制中解脱出来,以便有更多时间进行其他处理。


3.1 程序直接查询控制方式

  • 该控制方式的运行机制
    ① 用户进程直接控制主机和外围设备之间的数据传输。
    ② 用户进程与外围设备读取数据时,主机向设备控制器发出读指令后进入测试等待状态。
    ③ 在等待时间内,主机重复查询外设的准备状态直至外设准备就绪。
    ④ 外设就绪后,数据才能开始传送,主机从设备控制器读取一个字,再向内存写一个字。
    ⑤ 如果传送还未结束,再次向设备控制器发出读指令,直到全部数据传输完成再返回现行程序执行。
    ⑥ 用户进程向外设写数据与读数据基本类似。
    在这里插入图片描述

对上图的说明
  ① 程序查询方式中,一旦主机启动外设,便不断查询外设的准备情况,终止了原程序的执行,浪费了宝贵的主机时间。(比如说,就好像 VS2019 运行时出现一个 Bug,弹窗出现,而之后我们在 VS 上点啥也没反应,只有点红框里面的内容。这就相当于 “VS2019的进程” 一直在查询我们 “鼠标(外设)的输入”)
  ② 另一方面,外设准备就绪后,主机参与数据的传送工作,此时主机也不能执行原程序。可见这种方式中,主机和外设串行工作,使主机不能充分发挥效率。

在这里插入图片描述

● 如果想更详细地了解查询时方式的内部运行机制,可以参考链接: 【计算机原理与接口技术(UNIX)⑮】——输入/输出系统【查询方式、中断控制方式、DMA 、8237A】的第 2.2 节。


3.2 中断方式

● 中断方式是程序查询式的改进。

  • 中断方式的运行机制
    ① 在主机启动外设后,不必查询外设是否已经就绪,而是继续执行自己的现行程序。(此时主机和外设处于 “并行工作” 状态)
    ② 外设准备完毕后,它会将数据传送至设备控制器的寄存器,然后向主机发出中断请求
    ③ 主机接到中断请求后,会从设备控制器中将数据读入内存的指定单元。

在这里插入图片描述

  • 对上图的说明
    ① 图的右上角,虚线部分就代表 “CPU 对设备控制器发出读指令后,就去处理其他事件,不会像查询方式那样干等着”
    ② 含有 “中断” 的那根虚线,是外设发出的中断请求。只有该中断请求发出时,设备控制器的状态才会转变为 “就绪状态”,接着 CPU 才会执行 “就绪” 两个字下面的流程图。
    ③ 很显然,中断机制引入后,外围设备就有了反映其状态的能力。

● 中断方式在一定程度上提高了主机和外设的并行程度,提高计算机系统资源的利用率。


3.3 DMA 方式

DMA 方式引入的原因:中断方式消除了程序直接查询方式的 “忙查询”,提高了主机的利用率。但是中断方式中数据传输都是以字节为单位进行的。如果采用中断方式,想传输一个1KB的数据块时,系统需要中断1024次,显然这样很花费主机的时间。

● 如果外设能直接与内存交换数据而不占用主机,那么,主机资源的利用率还可提高。这就出现了直接内存存取(Direct Memory Access,DMA)方式

● 在 DMA 方式中,内存和外设之间有一条数据通路,在内存和外设之间成块传送数据过程中,由 “DMA 控制器” 取代主机来控制数据传输,直接执行到数传输完成。

DMA 方式的特点
  ① 数据传输的基本单位是数据块,即在主机与外设之间传送一个数据块。
  ② 传送的数据直接从外设到内存,或者相反。
  ③ 仅在传送一个数据块或多个数据块的开始和结束时,才需要主机的干预。


“DMA 控制器” 由三个部分组成:“主机与 DMA 的接口”、“DMA 控制器与设备的接口” 和 “I/O 逻辑”。 它的组成结构图如下所示:
在这里插入图片描述

为实现 CPU 与控制器之间成块的进行数据传输,必须在 DMA 控制器中设置如下4类寄存器
  ① 命令/状态寄存器(CR):用于接收从 CPU 发出来的 I/O 命令或有关控制信息,或设备的状态。
  ② 内存地址寄存器(MAR):在输入时,存放把数据从设备传送到内存的起始目标地址;在输出时,存放由内存到设备的内存源地址
  ③ 数据寄存器(DR):用于暂存从设备到内存,或从内存到设备的数据。
  ④ 数据计数器(DC):存放本次 CPU 要读写的字节数。


DMA 的工作过程:以 CPU 从磁盘读取数据为例,介绍 DMA 方式的工作过程,如下图所示。

在这里插入图片描述
对上图的说明
  ① CPU 要从磁盘读数据时,便向磁盘发一条指令。该命令被传送到 CR 中。同时,将本次数据存放在内存中的起始地址送给 MAR ,将要读取数据的字节数传送给 DC,还要将磁盘中的源地址送给 DMA 中的 I/O 逻辑。
  ② 启动 DMA控制器 进行数据传送,CPU 可以处理其他任务。此后,整个传输过程中均由 DMA 进行控制。每传送一个字, DC 计数器减1,直至 DC计数器 为0,整个传输过程结束。


3.4 通道方式

通道:独立于 CPU 的专门实现输入输出工作的处理机,故又称 “输入输出处理器”。

通道的功能:支持控制设备和内存之间进行数据传送,能把 CPU 从琐碎的输入输出操作中解放出来。此外,外围设备和 CPU 能实现并行操作;通道和通道之间能实现并行操作;各通道上的外围设备也能实现并行操作,以达到提高整个系统效率这一根本目的。

通道与一般处理机的区别
  ① 通道指令单一。通道硬件比较简单,其所能执行的 指令主要是与输入输出操作有关的指令。
  ② 通道没有自己的内存。通道所执行的通道程序是放在计算机内存中的,也就是说通道与 CPU 共享系统的内存。

通道的分类:【按信息交换方式而分】
  ① 字节多路通道
  ② 数组选择通道
  ③ 数组多路通道


四、缓冲技术

为什么要采用缓冲技术?
● 为了改善 CPU 与外设之间速度不匹配的矛盾,减少 I/O 对 CPU 的中断次数,提高 CPU 和 I/O 设备的并行性,在操作系统中普遍采用了缓冲技术。

缓冲技术的基本思想是:当一个进程输出数据时,先向系统申请一块内存作为输出缓冲区;然后,将输出数据高速输出到缓冲区;不断把数据填到缓冲区,直到缓冲区被装满为止;此后,进程可以继续它的计算,同时,系统将缓冲区内容写到 I/O 设备上。当一个进程执行读操作输入数据时,过程与此类似。

常见的缓冲区技术有:单缓冲、双缓冲、多缓冲(循环缓冲、缓冲池等)。接下来将依次讲解。


4.1 单缓冲

单缓冲:只在设备和 CPU 之间设置一个缓冲器。

单缓冲机制:对于块设备而言,假定从磁盘把一块数据输入到缓冲的时间为 T,操作系统将该缓冲区中的数据传送到用户区的时间为 M,CPU 对这一块数据计算的时间为 C。如果不采用缓冲,数据直接从磁盘到用户区,每块数据的处理时间为 T+C。若采用单缓冲,每块数据的处理时间为 m a x ( C , T ) + M max(C, T)+M max(C,T)+M。通常来说 M 要远远小于 C 或者 T,因此采用缓冲技术,输入的效率提高了很多。

在这里插入图片描述


4.2 双缓冲

单缓冲:在设备和 CPU 之间设置两个缓冲器。

双缓冲机制:为加快输入输出速度和提高设备利用率,引入了双缓冲。首先将数据送入缓冲区 1,装满后使转向缓冲区 2。此时操作系统可从缓冲区 1 中移出数据送至用户进程区,由 CPU 对数据进行计算。两个缓冲区交替使用,可以使得 CPU 和 I/O 设备、设备和设备的并行性进一步提高。在双缓冲时,系统处理一块数据的时间可粗略地认为是 m a x ( C , T ) max(C,T) max(C,T)

在这里插入图片描述
补充说明:如果 C < T,则可使块设备连续输入(因为计算机的处理速度快,处理完一个缓冲区时,另一个缓冲区却还在由 I/O 输入。这就不会造成 “缓冲覆盖问题”)。如果 C > T,则可使 CPU 一直处于工作状态(即连续处理状态)。


4.3 循环缓冲

为什么要用循环缓冲?
● 当输入与输出的速度基本相匹配时,双缓冲能获得较好的效果,使输入与输出基本上能并行操作。若两者的速度相差甚远,双缓冲的作用则不够理想,不过可以增加缓冲区数量,从而改善这些问题。因此,又引入了多缓冲机制。并将多缓冲组织成循环缓冲形式。

循环缓冲的组成
  ① 多个缓冲区:在循环缓冲中包含了多个缓冲区,每个缓冲区的大小相同。缓冲区可分为三种类型:空缓冲区 R(我猜是 Release 的缩写);已装满数据的缓冲区 G(把它理解成:比C多一点,所以装满了);计算进程正在使用的缓冲区 C(我猜是 Current 的缩写)。

  ② 多个指针:对用于输入的多缓冲,可设置这样三个指针。Nextg指向计算进程下一个可用的缓冲区G;Nexti指向输入进程下次可用的空缓冲区 R;Current指示计算进程正在使用的缓冲区C。


它的工作示意图如下
在这里插入图片描述

循环缓冲的工作细节
  ① GetBuffer()过程:对于计算进程而言,调用GetBuffer过程,通过Nextg获得要进行计算的缓冲区,相应地将该缓冲区改为 C,将Current指向该缓冲区,Nextg指向下一个 G 缓冲区。对于输入进程而言,调用GetBuffer()过程,通过Nexti获取可用的缓冲区,相应地将该缓冲区改为 C,将Current指向该缓冲区,Nexti指向下一个 R 缓冲区。
  ② ReleaseBuffer()过程:当计算进程完毕后,当前的缓冲区空出来了,调用ReleaseBuffer()过程,将 C 改为 R 。若是输入进程完毕,也调用ReleaseBuffer()过程,将该缓冲区从 C 改为 G。

指针NextiNextg不断顺时针运行,可能会出现以下两种情况
  ① Nexti指针追上Nextg指针。意味着输入进程输入数据的速度大于计算进程处理数据的速度,已把全部可用的空缓冲装满,再无缓冲区可用。此时,输入进程应该阻塞,直到有计算进程计算完毕,将某个缓冲区释放,输入进程才被唤醒。
  ② Nextg指针追上Nexti指针。意味着计算进程处理数据的速度大于输入进程输入数据的速度,已把所有输入数据的缓冲区处理完毕,再无有数据的缓冲区供计算进程使用。此时,计算进程应该阻塞,直到有输入进程输入数据,将某个缓冲区释放,计算进程才被唤醒。




4.4 缓冲池

为什么要用缓冲池呢?
● 循环缓冲仅适用于某特定的 I/O 进程和计算进程,因此它们属于专用缓冲。当系统较大时,将会有许多这样的循环缓冲,这不仅要消耗大量的内存空间,而且其利用率也不高。为了提高缓冲区的利用率,目前广泛流行公用的缓冲池机制。缓冲池中的缓冲区可供多个进程共享。

缓冲池的组成
  ① 空闲缓冲区队列emq:由空闲缓冲区所连成的队列。其队首指针F(emq)和队尾指针L(emq)分别指向该队列的首尾缓冲区。
  ② 输入队列inq:这是由装满输入数据的缓冲区所连成的队列。其队首指针F(inq)和队尾指针L(inq)分别指向该队列的首、尾缓冲区。
  ③ 输出队列outq:这是由装满输出数据的缓冲区所连成的队列。其队首指针F(outq)和队尾指针L(outq)分别指向该队列的首、尾缓冲区。
  ④ 除了上述三个队列外,还应具有4种工作缓冲区。
    [1] 用于收容输入数据的工作缓冲区hin
    [2] 用于提取输入数据的工作缓冲区sin
    [3] 用于收容输出数据的工作缓冲区hout
    [4] 用于提取输出数据的工作缓冲区sout

缓冲池中的两个基本操作
  ① Getbuf(type):用于从type所指定的队列的队首摘下一个缓冲区。
  ② Putbuf(type,number):用于将由参数number所指示的缓冲区挂在type队列上(放入队尾)。

需要注意的是:缓冲池是一个临界资源。在Getbuf()Putbuf()过程中必须遵循进程同步的原则。


缓冲池工作的基本方式有4种,其示意图如下

在这里插入图片描述
对上图的说明
  ① 收容输入工作方式:在输入进程需要输入数据时,调用Getbuf(emq)过程,从空缓冲区队列emq的队首摘下一个空缓冲区,把它作为收容输入工作缓冲区hin。然后,把数据输入其中,装满后再调用Putbuf(inq,hin)过程,将该缓冲区挂在输入队列inq的队尾。
  ② 提取输入工作方式:当计算进程需要输入数据时,调用Getbuf(inq)过程,从输入队列取一个缓冲区作为提取输入工作缓冲区sin,计算进程从中提取数据。计算进程用完该数据后,再调用Putbuf(emq,sin)过程,将该缓冲区挂到空缓冲队列emq上。
  ③ 收容输出工作方式:当计算进程需要输出时调用Getbuf(emq)过程,从空缓冲队列emq的队首取得一个空缓冲,作为收容输出工作缓冲区hout。当其中装满输出数据后,又调用Putbuf(outq,hout)过程,将该缓冲区挂在输出队列outq末尾。
  ④ 提取输出工作方式:在输出进程需要输出数据时,调用Getbuf(outq)过程,从输出队列的队首取一个装满输出数据的缓冲区,作为提取输出工作缓冲区sout。在数据提取完后,再调用Putbuf(emq,sout)过程,将它挂在空缓冲队列emq的末尾



五、驱动调度技术

为什么要学这个?
● 首先,驱动是什么?

设备驱动:指操作系统和输入输出设备间的粘合剂。
驱动负责将操作系统的请求传输,转化为特定物理设备控制器能够理解的命令。
—— 百度百科[设备驱动]

原因是:辅助存储器(例如,磁盘,一种大容量旋转型存储设备驱动)在繁重的输入输出负载下,同时会有若干个输入输出请求(就相当于: CPU 说,我要往哪里哪里存东西,又往哪里哪里取东西)来到并等待处理。这时系统需要采用一种合理的调度策略,使系统按最佳次序处理这些请求,这就是 “驱动调度”。

● 学习驱动调度技术之前,需了解磁盘的物理结构和读/写机制。


5.1 磁盘的物理结构(磁盘、盘片、盘面、磁道、扇区、柱面)

磁盘的书本定义:一种直接存取存储设备,又叫随机存取存储设备。它的每个物理块有确定的位置和唯一的地址,存取任何一个物理块所需的时间几乎不依赖于此信息的位置。

磁盘:磁盘由若干盘片组成。

盘片:每个盘片有两个盘面。

盘面:每个盘面都有一个读写磁头。如果有 N 个盘面,则有 2N 个盘面,对应 2N 个磁头,并按照 0、1、2、… 的顺序编号。

磁道:每个盘面都被划分成若干个同心圆磁道(图例是 14 个)。

扇区:对于每个同心圆磁道,都会被划分入若干个扇区。(图例是 8 个)。

在这里插入图片描述

说明:不同磁道上的扇区虽然半径不同,但是容量是相同的,一般的容量为 512字节。(这样做是为了方便计算机硬件处理。故内圈的容量单元密集一点,外圈容量单元稀疏一点)

柱面:半径相同的所有盘面上的磁道构成柱面。

在这里插入图片描述
磁盘容量 容 量 大 小 = 柱 面 数 × 磁 头 数 × 每 根 磁 道 的 扇 区 数 × 512 字 节 容量大小 = 柱面数 \times 磁头数 \times 每根磁道的扇区数 \times 512字节 =×××512(上图计算得 344064 字节 ≈ ≈ 0.34 MB)

● 为了访问磁盘上的一个记录,必须给出3个参数:柱面号磁头号(即对应的盘面号)块号(即扇区)


5.2 磁盘的访问时间

总公式 磁 盘 的 访 问 时 间 = 寻 道 时 间 ( T s ) + 旋 转 延 迟 时 间 ( T τ ) + 传 输 时 间 ( T t ) 磁盘的访问时间 = 寻道时间(T_s) + 旋转延迟时间(T_τ)+ 传输时间(T_t) 访=Ts+Tτ+Tt

寻道时间( T s T_s Ts:是指把磁臂(磁头)移动到指定磁道上所经历的时间。该时间是启动磁臂的时间 s s s 与磁头移动 n n n 条磁道所花费的时间之和,即—— T s = m × n + s T_s=m×n +s Ts=m×n+s
◆ 补充说明:其中, m m m是一常数,与磁盘驱动器的速度有关,对一般磁盘, m m m = 0.2;对高速磁盘, m m m ≤ 0.1,磁臂的启动时间约为2ms。这样,对一般的硬盘,其寻道时间将随寻道距离的增加而增大,大体上是 5~30ms

旋转延迟时间( T τ T_τ Tτ:是指定扇区移动到磁头下面所经历的时间。
◆ 补充说明:对于硬盘,典型的旋转速度大多为5400r/min,每转需时11.1 ms,平均旋转延迟时间 T τ T_τ Tτ5.55ms;对于软盘,其旋转速度为300r/min600r/min,这样,平均 T τ T_τ Tτ50~100ms

传输时间( T t T_t Tt:是指把数据从磁盘读出或向磁盘写入数据所经历的时间。 T t T_t Tt 的大小与每次所读/写的字节数 b b b 和旋转速度有关,即 T τ = b r N T_τ = \frac{b}{rN} Tτ=rNb
◆ 补充说明:其中 r r r 为磁盘每秒钟的转数; N N N 为一条磁道上的字节数

举个栗子:当一次读/写的字节数相当于半条磁道上的字节数时, T t T_t Tt T τ T_τ Tτ 此时相同,因此,总的磁道访问时间 T a T_a Ta(Time all 的意思) 为: T a = T s + 1 2 r + b r N T_a=T_s + \frac{1}{2r} + \frac{b}{rN} Ta=Ts+2r1+rNb


5.3 磁盘调度 —— 4种算法⭐️⭐️⭐️

● 磁盘是可供多个进程共享的设备,当有多个进程都要求访问磁盘时,应采用一种最佳的调度算法,以使各进程对磁盘的平均访问时间最小

● 由于在磁盘访问的时间中,主要是寻道时间,因此,磁盘调度的目标,是使磁盘的平均寻道时间最少

目前常用的磁盘调度算法有:先来先服务、最短寻道时间优先、扫描算法等。


5.3.1 先来先服务算法(FCFS)

先来先服务(FCFS):根据进程请求访问磁盘的先后次序进行调度。此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。但会致使平均寻道时间长。(它是最简单的磁盘调度算法)

举个栗子:磁盘收到系统的磁道访问号依次是:55、58、39、18、90、160、150、38、184,初始位置为 100 号磁道,请计算总寻道数和平均寻道长度?

解:
访问顺序如下图所示,总寻道长度 = 45 + 3 + 19 + 21 + 72 + 70 + 10 + 112 + 146 =498
平均寻道长度 = 498 ÷ 9 = 55.3(即用总寻道长度除以访问的磁道数)
在这里插入图片描述


5.3.2 最短寻道时间优先(SSTF)

最短寻道时间优先(SSTF):总是先执行查找时间最短的那个磁盘请求。从而,较 “先来先服务” 算法有较好的性能。但是本算法存在 “饥饿” 现象,随着源源不断靠近当前磁头位置读写请求的到来,使早来的但距离当前磁头位置远的读写请求服务被无限期推迟。

举个栗子【和下一个例子一样】:磁盘收到系统的磁道访问号依次是:55、58、39、18、90、160、150、38、184,初始位置为 100 号磁道,请计算总寻道数和平均寻道长度?

解:
访问顺序如下图所示,总寻道长度 = 10 + 32 + 3 + 16 + 1 + 20 + 132 + 10 + 24 = 248
平均寻道长度 = 248 ÷ 9 = 27.3(即用总寻道长度除以访问的磁道数)
在这里插入图片描述


5.3.3 扫描算法(SCAN)

扫描算法(SCAN):每次总是选择沿臂的移动方向最近的那个柱面。如果沿这个方向没有访问的请求时,就改变臂的移动方向,这非常类似于电梯的调度规则。扫描算法克服了 “饥饿” 这一缺点。扫描算法偏爱那些最接近里面或靠外的请求,对最近扫描跨过去的区域响应会较慢。

举个栗子【我也和下一个例子一样】:磁盘收到系统的磁道访问号依次是:55、58、39、18、90、160、150、38、184,初始位置为 100 号磁道,且一开始磁头的移动方向为:向磁道号增加的方向。请计算总寻道数和平均寻道长度?

解:
访问顺序如下图所示,它一开始先朝 150 号磁道走去,而不是先去 90 号磁道走去。因为题目要求。
总寻道长度 = 50 +10 + 24 + 94 + 32 + 3 + 16 +1 + 20 = 250
平均寻道长度 = 250 ÷ 9 = 27.8(即用总寻道长度除以访问的磁道数)
在这里插入图片描述


5.3.4 循环扫描算法(CSCAN)

循环扫描算法(CSCAN):移动臂总是从0号柱面至最大号柱面顺序扫描,然后,直接返回0号柱面重复进行,归途中不再服务,构成了一个循环,这就减少了处理新来请求的最大延迟。CSCAN算法规定磁头单向移动。

补充说明:根据在网上查的资料,好像是教材表述不太清楚。CSCAN算法准确理解应该是这样的:它总是按一个方向移动磁盘臂,(若一开始为增方向,那么),处理完编号最高的磁道后,移动到具有读写请求的编号最低的磁道,然后继续向上移动。

举个栗子【我和顶楼那个例子一样】:磁盘收到系统的磁道访问号依次是:55、58、39、18、90、160、150、38、184,初始位置为 100 号磁道,且一开始磁头的移动方向为:向磁道号增加的方向。请计算总寻道数和平均寻道长度?

解:
访问顺序如下图所示,它一开始先朝 150 号磁道走去,而不是先去 90 号磁道走去。因为题目要求。
然后当它扫完 180 时,直接返回 0 号了。这是算法的要求。
总寻道长度 = 50 +10 +24 + 166 + 20 + 1 + 16 + 3 + 32 = 322
平均寻道长度 = 322 ÷ 9 = 35.8(即用总寻道长度除以访问的磁道数)
在这里插入图片描述


5.3.5 分步扫描算法(N-Step-SCAN)+ FSCAN算法 —— 只作了解

分步扫描算法(N-Step-SCAN):将磁盘请求队列分成若干个长度为N的子队列,磁盘调度将按 FCFS 算法依次处理这些子队列。而每处理一个队列时又是按 SCAN 算法,对一个队列处理完后,再处理其他队列。 当正在处理某子队列时,如果又出现新的磁盘 I/O 请求,便将新请求进程放入其他队列,这样就可避免出现粘着现象。当N值取得很大时,会使N步扫描法的性能接近于 SCAN 算法的性能;当N = 1时,“N步SCAN算法” 便蜕化为 FCFS 算法。

FSCAN算法:即是 “N步SCAN算法” 的简化, 即 FSCAN 只将磁盘请求队列分成两个子队列。一个是由当前所有请求磁盘 I/O 的进程形成的队列,由磁盘调度按 SCAN 算法进行处理。在扫描期间,将新出现的所有请求磁盘 I/O 的进程, 放入另一个等待处理的请求队列。这样,所有的新请求都将被推迟到下一次扫描时处理。


5.4 提高磁盘 I/O 速度的一些方法 —— 只作了解

提前读:用户经常采用顺序方式访问文件的各个盘块上的数据。在读当前盘块时,已经能够知道下次要读出的盘块的地址。因此,可在读当前盘块的同时,提前把下一个盘块数据也读入磁盘缓冲区。这样一来,当下次要读盘块中的那些数据时,由于已经提前把它们读入了缓冲区,便可直接使用数据,而不必再启动磁盘 I/O,从而,减少了读数据的时间,也就相当于提高了磁盘 I/O 速度。

延迟写:在执行写操作时,磁盘缓冲区中的数据本来应该立即写回磁盘,但考虑到该缓冲区中的数据不久之后再次被输出进程或其他进程访问,因此,并不马上把缓冲区中数据写盘,而是把它挂在空闲缓冲区队列的末尾。随着空闲缓冲区的使用,存有输出数据的缓冲区也不停地向队列头移动,直至移动到空闲缓冲区队列之首。当再有进程申请缓冲区,且分到了该缓冲区时,才把其中的数据写到磁盘上。只要存有输出数据的缓冲区还在队列中,任何访问该数据的进程,可直接从中读出数据,不必再去访问磁盘。这样做,可以减少磁盘的 I/O 时间。

采用虚拟盘:虚拟盘是指用内存空间去仿真磁盘。该盘的设备驱动程序可以接受所有标准的磁盘操作,但这些操作的执行,不是在磁盘上而是在内存中。操作过程对用户是透明的(即用户并不会发现这与真正的磁盘操作有什么不同,而仅仅是更快一些)。虚拟盘是易失性存储器,一旦系统或电源发生故障,或重新启动系统时,原来保存在虚拟盘中的数据会丢失。因此,该盘常用于存放临时文件。



六、参考附录:

[1] 《操作系统A》
上课用的慕课
链接: https://www.icourse163.org/course/NJUPT-1003219004?from=searchPage.

[2] 《操作系统教程》
上课用的教材

上一篇文章地址链接:【操作系统⑫】——存储管理(下)【分段存储管理 虚拟存储管理 段页式存储管理方案 页面置换算法 OPT FIFO LRU】.

下一篇文章地址链接:【操作系统学习笔记⑭】——设备管理(下) [ 设备分配、虚拟设备——SPOOLing ].

期末考试总复习——地址链接:《操作系统期末总复习——绝地求生版》.


⭐️ ⭐️

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【操作系统学习笔记⑬】——设备管理(上) [直接查询、中断方式、DMA方式、缓冲技术、驱动调度技术与算法] 的相关文章

  • 匿名科创--X2212版到手飞套件介绍

    匿名科创到手飞X2212版 xff0c 使用朗宇X2212系列无刷电机 xff0c 配合特制的6mm正反螺纹螺旋桨安装柱 xff0c 可以同时兼容8寸普通螺旋桨和9寸9450自锁螺旋桨 优点 xff1a 可直接使用普通8寸螺旋桨 xff0c
  • vscode最皮实的C++格式化的配置方法

    1 安装C C 43 43 2 在vscode界面 xff0c 按 34 Ctrl 43 34 进入设置界面 xff0c 搜索Format 3 设置保存文件时 xff0c 按格式对代码排版 4 向下拉 xff0c 找到下图选项 xff0c
  • 通过openmv生成apriltag标签

    Apriltag官网提供的tag图片分辨率很低 xff0c 完全无法使用 xff0c 通过openmv生成apriltag标签 生成方法如下 xff1a openmv IDE的下载与安装 openmv官方提供了各种版本的IDE xff0c
  • 串口传输数据错位 的几种解决办法

    1 代码优化等级 2 使用晶振 晶振自身产生时钟信号 xff0c 为各种微处理芯片作时钟参考 无源晶振需要用CPU内部的振荡器信号差接线麻烦石英 gt 陶瓷有源晶振是一个完整的振荡器信号好接线简单灵活性较差 3 使用降低传输速率 xff1f
  • sip 认证分析

    SIP类似Http协议 其认证模式也一样 Http协议 xff08 RFC 2616 xff09 规定可以采用Basic模式和摘要模式 xff08 Digest schema xff09 RFC 2617 专门对两种认证模式做了规定 RFC
  • MicroPython移植

    MicroPython移植 1 目标板 stm32f407zgt6 2 下载移植准备 micropython源码 arm交叉编译工具 sudo apt get install git sudo apt get install gcc arm
  • 了解ESP32睡眠模式及其功耗

    陈拓翻译 2022 05 30 2022 05 30 原文 https lastminuteengineers com esp32 sleep modes power consumption 毫无疑问 xff0c ESP32是许多WiFi
  • 浅谈布隆过滤器

    什么是布隆过滤器 布隆过滤器是一种数据结构 xff0c 比较巧妙的概率型数据结构 xff08 probabilistic data structure xff09 xff0c 特点是高效地插入和查询 xff0c 可以用来告诉你 某样东西一定
  • 浅谈CGI基本原理和底层基本实现

    历史来由 xff1a 早期的Web服务器 xff0c 只能响应浏览器发来的HTTP静态资源的请求 xff0c 并将存储在服务器中的静态资源返回给浏览器 随着Web技术的发展 xff0c 逐渐出现了动态技术 xff0c 但是Web服务器并不能
  • linux的两种共享内存方式---mmap和shmat区别

    linux中的两种共享内存 一种是我们的IPC通信System V版本的共享内存 xff0c 另外的一种就是我们今天提到的存储映射I O xff08 mmap函数 xff09 在说mmap之前我们先说一下普通的读写文件的原理 xff0c 进
  • tcp发送窗口(滑动窗口)、拥塞窗口

    TCP发送窗口拥塞窗口试题分析 题目一 xff1a 来源2015年408计算机综合 试题链接 xff1a https www nowcoder com questionTerminal 3241441c88f04ab58585a187716
  • mktime函数性能分析

    mktime函数性能分析 1月 02 2019 in Linux环境高级编程 mktime函数性能分析 mktime是一个将break down时间 struct tm 转化为日历时间 time t 的转换函数 它的转换与struct tm
  • iptables原理和防火墙主要命令使用场景

    https www zsythink net archives 1764 朱双印的个人日志 xff0c 写的非常的通俗易懂 xff0c 好文章 https blog csdn net u011277123 article details 8
  • 链路mtu

    常常见到交换机和网卡说明中提到支持Jumbo Frame xff0c 但我一直对以太网的Jumbo Frame xff08 巨帧 xff09 如何使用不太理解 xff0c 今日在网上找到2则现摘录下来 xff0c 相信看了以后大家会有收获
  • eggjs

    https editor csdn net md not checkout 61 1 amp spm 61 1001 2014 3001 4503 https blog csdn net weixin 42304193 article de
  • mini6410上HelloQt4运行出现libQtGui.so.4: cannot open shared的原因

    主要原因是在3 3 3节中 xff0c 编写的环境变量搭建文件setqt4env中设置路径不对 export LD LIBRARY PATH 61 xff08 看看有没有文件中的目录 xff09 应该改成你所在的qt4 7目录中的lib目录
  • VINS技术路线与代码详解

    VINS技术路线 写在前面 xff1a 本文整和自己的思路 xff0c 希望对学习VINS或者VIO的同学有所帮助 xff0c 如果你觉得文章写的对你的理解有一点帮助 xff0c 可以推荐给周围的小伙伴们 xff0c 当然 xff0c 如果
  • 用MicroPython开发ESP32- 用Thonny写程序

    陈拓 2022 06 11 2022 06 12 1 简介 在 用MicroPython开发ESP32 固件烧写与测试 https zhuanlan zhihu com p 527291091 https blog csdn net che
  • 单片机 stm32 接收数据和处理

    背景 1 单片机串口接收数据处理 xff0c 这个代码已经过很多项目验证 xff0c 没有问题 用这个代码帮了好几个同事解决数据接收久了就异常 2 这个代码做到接收和处理分开 避免不必要的处理逻辑问题 3 也可用于网口tcp xff0c u
  • odroid Xu4介绍

    Odroid xu4介绍 下面对这块开发板做一下简单的介绍 xff0c 共需要用到的人参考 从参数上来看 xff0c ODROID XU4的整体性能基本和目前的中端智能手机差不多 xff0c 它搭载了主频

随机推荐

  • OdroidXu4开发环境搭建

    OdroidXu4开发环境搭建 一 烧录镜像 1 SD卡烧录 首先准备一张至少16G的sd卡 镜像可以在官网 xff1a http odroid com dokuwiki doku php id 61 en odroid xu4 softw
  • 大小端:字节序与比特序

    https blog csdn net fzy0201 article details 26876711 https blog csdn net qq 40334837 article details 89042607 前言 前两天被问到一
  • VLC Buffering机制介绍

    一 简介 了解一定播放器知识的同学应该都知道 xff0c 播放器内部是有缓存的 xff08 非直播场景 xff09 缓存的作用主要是解决生产者和消费者速度的不匹配 xff0c 给用户更好的使用体验 例如 xff0c 在网络不稳定的情况下 x
  • Linux静态库和动态库学习总结

    一 废话 之前由于工作需要 xff0c 要封装一个Linux加密解密转换的动态库 xff0c 这个之前只做过Windows下面的 xff0c Linux下面还真没有做过 xff0c 之后做了整一个晚上才算做好 xff0c 不过其中也学到了不
  • UART的FIFO功能

    经常听到UART的FIFO功能 xff0c 但是从来没有真正使用过和认真思考过它的作用 正好有客户用到这个功能 xff0c 在这里做个总结 FIFO 是 First In First Out 的缩写 xff0c 它是一个具有先入先出特点的缓
  • 《C语言内核深度解析》笔记(3):指针才是C语言的精髓

    第03章 指针才是C语言的精髓 3 2 指针 int a 61 10 int p 61 amp a 指针变量p和普通变量之间没有本质区别 xff0c 都是变量空间放了一个数值 xff0c 只是p里面的数值比较特殊 xff0c 是a空间的地址
  • 相机针孔模型----从世界坐标系,到相机坐标系,再到图像物理坐标系,最后到图像像素坐标系的转换过程解析

    看了很多讲解针孔相机模型中从世界坐标系 gt 到相机坐标系 gt 图像坐标系的文章 xff0c 心里的疑惑也逐渐展开 xff0c 现在总结一下自己的理解 xff1a 世界坐标系 相机坐标系 图像物理坐标系 图像像素坐标系在我的另一篇博文里已
  • D1 R32 – ESP32+Arduino CNC Shield控制步进电机

    陈拓 2023 04 01 2023 04 05 1 简介 在 Arduino Uno开发板 43 电机驱动扩展版CNC Shield V3 0硬件说明 https blog csdn net chentuo2000 article det
  • pixhawk当中关于NMEA类型的gps数据处理流程

    1 启动跟新gps的数据的任务是在ArduCopter cpp中scheduler tasks中 调用的速度是50hz 2 通过执行update GPS方法中的 3 调转到ap gps cpp中的update方法中 4 在update中通过
  • C++Eigen库的配置和基本使用

    1 配置 1 下载 http bitbucket org eigen eigen get 3 2 5 tar bz2 2 配置 文件夹名字较长 xff0c 解压后可重命名 xff0c 如我命名为eigen3 xff0c 把D program
  • C++:extern "c"用法解析

    引言 C 43 43 保留了一部分过程式语言的特点 xff0c 因而它可以定义不属于任何类的全局变量和函数 但是 xff0c C 43 43 毕竟是一种面向对象的程序设计语言 xff0c 为了支持函数的重载 xff0c C 43 43 对全
  • 堆栈的作用,以及存放的数据

    在计算机领域 xff0c 堆栈是一个不容忽视的概念 xff0c 但是很多人甚至是计算机专业的人也没有明确堆栈其实是两种数据结构 堆栈都是一种数据项按序排列的数据结构 xff0c 只能在一端 称为栈顶 top 对数据项进行插入和删除 要点 x
  • STM32 姿态传感器mpu6050的使用

    文章目录 特性引脚说明使用I2C软件 xff0c 驱动mpu6050手册中寄存器描述MPU6050初始化的步骤 xff1a 数据读取mpu6050输出的值 特性 MPU6050 xff0c 能同时检测三轴加速度 三轴陀螺仪 三轴角速度 的运
  • STM32 GPS定位

    文章目录 ATGM332D简介特性引脚接入串口通信NMEA 协议解析串口输出nmealib在linux下使用 ATGM332D简介 高性能 低功耗 GPS 北斗双模定位模块 特性 特性说明基本功能三维位置定位 经纬度 海拔 xff0c 测速
  • 树莓派笔记13:舵机云台(一)

    最近买了个小型舵机云台模块来玩 xff0c 淘宝上卖这个的挺多的 xff0c 一般三四十块钱 xff0c 很多还卖配套的摄像头 说是云台 xff0c 其实就是用两个舵机结合固定板做的支撑模块 xff0c 两个舵机分别控制左右和上下的转动 1
  • STM32F103ZET6串口使用USAR_TFLAG_IDLE空闲中断实现UART_DMA接收和发送不定长数据

    本文是实现STM32F103ZET6串口通过使用STM32的IDLE空闲中断 xff08 USAR TFLAG IDLE 实现UART DMA接收和发送 xff08 Rx和Tx均通过DMA通道 xff09 不定长数据 本文实现了UART1
  • c++中使用LibCurl解析http请求数据

    libcurl lib xff08 或libcurl so xff0c unix下面尽量实时编译 xff0c 并且要注意系统版本 xff08 32 or 64 xff09 xff09 是跨平台解析http请求数据的动态库 xff0c 使用起
  • ESP32 web WiFi 管理器esp32-wifi-manager

    拓 2023 04 09 2022 04 11 1 简介 github仓库 https github com tonyp7 esp32 wifi manager 说明 esp32 wifi manager是esp32的纯C esp idf组
  • ubuntu下安装多版本Python

    转自 xff1a http www cnblogs com ningvsban p 4384995 html
  • 【操作系统学习笔记⑬】——设备管理(上) [直接查询、中断方式、DMA方式、缓冲技术、驱动调度技术与算法]

    文章目录 一 导语二 设备管理的基础知识点2 1 设备的分类2 2 设备管理的功能 三 I O 控制方式 3 1 程序直接查询控制方式3 2 中断方式3 3 DMA 方式3 4 通道方式 四 缓冲技术4 1 单缓冲4 2 双缓冲4 3 循环