【知识强化】第四章 文件管理 4.3 磁盘组织与管理

那由盘面、柱面、扇区又引出了磁盘的物理地址结构,那最后咱们会介绍磁盘的几种分类。算法

在这个磁盘的中间会有一个马达,而这个马达转动的时候就能够带动整个磁盘的转动。缓存

那这是磁道和扇区相关的概念。网络

那接下来咱们来看一下怎么从磁盘当中读取数据呢?数据结构

因此你们须要注意的是,若是要对一个扇区进行读或者写操做的话,那么须要经过磁头臂来带动磁头,让磁头放到那个扇区对应的磁道上。函数

因此这是磁盘的物理地址的结构——(柱面号,盘面号,扇区号)。性能

能够经过这个磁臂来回地伸缩来带动磁头,从而就能够定位到指定的磁道。学习

那这是按照磁头是否能够移动来进行划分的两种分类——活动头磁盘和固定头磁盘。优化

另外,若是从这些盘片究竟是否能够更换又能够把磁盘划分为可换盘磁盘还有固定盘磁盘。spa

理解磁道、扇区、柱面、盘面这些最基本的概念。那由盘面、柱面、扇区这些概念咱们能够知道磁盘的物理地址结构能够分为这样的三元组,能够用(柱面号、盘面号、扇区号)来定位整个磁盘当中的某一个特定的扇区。那这个物理地址的结构也是很常考查的。而磁头的移动须要耗费必定的时间。总之要读取某一个扇区或者某一个磁道上的数据的时候,那咱们须要移动磁头。那在这个小节的最后咱们介绍了磁盘的分类,那这个你们可以有个印象就能够了。比较可能进行考查的是固定磁头磁盘当中每个磁道都会对应一个磁头,而移动头磁盘当中每个盘面只会有一个磁头。这一点有可能在选择题当中进行考查。操作系统

在这个小节中咱们会学习一个很重要很高频的考点——磁盘调度算法。

那磁盘调度算法的不一样会影响寻找时间的长短,因此选择一个合适的磁盘调度算法对于磁盘的总体性能来讲是会有很大影响的。

磁头是由磁头臂带动的,因此在移动磁头以前是须要先启动磁头臂,这个须要花费必定的时间。

那这是读写操做要进行的第一个步骤,就是寻道,寻找对应的磁道。

第二个读写操做须要花费的时间,叫延迟时间。

那么转动磁盘所消耗的这个时间就是我们这儿所谓的延迟时间。那从这个地方咱们能够看到,磁盘的转速越高,那它的延迟时间会越小,也就是说磁盘的读写速度越快。

那这是读写操做过程当中须要花费的第二个部分的时间——延迟时间。

第三个部分的时间叫传输时间。

传输时间指的哪部分。那经过寻道时间还有延迟时间这两个部分以后,咱们的磁头此时已经放在了想要读取的那个扇区的开头的位置。

那接下来要读取这些扇区的数据,就须要继续转动磁盘。那转动磁盘所须要的这些时间就是所谓的传输时间。

所以一次磁盘的读或者写操做,总共须要的时间就应该是寻道时间+延迟时间+传输时间。

那从延迟时间和传输时间的这个计算公式你们也能够发现,转速越快延迟时间越短,传输时间也越短。操做系统不可能用软件的方式来加快这个磁盘的转速,因此延迟时间和传输时间是操做系统没法优化的两个部分的时间。

那操做系统惟一能够影响的时间就是寻道时间。根据不一样的磁盘调度算法,这个寻道时间会有很大的差别。那咱们接下来会开始学习各类咱们须要掌握的磁盘调度算法。

因此先来先服务算法的优势是很公平,先来的就先获得服务。而且若是请求访问的那些磁道是比较集中的话,那么这个算法的性能还算能够。不过这个算法的缺点也很明显,若是有大量的进程竟争地使用这个硬盘,而且请求访问的这个磁道很分散的话,那么先来先服务算法的性能就会不好,它在性能上实际上是近似于随机调度算法。那相应的,若是要访问那些磁道很分散的话,那么先来先服务算法的寻道时间就会很长,平均寻找长度也会很长。

相比于以前的先来先服务算法来讲,这个平均寻找长度、平均的寻道时间就会变得少了不少了。因此最短寻找时间优先算法的性能是比较好的,平均寻道时间也比较短。可是这种算法的缺点是有可能会产生“饥饿”现象。那这样的话就致使了这边的这些请求长期得不到服务的现象,也就是发生了“饥饿”。

只要在这个小区域内有源源不断的请求到来,那么它会一直在这个小区域内,而没办法跳出这个区域为其余区域的这些请求进行服务。

所以为了解决这个问题人们又提出了扫描算法。可见,这种算法的平均寻找时间要比先来先服务算法要好不少,虽说这个平均寻找长度、平均寻道时间要比最短寻找时间优先算法要更次一些,可是这种算法的规则带来的好处就是它不会产生“饥饿”现象。因此在刚才我们分析的这个场景当中,对于90号磁道的访问频率要更低一些,而对于184号磁道的访问频率要更高一些。

那这是扫描算法能够再改进的第二个地方。那咱们首先看一下第一个缺点应该怎么改进。那在以前的扫描算法的当中,这个平均寻找长度是30多个,因此采用LOOK调度算法这种策略的话,那么平均的寻找长度、平均寻道时间就进一步地获得了缩短。

那接下来咱们再来看一下扫描算法的第二个缺点应该怎么解决。因此C-SCAN算法或者说循环扫描算法它比起SCAN算法来讲对各个位置的这种磁道的响应频率就变得很平均了。不过和SCAN算法相似,这种算法有一个很明显的缺点,

那为了解决C-SCAN算法的这些缺点,人们又提出了C-LOOK算法。那C-LOOK算法和LOOK算法实际上是很相似的,也是采用了一样的思想。因此比起C-SCAN算法来讲,C-LOOK算法使寻道时间还有平均寻找长度进一步地缩短了。

寻道时间由启动磁臂的时间和移动磁头所花的时间组成。那咱们以后介绍的这些磁盘调度算法主要影响的是移动磁头所花的时间。须要可以本身推出来那个延迟时间和传输时间的这个计算公式。最短寻找时间优先算法有可能致使饥饿,而且这种算法它只能保证眼前最优,但没法保证整体最优。也就是说每一次的寻道确定是当前来看最短的,不过整体来看总的寻道时间、总的寻道长度未必是最短的。那以后咱们又介绍了SCAN算法,还有SCAN算法的改良性算法——LOOK调度算法和C-SCAN算法,还有C-SCAN算法的改良性算法C-LOOK算法。不过你们在作题的时候,若是题目当中没有特别地说明,那么题目中所指的SCAN算法其实就是LOOK算法,题目所指的C-SCAN算法其实就是C-LOOK算法,也就是说这个磁头并不必定须要移动到最外侧的那个磁道上,只要磁头的移动方向上没有别的请求了,那么就可让磁头当即改变方向。

减小磁盘延迟时间的方法。

探讨一个磁盘地址结构的问题。

启动磁头臂和移动磁头实际上是一种物理上的移动,它须要花费的时间是比较高的。那这是盘面号在柱面号以前的这种状况。

书里推荐的这种物理地址结构,也就是柱面号放在盘面号以前会发生什么状况呢?

所以咱们接下来想要读取这个范围内的这些扇区的话,咱们只须要激活1号盘面对应的这个磁头就能够了,并不须要像以前所介绍的那样再启动磁头臂而后来回地移动磁头。

介绍第二种减小磁盘延迟时间的方法,叫作错位命名。咱们先来分析一下不采用错位命名方式在读取这种编号连续的这些扇区的时候会发生什么状况。

那这个地方须要注意,全部的这些盘面都是一块儿连轴转的,都是同步旋转的。那假设此时咱们要读取的是物理地址为0的扇区一直到物理地址为8的扇区,也就是一直读到这个扇区。

那这个读取的过程应该是这样的。首先要读取的是0号盘面最内侧这个磁道全部的这些扇区,因此首先须要把0号盘面的这个磁头激活,而后让磁盘进行旋转,而且旋转的过程当中进行读写。

那经过以前的分析咱们知道,它须要转两圈才能够把最内侧的这个磁道给读完。那转了两圈以后,此时磁头指向的是这个位置。那相应的一号盘面和0号盘面也是同步旋转的,因此1号盘面应该也是指向了它本身的0号扇区所对应的这个位置。

可是以前我们说过,

这个磁盘继续旋转,在这个旋转的过程中,

因为磁头尚未准备好读写数据,所以1号盘面的0号程序,也就是物理地址为8的这个程序,从磁头下面划过的这个过程中,并不能直接把这块的数据给读入。若是要读入这块的数据,那只能等到这个磁盘再转一圈让这个扇区再次划过磁头下方。也就是说,若是咱们把这些盘面它们相对位置相同的这些扇区都设置为相同的编号,那么可能会增长延迟时间。

因此为了解决这个问题,能够用错位命名的方式来进行。0号盘面是在1号盘面的正上方,也就是说0号盘面的0号程序它的正下方对应的应该是1号盘面的7号程序。而0号盘面的4号程序它的正下方对应的应该是1号盘面的0号程序。也就是说这些扇区的编号它们是错开的,因此这也是为何叫错位命名的缘由。

那读取完这个区域的数据以后,这个磁头它须要有必定的时间进行准备。那在这个准备的过程当中是不能读入任何数据的。

 

那相比于以前的那种方案,这种方案很显然能够减小磁盘的延迟时间。那这个点实际上是看书的时候不太容易理解的一个点。

咱们须要理解为何柱面号必定要在盘面号以前,其实本质缘由就是为了减小移动磁头的这个次数。

介绍磁盘管理相关的几个很简单的知识点。

什么是磁盘初始化,磁盘初始化的过程当中须要作些什么。介绍引导块或者提及始块的概念。最后会介绍对于磁盘坏块的一个管理。

咱们的磁盘刚被制造出来的时候,实际上是只被划分红了一个一个的磁道。

那在磁盘正式出厂以前,还须要进行一个叫作低级格式化或者叫物理格式化的过程。

这个过程就是一个划分扇区的过程。那每一个扇区的数据区域所能存放的数据数量都是相同的,好比说能够存放512个字节。因此我们以前所聊到的一个扇区能够存放数据的大小其实指的是数据区域能够存放的大小。我们在讲文件的物理结构的时候讲过一种链式结构,也就是把文件的那些数据块用连接的方式把它链起来。那前一个数据块指向下一个数据块的指针其实就能够保存在尾部这个部分,也就是说这个连接指针并不须要占用数据区域,那这样的话能够方便操做系统管理。另外呢管理扇区所须要的那些数据结构通常也是放在头和尾的位置,好比说像扇区校验码。那你们在计组当中应该也学过奇偶校验还有循环冗余校验码等等。这些校验码能够用来检查数据区域当中存放的这些数据是否发生了错误,那这样的话能够大幅度地提升磁盘存储数据的一个可靠性。总之一个扇区由头、数据区域、尾三个部分组成。那扇区的划分实际上是在出厂以前,低级格式化也就是物理格式化的时候进行的。

那在咱们正式开始使用磁盘以前,还须要对磁盘进行逻辑上的分区。每一个分区呢由若干个相邻的柱面组成。

这儿所谓的分区就是咱们平时熟悉的C盘、D盘、E盘。

包括要建立这些根目录的目录文件,而且要把那些用于存储空间管理的数据结构也进行初始化,好比说像我们以前学过的位示图、空闲分区表等等也是在逻辑格式化这个步骤当中给创建的。那这是磁盘初始化的时候所要作的几个事情。

什么是磁盘的引导块?

在咱们的磁盘完成了物理格式化,还有磁盘分区和逻辑格式化以后,咱们就能够把操做系统的那些相关数据把它写到这个磁盘中了。也就是咱们所谓的本身安装操做系统的一个过程。

那在计算机开机启动的时候,实际上是须要进行一系列的初始化工做的。包括初始化CPU、初始化内存还有初始化像寄存器之类的一些硬件部件。可是这个初始化的过程须要执行所谓的初始化程序,也叫自举程序。

那通常来讲这个自举程序是存放在ROM也就是只读存储器当中的。而ROM中的数据是在出厂的时候就已经写到了这个ROM当中,而且之后就不能再修改。

那通常来讲ROM在出厂的时候就直接集成到了咱们的电脑主板上,也就是说计算机开机的时候,它首先会读取ROM当中的这个这些程序而且执行这些程序来完成初始化的工做。

可是咱们来思考一下。可是因为自举程序自己又比较复杂,因此咱们不太可能保证自举程序相关的数据永远不改变。

那这个问题怎么解决呢?那现代的操做系统通常是只在ROM当中存放很小的一个自举装入程序,

而完整的自举程序会存放在,好比说存放在C盘的这几个盘块上。那么这些区域就能够称做启动分区或者叫引导块、启动块。启动块规定必须在磁盘的固定位置。

那当计算机开机的时候首先会执行ROM中的自举装入程序。在执行这个自举装入程序的过程中,CPU就能够知道接下来须要执行的自举程序是存放在硬盘当中的哪一个位置的。那经过自举装入程序的引导,CPU就能够从磁盘中读取完整的自举程序。这样的话就能够完成初始化。那自举装入程序的复杂度不高,很小。因此实际上是能够保证自举装入程序不出错的,不须要更改的。而自举程序须要更改的话,咱们就把自举程序放在磁盘的固定位置。那这样的话当自举程序须要更新的时候,只须要从新把这些引导块当中的数据把它重写一下、更新一下就能够了。因此这种方案带来的好处就是自举程序的更新会变得很方便。

那通常来讲拥有这个启动分区或者叫引导快、启动块的这个逻辑磁盘就被称为启动磁盘或者叫系统磁盘。那像平时我们很熟悉的C盘就是系统磁盘。也就说其实C盘的某一个固定位置是装了咱们的自举程序的。那这是引导块的做用。

操做系统是没法经过软件的方式把它进行修复的。

因此为了防止咱们错误地使用这些坏块,咱们就必须把这些坏块给标记出来。那标记为坏块的这些块以后再也不分配给任何一个文件就能够了。那因为操做系统在对存储空间进行管理的时候确定是须要读取文件分配表FAT的内容的。而哪些块是坏块是记录在文件分配表FAT当中的。所以采用这种方式的话,坏块对这个操做系统是不透明的。

磁盘控制器会负责维护一个叫作坏块链表的一个链表,顾名思义就是把这些坏块用某种方式把它们连接起来。那在磁盘出厂的时候其实就已经有可能有一些坏块了,因此在出厂以前就会对这些坏块进行一个检查,

在低级格式化也就是物理格式化的时候就须要把这个坏块链进行初始化。

另外,磁盘控制器还会保留一些好的“备用”扇区用来替换这些坏块。可是这个过程对于操做系统是透明的,操做系统是不可知的。那这种方案也被称为扇区备用。那这是对磁盘的坏块进行管理的两种方法。

磁盘的初始化须要作一些什么事情,分为低级格式化(物理格式化)、磁盘分区还有逻辑格式化这样三个步骤。你们须要理解而且记住各个步骤须要作的是一些什么事情。引导块主要是用于存放自举程序的。在开机的时候必定须要运行自举程序才能够完成CPU、内存、寄存器的初始化的过程。最后咱们介绍了两种坏块的管理方式。你们只须要有个印象,能应付选择题就能够了。

这门课的最后一个章节——设备管理。

操做系统它做为系统资源的管理者,既须要对上层的软件进行管理,也须要对下层的硬件进行管理。操做系统它须要对处理机还有存储器这些硬件进行管理,可是这些硬件实际上是在计算机的主机内部的。那这个章节咱们要探讨的所谓的设备管理其实指的是操做系统对计算机主机外部的那些硬件设备的一个管理。

了解一下I/O设备的基本概念和分类。

人机交互类外部设备传输速度会比较慢,数据的传输都是以字节或者几十字节为单位的。猫还有路由器这些就属于网络通讯设备。网络通讯设备的传输速度会比人机交互类外部设备更快一些,又会比存储类的外部设备要更慢一些。

由于咱们每敲击一次键盘其实只是往计算机当中输入了一个字符,因此这种设备和计算机进行数据交换的速度是很慢的。高速设备,像平时我们使用的移动硬盘。那其实高中低速并无一个很明确的这种界限划分,因此这个知识点你们也不须要特别地记忆,能有一个印象了解就能够了,基本不可能做为考点进行考查。

移动硬盘、磁盘等等这些就属于块设备。那像字符设备的话就是相似于鼠标键盘这种,数据的传输基本单位是字符或者字节。那中断的概念我们在第一章也有比较详细的介绍,在下个小节中咱们还会继续介绍什么叫中断驱动方式。

那像前面的这两种分类方式,其实并不会有很明确的那种划分的界限,因此这两种分类方式其实通常来讲也不太可能进行考查。所以你们须要重点关注的是第三种分类方式,也就是按信息交换的单位分类,分为块设备和字符设备。你们须要注意它们之间的区别。那这两类设备最本质的区别是,这种设备与计算机进行数据交换的时候,这种数据交换的基本单位,一个是块,一个是字符。那除此以外,你们还须要结合上一章的内容理解块设备是可寻址的,而字符设备是不可寻址的,这样的两个特性。那字符设备一般会采用中断驱动的这种I/O控制方式,那这也是咱们下个小节会详细介绍的内容。

学习I/O控制器相关的内容。那学习了这个小节的内容以后有助于咱们理解以后的小节会讲解的I/O控制方式。

那在操做系统这门课当中重点须要掌握的是电子部件相关的一些知识。其实当咱们的这些I/O设备连上电脑以后,咱们的CPU是没办法直接控制这些I/O设备的机械部件的,它必须经过电子部件来间接地控制这些机械部件。

那咱们最熟悉、最简单的命令固然就是读或者写的命令。那除了命令自己以外,CPU还会告诉I/O控制器执行这个命令相关的一些参数。好比说要读多少个字节,要写多少个字节。

所以I/O控制器当中须要设置一个叫作控制寄存器的东西,就是用来存放CPU发出的命令和参数的。那以后I/O控制器就能够根据这个寄存器当中存放的这些数据来肯定本身要执行的究竟是什么样一个操做了。那除了接收和识别CPU发出的命令以外,I/O控制器还须要可以向CPU报告设备的状态。好比说一个设备此时究竟是忙碌的仍是空闲的,仍是说这个设备此时处于故障的状态。那CPU做为系统资源的管理者,固然也须要知道各个设备的相应的状态。

因此I/O控制器当中也会设置一个叫作状态寄存器的东西。那CPU能够读取这个寄存器当中的内容来判断一个I/O设备此时的状态。固然若是还有其余更复杂的状态的话,那咱们能够用更多的二进制位来表示。

由于I/O控制器它是CPU和I/O设备机械部件之间的中介。因此它做为这个中介,固然也须要负责做为这个数据交换的中间的一个使者。

这个I/O控制器当中会设置各类各样的寄存器,而且每一种寄存器可能会有多个。那为了识别这些寄存器,咱们也须要像给内存编址同样给各个寄存器编上一个相应的地址。那CPU在往这些寄存器当中读或者写数据的时候,就是经过这些寄存器对应的地址来进行操做的。

了解了I/O控制器的功能,还有各个功能大体须要怎么实现以后,咱们来看一下I/O控制器应该由哪些部分组成。I/O控制器它实际上是做为CPU和I/O设备的机械部件之间的一个中介的关系。而这个中介在链接CPU和I/O设备的时候,必然是须要作一些中间的处理的。那这些处理主要就是在I/O逻辑这个部分来完成的。

因此I/O逻辑,固然像我们刚才提到的,地址识别或者说地址译码也是这个I/O逻辑须要进行的。那在接收和识别了CPU的命令以后,它还须要把它翻译成具体的设备可以明白的一些命令,而后经过这个控制器与设备之间的接口发送给具体的设备,让设备执行相应的操做。那这个地方你们会发现,一个I/O控制器它可能会有多个控制器与设备之间的接口,也就是说一个I/O控制器有可能会负责控制多个具体的I/O设备。那为了区别CPU此时要操做的究竟是哪个设备,一样须要给这些设备进行一个编号,或者说给各个设备接口一个地址,那CPU在发出I/O命令的时候也须要指明本身须要操纵的是哪一个设备。

CPU首先会经过一个叫作控制线的线路,向I/O控制器发出一个具体的I/O指令。同时CPU还会在地址线这样的一个线路上说明本身要操纵的是哪个设备。那若是说此时是要输出一个数据的话,那CPU会经过数据总线把本身要输出的数据放到I/O控制器的数据寄存器当中。那以后I/O逻辑就能够从数据寄存器当中取得CPU想要输出的数据。那相似的,CPU此时发出的这个I/O指令可能会有一些相应的参数,那这些参数它会放到控制寄存器当中。那I/O逻辑就能够从控制寄存器当中读出相应的参数了。另外,为了实现对各个设备的管理,CPU还会从这个状态寄存器当中读出各个设备的一个状态,好比说忙碌、空闲仍是故障等等。那I/O逻辑会往状态寄存器当中写入相应的数据来告诉CPU各个设备的状态究竟是什么样的。

 那这就是CPU与控制器的接口所须要负责完成的一些事情。这个接口主要就是用于完成CPU和控制器之间的通讯。

那相似的,控制器与设备的接口其实就是用于完成控制器和设备之间的一个通讯。那好比说此时是要输出一个数据的话,首先就是由CPU经过数据总线把数据写入到数据寄存器当中,而后I/O逻辑取出数据寄存器当中的内容,而后经过控制器与设备的接口、数据通路把这些数据输出到外部设备上。那相似的,若是要输入一个数据的话,这些数据能够经过控制器与设备的接口输入,而后I/O逻辑会把这些数据放到数据寄存器当中。以后CPU又从数据寄存器当中取走数据,那这就完成了一个数据输入的过程。

 那除了这样一个传送数据的通路以外,设备还须要及时地向I/O控制器反馈本身的状态。好比说这个设备究竟是忙碌仍是空闲,那一样的设备经过这个接口向I/O控制器报告此时本身的状态,而后I/O控制器的I/O逻辑又会把这个设备的状态写入到它对应的状态寄存器当中。

那最后这个接口中还会有一个用于实现设备控制的一个电路,那I/O逻辑会根据CPU发出的命令还有相应的参数而后对对应的设备发出一些控制命令,让这些设备执行具体的工做。那这就是I/O控制器的一个组成,分为这样的三个部分。

这个地方有两个小细节比较值得注意。第二,因为这个控制器会对应多个设备,而各个设备须要输入输出的数据还有各个设备的状态这些确定是不一样的,因此若是这些设备同时工做的话,那么显然只设置一个数据寄存器、状态寄存器确定是不能知足需求的。因此既然I/O控制器中会有多个寄存器,那为了识别各个寄存器,也须要给这些寄存器进行编址。

咱们来看一下内存映像I/O和寄存器独立编址的区别。不过在有的系统当中也有多是各个设备控制器当中的寄存器用连续编号的方式。固然咱们并不须要纠结这些细节,咱们只须要知道若是采用的是寄存器独立编址这种方案的话,那么这些寄存器和内存的地址空间并非统一的,它们是两个独立的体系。

那采用这种方式有一个很明显的缺点,就是要设置一些专门的指令来实现对这些寄存器的一个存取操做。那像这个例子当中,各个控制器的这些寄存器它们的地址也都是相互独立的,那在这种状况下,咱们不只要指明咱们要操做的寄存器的编号,同时还须要说明到底要操做的是哪个控制器,是控制0仍是控制器1。

而若是咱们采用的是内存映像I/O这种方式的话,那么咱们就不须要设置专门的指令来支持对这些寄存器的操做。咱们只须要用对内存单元的操做、相同的那些指令来操做这些寄存器就能够了。那这是这两种方式的一个区别还有它们的有优缺点。

介绍了I/O控制器,也就是I/O设备的电子部件。那随着计算机的发展,也出现不少种对I/O设备的控制方式,这是我们以后的那个小节会重点讲解的内容。那这个小节的内容考的频率并非很高,可是你们也须要能有一个大体的印象。须要重点注意的是,两种寄存器编址方式的一个区别还有它们各自的优缺点,固然I/O控制器由3个部分组成,因此你们对于控制器的组成、主要功能这些也须要有个大致的印象。

学习本章的一个重要的考点——I/O控制方式。可是随着计算机的发展,I/O控制器也是在不停地发展的。那相应的,I/O控制器对设备的控制方式也出现了不一样的变化或者说进化。

须要注意这样的几个问题。第一,在各类I/O控制方式当中,完成一次读写操做的流程分别是怎么样的。第二,咱们须要注意的是CPU对这个I/O操做的一个干预的频率。第三,咱们须要注意在不一样的控制方式当中,进行一次I/O所要传送的数据的单位究竟是多少。第四,咱们还须要注意数据的流向。第五,咱们须要注意的是各类控制方式的一个主要缺点和主要优势。那什么是干预频率,什么是传送单位,什么是数据流向,待会看具体的例子就能够理解了。

首先要了解的是程序直接控制方式,这也是最先期的一种I/O控制方式。那若是要完成一个读操做的话,CPU首先会经过控制线向I/O控制器发出一个读指令,因而I/O控制器会根据CPU的要求启动相应的设备,而且把这个设备对应的状态设置为未就绪或者说忙碌的一个状态,那咱们假设状态寄存器为1表示的是设备忙碌。那接下来这个设备就会开始准备计算机想要读入的数据,可是因为设备的速度要比CPU的速度慢不少,因此在设备尚未完成I/O以前,CPU会一直不断地轮询检查这个设备的状态。

因此其实这个数据输入的过程,原本应该是从设备输入到内存的,可是这个过程当中必须先通过CPU的寄存器,而后再由寄存器转存到内存当中。

 

因此其实若是采用程序直接控制方式的话,那么咱们须要掌握的一个重点的核心词叫作轮询。采用这种方式完成一次读写操做的流程,就像这个图表示的这样。其实读I/O模块的状态,是从I/O控制器的那个状态寄存器当中读出数据而后放到CPU的寄存器当中进行分析。由于I/O设备有可能会出现一些故障,那若是I/O设备出错的话,也会在I/O控制器的状态寄存器当中写入相应的那些错误代码。那CPU就能够根据这些代码来判断此时这个I/O设备是否已经产生错误了,因此这儿有可能会产生一个错误条件。那么咱们知道咱们定义的这些变量a,b,c,d其实它们是存放在存储器也就是内存当中的。因此其实这些数据从键盘读入以后,最终确定是要被放到存储器也就是内存当中。所以,当CPU得到咱们从键盘输入的数据以后,其实尚未结束,还须要把这些数据把它写入到相应的存储器的相应单元里。那原理相同,当咱们使用printf这个输出数据的函数的时候,其实咱们作的事情是要把内存当中存储的这些变量的数据拿出来而后最后通过CPU再输出到输出设备上。

在使用程序直接控制方式这种方式的时候,CPU须要不断地轮询检查这个I/O操做是否已经完成,因此CPU干预的频率是很频繁的。不只在I/O操做开始以前还有完成以后须要CPU的介入,在等待I/O完成的过程中,这个CPU也须要不断地进行轮询检查。那这也是程序直接控制方式的一个最大的一个缺点。

每一次读入或者写出的数据,数据量是一个字。

因此每个字的读和写都须要CPU的介入帮助,也就是说CPU须要花费大量的时间来辅助完成这个I/O的过程。

优势的话就是实现简单,能够用软件的方式就能够实现。那因为它这个轮询的过程其实就是在执行一系列循环检查的指令,因此这种方式才叫程序直接控制方式。由于在CPU发出一个I/O指令以后,CPU并不能去作别的事情,它须要一直不断地循环检查这个I/O是否已经完成了。因此CPU会长期处于一个忙等的状态,致使CPU的利用率低。那相应的,当CPU在进行别的一些计算工做的时候,I/O设备确定也是空闲的,因此I/O设备的利用率其实也是低的。

为此人们提出了中断驱动方式。与程序直接控制方式相比,中断驱动方式主要是引入了中断机构,可让CPU在发出了I/O指令以后,转头能够作别的事情,也就是能够切换到别的进程。那因为咱们的I/O设备是速度很慢的,而CPU又是一种速度很快的一个硬件机构。固然也能够选择不恢复被阻塞的进程,让它继续在就绪队列里等待,而后先执行别的进程。在中断驱动方式当中,每次发生中断只能读入一个字的数据。因此若是要读入大量的数据的话,那显然会发生大量的中断,那这样的话就会致使系统的性能下降。

那因为等待I/O完成的这个过程当中,CPU能够切换到别的进程执行,因此在引入了中断以后才实现了CPU和I/O设备并行工做的这样的一个特色。

每发出一个读或者写指令,只会读入或者写出一个字大小的数据。

那中断驱动方式的优势呢其实就是解决了程序直接控制方式的最大的缺点。引入了中断技术以后,可让CPU和I/O设备并行地工做,而后CPU再也不须要不停地轮询来检查这个I/O是否完成,这样的话CPU的利用率还有I/O设备的利用率也获得了明显的提高。那这种方式也存在一个很明显的缺点,就是因为它每次只能传送一个字,因此当咱们须要传送大量的数据的时候,那显然会发生不少次的中断,而每一次中断的处理又须要付出必定的时间代价,因此若是中断发生的太频繁,那么这个中断处理会消耗不少的CPU时间。另外呢,采用这种方式的时候,在读入数据或者写出数据的时候,都必须先通过CPU,可是经过以前的分析咱们也知道,其实读入数据无非就是把I/O设备准备好的数据放到内存里,而写出数据无非就是把内存中的数据写出到I/O设备,因此能不能把中间就是必须通过CPU的中转这个步骤给砍掉呢?

那为此,人们又提出了一种新的I/O控制方式——DMA方式。每次会读入或者写出一个块。

另外呢,数据的流向再也不须要通过CPU,而是能够在DMA控制器的控制下直接从设备放入到内存,或者直接从内存写出到设备。

第三,CPU对于I/O操做的干预频率又进一步地下降。仅仅在传送一个或者多个数据块的开始和结束的时候,才须要CPU进行干预。

DMA控制器其实也是一种I/O控制器,只不过它和我们上一小节介绍的I/O控制器有那么一些小小的区别。

不过DMA控制器依然是由3个部分组成。第一个部分是主机或者说CPU和控制器的接口,第二个部分是I/O控制逻辑,第三个部分是块设备和控制器的接口。那这和I/O控制器的3个部分都是一一对应的。那为了实现控制器和CPU之间的通讯,它会在这个地方设置一系列的寄存器。而后CPU能够经过系统总线来读或者写其中的某一些寄存器当中的内容,用这种方式达到控制I/O设备的一个目的。

DR至关于一个中转站,这个和我们以前介绍的数据寄存器没有太大的区别。MAR它是用于存放内存地址的。那和以前我们介绍的I/O控制器同样,这些寄存器也有可能会有多个,在这个地方并无列全。那这些寄存器是最主要的主机和控制器之间的接口。

而在控制器和块设备之间也有一个相应的接口,经过这个接口能够实现控制器对于这些块设备的一个通讯、控制的一个过程。

那除此以外,系统总线还会把DMA控制器和内存链接在一块儿。因此DMA控制器和内存之间能够直接进行数据的读写,再也不须要通过CPU。好比说CPU能够在刚开始指明此次要读入的数据是存放在磁盘的什么位置,那这些读入的数据应该存放在内存的什么位置,这些信息是存放在MAR里的。而且还要说明这次要读入的数据的数据量究竟是多少,那这些数据量又是存放在DC这个寄存器当中。

那接下来DMA控制器就会根据CPU提供的这一系列的参数从磁盘的相应位置读入数据,而后写到内存里。而这个过程就再也不须要CPU的干预,只有DMA控制器完成了整个CPU指定的这一系列的任务以后,它才会向CPU发出一个中断信号,而后CPU再介入进行后续的处理。那这个地方须要注意的是,DMA控制器并非每次直接读入一整块的数据,而后直接把一整块放到内存当中。其实DMA控制器在读入数据的过程中,也是一个字一个字读入的。而后每次读入了一个字都是先会存放在DR也就是数据寄存器当中,再从DR写入到内存当中。用这样一个字一个字的方式,最终就能够完成一整块的数据的读入工做。

 

在采用这种方式以后,CPU的干预频率就进一步地下降了。在开始以前CPU须要发出相应的I/O指令而且指明那些相应的参数。而后在结束以后CPU又须要处理中断而后进行后续的一系列处理。

而数据的传送单位也从一个字变成了一个块。CPU每发出一个读指令或者写指令以后,DMA控制器就能够完成对一个块或者多个块的读和写的操做。可是须要注意的是,这个地指的多个块只能是读写那些连续的多个块,而且这些块在读入内存以后也必须是连续存放的。也就是说,若是咱们是想要读入多个离散的块,或者这些读入的块须要离散地存放在内存的不一样位置的话,那么采用DMA方式一样是须要CPU发出多条这个I/O指令。

那在采用了DMA方式以后,数据的流向就再也不须要通过CPU,还能够直接从I/O设备读入,而后在DMA控制器的控制下直接把数据放入到内存。在输出的时候就恰好相反,一样是不须要通过CPU的。

因此这种方式的优势呢就是进一步提高了这个数据传输的效率。数据传输以“块”为单位,而后CPU介入的频率能够进一步地下降,这样的话CPU就能够有更多的时间去进行别的处理。另外,数据传输的过程也不须要再通过CPU,因此数据传输的效率也获得了进一步的提高。那全部的这些其实带来的结果都是,可让CPU从这些繁杂的I/O工做当中抽离出来,让CPU有更多的时间去处理别的那些计算任务。因此采用这种方式以后,I/O设备和CPU的并行性获得了进一步的提高,资源利用率也获得了进一步的提高。

若是咱们要读取离散的数据块,或者读入的数据块要离散地存放在不一样的内存区域当中的时候,就须要发出多条I/O指令。所以这是DMA方式还须要继续改进的一个特色。

那为了解决这个问题,人们又提出了通道控制方式。通道能够识别而且执行一系列的通道指令,就相似于我们CPU识别的那些指令同样。那为何叫“弱鸡版的CPU”这个我们一下子再解释。咱们首先来看一下通道的工做原理。CPU、内存、通道经过系统总线链接到一块儿。首先CPU会向通道这个硬件发出I/O指令,而且指明这次要执行的通道程序或者说通道指令的序列它是存放在内存的什么位置的。同时CPU还须要指明这次要执行操做的设备究竟是哪个。那在把这些信息告诉了通道以后,CPU就能够切换到其余进程执行了,能够抽离出去开始干别的事情。

那么以后通道会根据CPU的指示去找到这次要执行的通道程序存放在内存当中的什么位置。那这个通道程序其实你们能够把它理解成是一种任务清单,其实这个任务清单就是一系列通道指令的集合。本质上它和咱们熟悉的,普通的那些程序其实都是同样的。那在这个任务清单的通道指令当中,也会向通道指明这次要读入和写出的数据究竟是多少,读写的数据应该放在内存当中的什么位置,它是放在外存中的什么位置等等这一系列的信息。这些都是通道在执行这个程序的过程中就能够知道的事情。因此若是采用这种方式的话,就至关于CPU只是告诉通道你如今去执行这样的一个任务,那这个任务的清单我已经放在内存里了。但具体这个任务须要作什么,并非由CPU直接告诉通道的,而是由通道直接去读取内存当中的这个程序,而后一步一步执行。

那当这个通道执行完了这一系列的任务以后它就会向CPU发出一个中断信号。CPU接收到中断信号以后对中断进行处理,而后再继续执行接下来的那一系列的程序。因此这就是通道控制方式当中完成一次I/O所须要经历的一系列步骤。

那为何说通道是一种“弱鸡版”的CPU呢?由于通道它能够识别一系列的通道指令,可是它所能识别的这些指令与CPU能识别的那些指令相比,它的指令是很单一的,而且通道也并无本身的内存,它须要和CPU共享主机的内存。因此因为通道这个硬件只能识别一些很简单的、很单一的通道指令,所以咱们能够把它理解为是一个“弱鸡版”的CPU。

而引入了通道以后,CPU的干预频率就进一步地下降了。CPU能够一次扔给通道一堆事情,那这些事情会写在通道程序里。因此通道能够根据通道程序的指示,一步一步完成I/O操做。而后当它完成了一系列的数据块的读写以后,才须要对CPU发出中断信号。所以CPU的干预频率是极低的。

那DMA控制方式当中每一次读写是读写一个数据块或者多个连续的数据块。可是在通道控制方式当中,每一次读写能够完成对一组数据块的读写操做。

那与DMA控制方式相似,采用了通道控制方式以后,能够在通道的控制下,让数据直接从I/O设备读入内存,或者直接把内存中的数据输出到I/O设备当中。

那通道方式的主要缺点呢就是

四种咱们须要掌握的I/O控制方式,分别是程序直接控制方式、中断驱动方式、DMA方式和通道控制方式。首先咱们须要理清楚在每一种控制方式下完成一次读写操做的大体过程、大体流程是怎么样的,这个常常在选择题当中进行考查。CPU的干预频率从极高慢慢变成了极低,而每次I/O的数据传输单位,又从字这么一个很小的数据单位,慢慢变成块。而最后的通道方式甚至能够支持每次传输一组块。因此整个发展过程都是在追求这样的一个事情。

通道须要根据这个任务清单来执行这一系列的任务,而这个通道程序又是由一系列的通道指令组成的。另外呢,你们还须要注意,一个通道能够控制多个I/O控制器,而一个I/O控制器又能够控制多个I/O设备。好的,那么这个小节的内容十分重要,你们还须要通过课后习题进行进一步的巩固。

学习I/O软件层次结构相关的知识点。

而I/O设备的硬件又是由机械部分和电子部分组成的。因此I/O硬件的组成还有它的原理我们在I/O控制器那个小节当中进行讲解过。这个小节中咱们重点关注的是软件层面要实现的一些功能。那上面的用户层软件是在操做系统内核以外的,也就是能够在用户态下实现的一系列功能。那各个层次都会使用它们下面一层软件所提供的功能,而且向它上层的软件提供一些服务。那像这种,每一层使用下一层的服务来实现某一些功能,而且向上一层提供一些更简单易用的接口,这种思想这种设计方式也在咱们计算机网络的层次结构当中要使用这种思想。当用户发出一个I/O请求的时候,这个I/O请求会从上至下通过各个层次进行处理,最后被扔给I/O硬件来执行实际的I/O操做。那当I/O硬件作完此次I/O操做,发出I/O应答的时候,又会由这些层次从下往上依次进行处理,最后返回给用户。那接下来咱们按从上至下的顺序依次分析一下各个层次所须要实现的功能。

首先来看用户层须要实现什么功能。用户层做为最接近用户的一个层次,那它确定是须要向用户提供一些简单易用的交互的接口。那通常来讲,用户层软件会向用户提供一些与I/O操做相关的库函数,让用户调用这些库函数来对设备进行操做。好比说我们很熟悉的C语言里的Hello World,printf也就是在显示屏这个I/O设备上打印输出Hello World这样一句简单的代码,其实这个printf库函数就是由用户层软件提供的。那既然须要使用I/O设备进行输出操做,因此用户层软件确定须要请求操做系统提供服务。由于只有操做系统才有对硬件操做的权利。

 

所以用户层软件会使用设备独立性软件这一层向上提供的系统调用接口来请求操做系统内核的服务。

好比说printf("hello world!");这样一句代码,在用户层软件处理完了以后,会把它翻译成等价的write系统调用,固然在进行调用的时候它也会填入相应的参数,好比说要打印输出的内容——"hello,world!"这个字符串。因此其实设备独立性软件向上层提供了系统调用的接口。那设备独立性软件又是用来处理这个系统调用的一个层次,所以在有的题目当中它也会把这一层称为系统调用处理层,这一点你们稍微要注意一下。

可是因为系统调用过低级了,还须要把它进行进一步的封装才更方便用户使用。因此Windows操做系统又会在用户层进行进一步的封装,而后向用户提供一些库函数接口。Windows API就是用户层软件向用户提供的库函数接口。那这是用户层软件须要作的事情。

设备独立性软件要实现一些什么功能呢?

在不少操做系统当中,设备会被看做是一种特殊的文件。相应的,不一样的用户对设备这种特殊的文件的访问权限确定也是不同的。所以,操做系统须要提供设备保护的功能。

那这个地方你们能有个印象就能够了,不须要了解差错处理的细节。由于差错的类型实在是太多了,因此对差错的处理基本上不太可能进行考查。

由于不少设备它实际上是一种临界资源,不能够同时分配给多个进程使用,因此操做系统固然须要对设备这种资源进行分配与回收的管理。那这个我们在以后也还会细聊。

关于缓冲区管理应该怎么实现这个很容易在选择题当中进行考查,不过这儿先不展开细聊,我们在以后的小节中还会专门讲解。

所谓逻辑设备名就是用户在请求使用一个设备的时候,所提供的名字。也就是用户所看到的设备名。

那操做系统对这些设备进行管理,在背后还会有一个叫作物理设备名的东西。因此当咱们选择某一个逻辑设备的时候,操做系统固然须要知道这个逻辑设备具体对应的究竟是哪个物理设备。

那通常来讲这个映射关系,是经过一个叫作“逻辑设备表”的东西来实现的。英文缩写是LUT。而且在这个逻辑设备表中,还会记录每个逻辑设备对应的设备驱动程序的入口地址。

就像这个样子。这儿的逻辑设备名居然还带有一个相似于文件路径的东西。不少操做系统都会把设备看成是一种特殊的文件,因此这个文件固然也会有个存储的路径。

那每个表项记录了逻辑设备名到物理设备名的一个映射关系。而且还记录了这个设备它所对应的驱动程序的入口地址是在什么地方。

可是因为各个用户在使用设备的时候使用的都是逻辑设备名,而操做系统又是根据逻辑设备名来查找LUT的表项的。因此若是不一样的用户使用相同的逻辑设备名的话,那么就有可能会致使这个逻辑设备到物理设备映射紊乱的问题,因此其实整个系统只设置一张逻辑设备表这种方式只适合于单用户的操做系统。

那采用这种方式的话,不一样用户所使用的逻辑设备名能够是重复的,而且相同的逻辑设备名能够被映射到不一样的物理设备上去。那其实这两种方式有没有发现,它就有点相似于咱们在文件管理当中学到的单级目录和两级目录这样的区别呢?在文件系统中,若是采用的是单级目录结构的话,那么不一样用户的文件名是不容许相同的。可是在两级目录的结构下,不一样用户的文件名能够是相同的。那这里为每一个用户设置了一张逻辑设备表,其实在本质上就有点相似于设置了两级目录这样的结构。因此其实这两种方案,和咱们以前学过的知识点是有一些内在联系的。

不一样型号的这些设备,它们内部的那些电子部件,有多是彻底不同的。因此若是操做系统要经过这些设备的控制器来控制这些设备的运行的话,那么操做系统确定是须要了解这些设备内部的硬件细节的。不过这些I/O设备多种多样,因此操做系统不可能了解全部的这些设备的内部细节。所以这些设备在出厂的时候,通常来讲厂家会提供一个与设备对应的所谓的驱动程序。而后当要控制某一个设备的时候,CPU其实只须要执行这个设备相对应的驱动程序就能够完成对这个设备控制器的控制了。好比说想设置控制器里面的寄存器,或者检查每一个设备的状态寄存器这些工做就是能够经过执行驱动程序来完成。

那这个自动安装的驱动程序其实就是由厂家提供的,为了让操做系统实现对这个新的设备硬件进行具体控制的一个程序。因此其实设备独立性软件不能够直接操纵硬件,它必须调用厂家提供的设备驱动程序,由这个设备驱动程序来完成对硬件的具体控制。好比说设置设备里的各类寄存器等等这些操做。

那像各个类型的设备驱动程序通常来讲在系统中会以一个独立进程的方式运行存在。因此咱们再回到刚才的这个逻辑设备表,为何不一样的设备须要对应不一样的驱动程序呢?就是由于各类设备内部的硬件特性是不同的,所以必须执行与它对应的特定的驱动程序才能够正常地完成对这个设备硬件的控制。那这是设备驱动程序这一层须要完成的一个事情。

当咱们的硬件设备完成了I/O操做以后,它会发出一个中断信号做为I/O应答。那系统会根据这个中断信号的类型来找到与这个中断信号对应的中断处理程序,而后执行这个程序进行中断处理。那中断处理程序对中断的处理流程是这样子的:首先中断处理程序会从I/O控制器或者说设备控制器当中读出设备的状态,来判断此次的I/O是否是正常地结束。若是这次是正常地结束,那接下来中断处理程序会从设备控制器的数据寄存器当中读出一个字的数据,而且经由CPU而后放到内存缓存区当中,这就完成了一个字的读入。而若是这次I/O是非正常结束的,也就是中间发生了什么意外,好比说像硬件故障啊之类的。那系统会根据异常的缘由作出相应的处理。因此这就是中断处理程序所须要作的一件事情。那当中断处理程序把这一次要输入的数据放入到内存以后,接下来又会交由设备驱动程序对这些数据进行进一步的处理。等设备驱动程序处理完了它又会交由再上一层的设备独立性软件进行再进一步的处理,最后一层一层往上,而后一直返回给用户。因此若是要输入一个数据的话,那么对于这个数据的处理应该是从下往上依次层层处理的。

除了设备驱动程序会直接和硬件打交道以外,其实中断处理程序它也须要直接和硬件打交道。可是再往上的设备独立性软件和用户层软件,就不会直接和硬件打交道了。

咱们对I/O软件的层次结构进行了从上至下的分析,那要完成一个I/O操做,除了软件的支持以外,确定也离不开硬件。硬件才是执行具体的I/O操做的部件。它由机械部件和电子部件组成,那这是我们以前的小节谈到的内容。那若是一个用户发出I/O请求的话,这个I/O请求会由上至下依次由这些各个层次进行处理,最后扔给这个I/O硬件实行具体的I/O操做。而若是硬件完成了I/O操做的话,它又会发出一个中断信号,接下来会由这些软件层次由下至上地层层处理,而后最后返回给用户。那这个小节的内容最常考的实际上是各个层次之间的顺序,好比说它常常会问一个I/O请求的处理次序究竟是怎么样的。或者一发生I/O应答的时候,每一层软件的处理顺序依次是怎么样的。因此你们须要理解而且记住这些各个层次的从上至下的这种顺序。另外呢,也有可能考查各个层次要完成一些什么功能。那你们须要抓住一个最重要的特色,设备驱动程序和中断处理程序是直接和硬件打交道的。因此若是直接涉及到硬件细节相关的一些操做的话,那么确定是由下面这两层完成的。那除此以外的功能基本都是在设备独立性软件来完成的。

那除了这儿提到的内容以外,你们也须要对逻辑设备表LUT它的功能有一个大致的印象。

相关文章
相关标签/搜索