OS- -I/O之盘和时钟

OS- -I/O之盘和时钟

一、盘

盘可以说是硬件里面比较简单的构造了,同时也是最重要的。

下面我们从盘谈起,聊聊它的物理构造

1.盘硬件

  • 盘会有很多种类型。其中最简单的构造就是磁盘(magnetic hard disks),也被称为hard disk,HDD等。
  • 磁盘通常与安装在磁臂上的磁头配对,磁头可将数据读取或者将数据写入磁盘,因此磁 盘的读写速度都同样快
  • 磁盘中,数据是随机访问的,这也就说明可以通过任意的顺序来存储和检 索单个数据块,所以你可以在任意位置放置磁盘来让磁头读取,磁盘是一种非易失性的设备,即使断 电也能永久保留。
  • 在计算机发展早期一般是用光盘来存储数据的,然而随着固态硬盘的流行,固态硬盘不包含运动部件的 特点,成为现在计算机的首选存储方式。

磁盘

  • 为了组织和检索数据,会将磁盘组织成特定的结构,这些特定的结构就是磁道、扇区和柱面
    在这里插入图片描述

  • 每一个磁盘都是由无数个同心圆组成,这些同心圆就好像树的年轮一样
    在这里插入图片描述

  • 磁盘被组织成柱面形式,每个盘用轴相连,每一个柱面包含若干磁道,每个磁道由若干扇区组成

  • 软盘 上大约每个磁道有8 - 32个扇区,硬盘上每条磁道上扇区的数量可达几百个,磁头大约是1 - 16个。

  • 对于磁盘驱动程序来说,一个非常重要的特性就是控制器是否能够同时控制两个或者多个驱动器进行磁 道寻址,这就是重叠寻道(overlapped seek)

  • 对于控制器来说,它能够控制一个磁盘驱动程序完成 寻道操作,同时让其他驱动程序等待寻道结束。控制器也可以在一个驱动程序上进行读写操作,与此 同时让另外的驱动器进行寻道操作,但是软盘控制器不能在两个驱动器上进行读写操作。

RAID

  • RAID称为磁盘冗余阵列,简称磁盘阵列。利用虚拟化技术把多个硬盘结合在一起,成为一个或多个 磁盘阵列组,目的是提升性能或数据冗余。
  • RAID有不同的级别
  • •RAID 0-无容错的条带化磁盘阵列
  • •RAID 1 -镜像和双工
  • •RAID 2 -内存式纠错码
  • •RAID 3 -比特交错奇偶校验
  • •RAID 4 -块交错奇偶校验
  • •RAID 5 -块交错分布式奇偶校验
  • •RAID 6 - P + Q冗余

磁盘格式化

  • 磁盘由一堆铝的、合金或玻璃的盘片组成,磁盘刚被创建出来后,没有任何信息。磁盘在使用前必须经 过低级格式化(low-levvel format)

下面是一个扇区的格式:
在这里插入图片描述

扫描二维码关注公众号,回复: 11538473 查看本文章
  • 前导码相当于是标示扇区的开始位置,通常以位模式开始,前导码还包括柱面号、扇区号等一些其他 信息。
  • 紧随前导码后面的是数据区,数据部分的大小由低级格式化程序来确定。大部分磁盘使用512字 节的扇区
  • 数据区后面是ECC, ECC的全称是error correction code ,数据纠错码,它与普通的错 误检测不同,ECC还可以用于恢复读错误
  • ECC阶段的大小由不同的磁盘制造商实现。ECC大小的设 计标准取决于设计者愿意牺牲多少磁盘空间来提高可靠性,以及程序可以处理的ECC的复杂程度。通 常情况下ECC是16位
  • 除此之外,硬盘一般具有一定数量的备用扇区,用于替换制造缺陷的扇区。
  • 低级格式化后的每个。扇区的位置都和前一个磁道存在偏移,如下图所示:
    在这里插入图片描述
  • 这种方式又被称为 柱面斜进(cylinder skew),之所以采用这种方式是为了提高程序的运行性能
  • 可 以这样想,磁盘在转动的过程中会经由磁头来读取扇区信息,在读取内侧一圈扇区数据后,磁头会进行 向外侧磁道的寻址操作,寻址操作的同时磁盘在继续转动,如果不采用这种方式,可能刚好磁头寻址到 外侧。0号扇区已经转过了磁头,所以需要旋转一圈才能等到它继续读取,通过柱面斜进的方式可以消 除这一问题
  • 柱面斜进量取决于驱动器的几何规格。柱面斜进量就是两个相邻同心圆。号扇区的差异量。

如下图所示:

在这里插入图片描述

  • 这里需要注意一点,不只有柱面存在斜进,磁头也会存在斜进(head skew),但是磁头斜进比较小
  • 磁盘格式化会减少磁盘容量,减少的磁盘容量都会由前导码、扇区间间隙和ECC的大小以及保留的备 用扇区数量
  • 在磁盘使用前,还需要经过最后一道工序,那就是对每个分区分别执行一次高级格式化(high-level format),这一操作要设置一个引导块、空闲存储管理(采用位图或者是空闲列表)、根目录和空文件 系统。
  • 这一步操作会把码放在分区表项中,告诉分区使用的是哪种文件系统,因为许多操作系统支持多 个兼容的文件系统。在这一步之后,系统就可以进行引导过程。
  • 当电源通电后,BIOS首先运行,它会读取主引导记录并跳转到主引导记录中。然后引导程序会检查以 了解哪个分区是处于活动的。
  • 然后,它从该分区读取启动扇区(boot sector)并运行它。启动扇区包 含一个小程序来加载一个更大一点的引导器来搜索文件系统以找到系统内核(system kernel),然后 程序被转载进入内存并执行
  • 这里说下什么是引导扇区:引导扇区是磁盘或者存储设备的保留扇区,其中包含用于完成计算机 或磁盘引导过程所必要的数据或者代码
  • 引导扇区存储引导记录数据,这些数据用于在计算机启动时提供指令。有两种不同类型的引导扇 区
  • •Master boot record称为主引导扇区
  • •Volume boot record 卷启动记录
  • 对于分区磁盘,引导扇区由主引导记录组成;
  • 非分区磁盘由卷启动记录组成。

2.磁盘臂调度算法

  • 下面我们来探讨一下关于影响磁盘读写的算法,一般情况下,影响磁盘快读写的时间由下面几个因素决 定

  • 寻道时间・寻道时间指的就是将磁盘臂移动到需要读取磁盘块上的时间

  • 旋转延迟・等待合适的扇区旋转到磁头下所需的时间

  • 实际数据的读取或者写入时间

  • 这三种时间参数也是磁盘寻道的过程。一般情况下,寻道时间对总时间的影响最大,所以,有效的降低 寻道时间能够提高磁盘的读取速度

  • 如果磁盘驱动程序每次接收一个请求并按照接收顺序完成请求,这种处理方式也就是先来先服务 (First-Come, First-served, FCFS),这种方式很难优化寻道时间

  • 因为每次都会按照顺序处 理,不管顺序如何,有可能这次读完后需要等待一个磁盘旋转一周才能继续读取,而其他柱面能够马上 进行读取,这种情况下每次请求也会排队。

  • 通常情况下,磁盘在进行寻道时,其他进程会产生其他的磁盘请求。磁盘驱动程序会维护一张表,表中 会记录着柱面号当作索引,每个柱面未完成的请求会形成链表,链表头存放在表的相应表项中。

  • 一种对先来先服务的算法改良的方案是使用最短路径优先(SSF)算法,下面描述了这个算法。

  • 假如我们在对磁道6号进行寻址时,同时发生了对11 ,2,4, 14, 8, 15,3的请求,如果采用先来先服 务的原则,如下图所示
    在这里插入图片描述

  • 我们可以计算一下磁盘臂所跨越的磁盘数量为5 + 9 + 2 + 10 + 6 + 7 + 12 = 51,相当于是跨越了 51 次盘面,如果使用最短路径优先,我们来计算一下跨越的盘面
    在这里插入图片描述

  • 跨越的磁盘数量为4+1+1+4 + 3 + 3+1=17,相比51足足省了两倍的时间。

  • 但是,最短路径优先的算法也不是完美无缺的,这种算法照样存在问题,那就是优先级问题,

  • 这里有一个原型可以参考就是我们日常生活中的电梯,电梯使用一种电梯算法(elevator algorithm)来进行调度,从而满足协调效率和公平性这两个相互冲突的目标。电梯一般会保持向一个 方向移动,直到在那个方向上没有请求为止,然后改变方向。

  • 电梯算法需要维护一个二进制位,也就是当前的方向位:UP(向上)或者是DOWN(向下)。当一个请 求处理完成后,磁盘或电梯的驱动程序会检查该位,如果此位是UP位,磁盘臂或者电梯仓移到下一个 更高跌未完成的请求。如果高位没有未完成的请求,则取相反方向。当方向位是DOWN时,同时存在 一个低位的请求,磁盘臂会转向该点。如果不存在的话,那么它只是停止并等待。

  • 我们举个例子来描述一下电梯算法,比如各个柱面得到服务的顺序是4, 7, 10, 14, 9, 6, 3, 1 ,那 么它的流程图如下
    在这里插入图片描述

  • 所以电梯算法需要跨越的盘面数量是3 + 3 + 4 + 5 + 3 + 3 + 1=22

  • 电梯算法通常情况下不如SSF算法

  • 一些磁盘控制器为软件提供了一种检查磁头下方当前扇区号的方法,使用这样的控制器,能够进行另一 种优化。如果对一个相同的柱面有两个或者多个请求正等待处理,驱动程序可以发出请求读写下一次要 通过磁头的扇区。

  • 这里需要注意一点,当一个柱面有多条磁道时,相继的请求可能针对不同的磁道,这种选择没有 代价,因为选择磁头不需要移动磁盘臂也没有旋转延迟

  • 对于磁盘来说,最影响性能的就是寻道时间和旋转延迟,所以一次只读取一个或两个扇区的效率是非常 低的。

  • 出于这个原因,许多磁盘控制器总是读出多个扇区并进行高速缓存,即使只请求一个扇区时也是 这样。一般情况下读取一个扇区的同时会读取该扇区所在的磁道或者是所有剩余的扇区被读出,读出扇 区的数量取决于控制器的高速缓存中有多少可用的空间。

  • 磁盘控制器的高速缓存和操作系统的高速缓存有一些不同,磁盘控制器的高速缓存用于缓存没有实际被 请求的块,而操作系统维护的高速缓存由显示地读出的块组成,并且操作系统会认为这些块在近期仍然 会频繁使用。

  • 当同一个控制器上有多个驱动器时,操作系统应该为每个驱动器都单独的维护一个未完成的请求表。一 旦有某个驱动器闲置时,就应该发出一个寻道请求来将磁盘臂移到下一个被请求的柱面。

  • 如果下一个寻 道请求到来时恰好没有磁盘臂处于正确的位置,那么驱动程序会在刚刚完成传输的驱动器上发出一个新 的寻道命令并等待,等待下一次中断到来时检查哪个驱动器处于闲置状态

3.错误处理

  • 磁盘在制造的过程中可能会有瑕疵,如果瑕疵比较小,比如只有几位,那么使用坏扇区并且每次只是让ECC纠正错误是可行的,如果瑕疵较大,那么错误就不可能被掩盖。

  • 一般坏块有两种处理办法,一种是在控制器中进行处理;一种是在操作系统层面进行处理。

  • 这两种方法经常替换使用,比如一个具有30个数据扇区和两个备用扇区的磁盘,其中扇区4是有瑕疵 的。
    在这里插入图片描述

  • 控制器能做的事情就是将备用扇区之一重新映射
    在这里插入图片描述

  • 还有一种处理方式是将所有的扇区都向上移动一个扇区
    在这里插入图片描述

  • 上面这这两种情况下控制器都必须知道哪个扇区,可以通过内部的表来跟踪这一信息,或者通过重写前 导码来给出重新映射的扇区号。

  • 如果是重写前导码,那么涉及移动的方式必须重写后面所有的前导码, 但是最终会提供良好的性能。

4.稳定存储器

  • 磁盘经常会出现错误,导致好的扇区会变成坏扇区,驱动程序也有可能挂掉

  • RAID可以对扇区出错或 者是驱动器崩溃提出保护,然而RAID却不能对坏数据中的写错误提供保护,也不能对写操作期间的崩 溃提供保护,这样就会破坏原始数据

  • 我们期望磁盘能够准确无误的工作,但是事实情况是不可能的,但是我们能够知道的是,一个磁盘子系 统具有如下特性:当一个写命令发给它时,磁盘要么正确地写数据,要么什么也不做,让现有的数据完 整无误的保留。这样的系统称为 稳定存储器(stable storage)

  • 稳定存储器的目标就是不惜一切代 价保证磁盘的一致性

  • 稳定存储器使用两个一对相同的磁盘,对应的块一同工作形成一个无差别的块。稳定存储器为了实现这 个目的,定义了下面三种操作:

  • 稳定写(stable write)

  • 稳定读(stable read)

  • 崩溃恢复(bash recovery)

  • 稳定写指的就是首先将块写到比如驱动器1上,然后将其读回来验证写入的是否正确,如果不正确,那 么就会再次尝试写入和读取,一直到能够验证写入正确为止。

  • 如果块都写完了也没有验证正确,就会换 块继续写入和读取,直到正确为止。无论尝试使用多少个备用块,都是在对你驱动器1写入成功之后, 才会对驱动器2进行写入和读取。这样我们相当于是对两个驱动器进行写入。

  • 稳定读指的就是首先从驱动器1上进行读取,如果读取操作会产生错误的ECC,则再次尝试读取,如 果所有的读取操作都会给出错误的ECC,那么会从驱动器2上进行读取。这样我们相当于是对两个驱 动器进行读取。

  • 崩溃恢复指的是崩溃之后,恢复程序扫描两个磁盘,比较对应的块。如果一对块都是好的并且是相同 的,就不会触发任何机制;如果其中一个块触发了 ECC错误,这时候就需要使用好块来覆盖坏块

  • 如果CPU没有崩溃的话,那么这种方式是可行的,因为稳定写总是对每个块写下两个有效的副本,并 且假设自发的错误不会再相同的时刻发生在两个对应的块上。

  • 如果在稳定写期间出现CPU崩溃会怎么 样?这就取决于崩溃发生的精确时间,有五种情况,下面来说一下

  • 第一种情况是崩溃发生在写入之前,在恢复的时候就什么都不需要修改,旧的值也会继续存在。
    在这里插入图片描述

  • 第二种情况是CPU崩溃发生在写入驱动器1的时候,崩溃导致块内容被破坏,然而恢复程序能够 检测出这一种错误,并且从驱动器2恢复驱动器1上的块。
    在这里插入图片描述

  • 第三种情况是崩溃发生在磁盘驱动器1之后但是还没有写驱动器2之前,这种情况下由于磁盘1 已经写入成功
    在这里插入图片描述

  • •第四种情况是崩溃发生在磁盘驱动1写入后在磁盘驱动2写入时,恢复期间会用好的块替换坏的 块,两个块的最终值都是最新的
    在这里插入图片描述

  • 最后一种情况就是崩溃发生在两个磁盘驱动写入后,这种情况下不会发生任何问题
    在这里插入图片描述

  • 这种模式下进行任何优化和改进都是可行的,但是代价高昂,一种改进是在稳定写期间监控被写入的 块,这样在崩溃后进行检验的块只有一个

  • 有一种非易失性RAM能够在崩溃之后保留数据,但是这 种方式并不推荐使用

二、时钟

  • 时钟(Clocks)也被称为定时器(timers),时钟/定时器对任何程序系统来说都是必不可少的。时钟 负责维护时间、防止一个进程长期占用CPU时间等其他功能
  • 时钟软件(clock software)也是一 种设备驱动的方式。

1.时钟硬件

  • 在计算机中有两种类型的时钟,这些时钟与现实生活中使用的时钟完全不一样。

  • •比较简单的一种时钟被连接到110V或220V的电源线上,这样每个电压周期会产生一个中断, 大概是50 - 60 HZO这些时钟过去一直占据支配地位。

  • •另外的一种时钟由晶体振荡器、计数器和寄存器组成,示意图如下所示
    在这里插入图片描述

  • 这种时钟称为可编程时钟,可编程时钟有两种模式,一种是一键式(one-shot mode)

  • 当时钟启动 时,会把存储器中的值复制到计数器中,然后,每次晶体的振荡器的脉冲都会使计数器-1。当计数器变 为0时,会产生一个中断,并停止工作,直到软件再一次显示启动。

  • 还有一种模式时方波(squarewave mode)模式在这种模式下,当计数器变为0并产生中断后,存储寄存器的值会自动复制到计 数器中,这种周期性的中断称为一个时钟周期。

2.时钟软件

  • 时钟硬件所做的工作只是根据已知的时间间隔产生中断,而其他的工作都是由时钟软件来完成,一般 操作系统的不同,时钟软件的具体实现也不同,但是一般都会包括以下这几点维护一天的时间
  • •阻止进程运行的时间超过其指定时间
  • •统计CPU的使用情况
  • •处理用户进程的警告系统调用
  • •为系统各个部分提供看门狗定时器
  • •完成概要剖析,监视和信息收集

3.软定时器

  • 时钟软件也被称为可编程时钟,可以设置它以程序需要的任何速率引发中断。时钟软件触发的中断是一 种硬中断,但是某些应用程序对于硬中断来说是不可接受的。
  • 这时候就需要一种软定时器(soft timer)避免了中断,无论何时当内核因为某种原因呢在运行时, 它返回用户态之前都会检查时钟来了解软定时器是否到期
  • 如果软定时器到期,则执行被调度的事件也 无需切换到内核态,因为本身已经处于内核态中。这种方式避免了频繁的内核态和用户态之前的切换, 提高了程序运行效率。
  • 软定时器因为不同的原因切换进入内核态的速率不同,原因主要有
  • 系统调用
  • TLB未命中
  • 缺页异常
  • I/O中断
  • CPU变得空闲

猜你喜欢

转载自blog.csdn.net/wolfGuiDao/article/details/107761892
今日推荐