423_减少磁盘延迟时间的方法
# 4.2_3_减少磁盘延迟时间的方法
在小节中我们会学习减少磁盘延迟时间的方法。
之前的学习中我们意识到了,一次读磁盘或者写磁盘的操作需要寻找时间、传输时间和延迟时间这样三个部分组成,其中延迟时间指的是把目标扇区转到磁头下面所花的时间,比如说我们此时要读取橙色的这些区域的话,那么我们首先需要有一段延迟时间是用来转磁盘的,让橙色区域放到此这个磁头的下面
另外假设此时我们要读取的是 234 这样的三个扇区,那么首先我们的磁头会读取二号扇区,但是大家需要注意的是在实际的磁盘应用当中,读完了一个扇区之后,需要有一定的时间来进行处理,也就是说磁头并不能在读完二号扇区之后,就连续不断的就接着读三号扇区,但是现在磁盘又是在不停的旋转的,也就是说接下来三号扇区在划过磁头下面的过程中,其实这个磁头是还在进行处理,还暂时不能读入三号扇区的数据,因此在这个阶段三号扇区就已经错过了磁头下方的位置。因此如果我们想要读取三号扇区的话,只能有一种方法就是让磁盘继续旋转,等三号扇区再一次到达磁头下面,并且从磁头下面划过的时候才可以把三号扇区的数据给读取进来。
所以由于磁头在读取完一个扇区的数据之后,它还需要有一小段时间进行处理。因此如果我们把逻辑上相邻的这些扇区让它物理上也相邻的话,那么连续读入逻辑上相邻的几个扇区号对应的扇区,我们就需要转动好几圈磁盘,也就是说延迟时间会特别长,那么我们怎么解决这个问题?
# 交替编号
我们可以采用交替编号的方式,也就是让逻辑上相邻的扇区在物理上有一定的间隔,比如说这些扇区,我们把它编号为 0 号扇区,而在间隔了一个扇区之后,扇区我们才把它编号编为一号扇区,然后以此类推,我们用这种交替编号的策略能带来什么好处呢?
现在磁头是指向了 0 号扇区的位置,假设接下来我们要读入的是 2 号、3 号和 4 号扇区,由于我们首先要读入的是二号扇区,所以我们首先需要转动磁盘,让二号扇区放到磁头的下面
接下来在磁盘继续转动的过程中,就可以把二号扇区的数据给读入了。在读完了二号扇区之后,这个磁头需要有一小段时间做中间的准备,在这段时间内磁头是不能读入任何数据的,但是由于我们采用了这种交替编号的策略,所以在三号扇区划过磁头之前,这个磁头就做好了下一次读取数据的准备,因此这个磁盘继续旋转,三号扇区从磁头下面划过,那磁头也可以顺利的把三号扇区里的数据给读进来
所以可以看到采用了交替编号的这种策略,其实可以大幅度的减小延迟时间。假设三号扇区和二号扇区在物理上是相邻的,那么经过上一页 PPT 的分析,我们知道当我们读完二号扇区,想紧接着读三号扇区的数据的时候,由于磁头暂时还没有准备好,所以磁盘需要多转动一圈才可以继续读三号扇区,而采用交替编号的这种方式的话,那么磁盘转动一圈的时间就省下了,也就说减少了延迟时间,因此交替编号这种方式是可行的有效的。
# 磁盘地址结构的设计
接下来我们来探讨一个磁盘地址结构的问题,通过之前的学习,我们知道磁盘的物理地址是分为了柱面号、盘面号和扇区号,为什么不是盘面号、柱面号、扇区号这样的顺序呢?也就是说为什么柱面号一定要在前,盘面号一定要在后,我们来分析一下这个问题。
我们以这个图当中表示的磁盘为例,假设这个磁盘总共有 8 个柱面,也就是有 8 个磁道,大家可以数一下,最内侧的柱面或者说磁道它的编号是 0。另外假设磁盘总共有 4 个盘面,当然这个地方我只画出了 0 号盘面,也就是第一个盘面,并且每一个磁道会被分成 8 个扇区,这样的话其实我们可以用 3 个 2 二进制位来表示柱面,3 个二进制位可以表示的数字刚好是 0~7,也就是可以表示 8 个数字,可以一一的标识这些磁道。同样的可以用 2 个二进制位表示盘面,因为盘面的数量只有 4 个,可以用 3 个 2 进制位来表示扇区。
假设我们采用的物理地质结构是盘面号、柱面号和扇区号这样的一个顺序的话,假设此时需要连续的读取物理地址为这个区域的(00000,000 )~ (00001,111)这些扇区的话,那么会发生什么情况呢?
首先从(0,0),到(00000,111),这些扇区其实是 0 号盘面,0 号柱面的这 8 个扇区。根据之前的分析,我们知道在转了一圈之后,磁头可以依次读入0,1,2,3 这几个扇区的数据。在转第二圈之后,磁头又可以依次读入 4,5,6,7 这几个编号对应的扇区里的数据,也就是说物理地址范围内的这些扇区只需要转两圈就可以读完了。
接下来由于我们是要连续读取这个范围内的所有的扇区的,所以接下来应该要读的应该是盘面号为 0,柱面号为 1,而扇区号为 0 的扇区,也就是外面磁道的 0 号扇区。所以为了读取这个扇区,我们必须启动磁头臂,并且让磁头往外移动一个磁道,也就是这个样子。
通过之前小节的学习,我们知道启动磁头臂还有移动磁头其实是一种物理上的移动,它所需要花费的时间是比较高的,这是盘面号在柱面号之前的这种情况。
我们来看一下书里推荐的这种物理地址结构,也就是柱面号放在盘面号之前会会发生什么情况?假设此时我们需要连续读取的依然是(00000,000 )~ (00001,111)这个范围的物理地址对应的那些扇区,同样的首先我们要读取的是柱面号为 0,盘面号也为 0,也就是(00000,000) ~ (000,00, 111)这些扇区,也就是 0 号盘面最里边这个磁道的所有的这些扇区,当这个盘面转了两圈之后,我们就可以把所有的这些扇区给读完了。我们在读取这个范围内的这些扇区的时候,需要激活最上面的磁头,也就是 0 号盘面对应的磁头。
接下来我们还需要连续的读取后面的这些,也就是(00001,000)~ (00001,111)这些部分。由于我们采用的是柱面号在前,盘面号在后的物理地址结构,从这个地址范围当中,我们也可以看到这些扇区其实对应的是一号盘面的最内侧的磁道的所有的这些扇区,因此我们接下来想要读取这个范围内的这些扇区的话,我们只需要激活一号盘面对应的磁头就可以了,并不需要像之前所介绍的那样在启动磁头臂,然后来回的移动磁头。(也就是只换了一个面,不用移动磁头)
所以讲到这个地方大家应该就可以明白了,为什么柱面号要在盘面号之前,如果采用柱面号在盘面号之前这种策略的话,那么我们在读取一些地址连续的磁盘块的时候,就可以减少磁头移动所消耗的时间,这个知识点是不太容易理解,并且很可能会忽略的一个点,在选择题当中可能会作为陷阱进行考察。
# 错位命名
那么理解了这个问题之后我,我们接下来再来介绍第二种减少延迟时间的方法叫做错位命名。我们先来分析一下,不采用错位命名方式,在读取这种编号连续的这些扇区的时候会发生什么情况?
假设我们的 0 号盘面和 1 号盘面在它们相对位置相同的这些扇区,编号都是相同的,也就是 0 号盘面的 0 号扇区的下面,正下方对应的刚好是 1 号盘面的 0 号扇区,然后 0 号旁边的 4 号扇区下面对应的也是 1 号盘面的 4 号扇区,这些扇区号都是一一对应的。
那两个盘面对应的磁头其实也是指向一个相对位置相同的地方,1 号盘面的磁头刚好是在 0 号盘面磁头的正下方,假设现在 0 号旁边的橙色区域对应的扇区,它的编号物理地址是 7,也就是二进制表表示的话就是 111,由于磁盘的地址结构是柱面号、盘面号、扇区号这样的结构,所以与扇区序号相邻的下一个扇区的编号应该是 (000,01,000),也就是转换成 10 进制的话就是 8 号扇区,这个扇区应该是在 1 号旁边的,0 号扇区这个位置,也就是这个图当中的橙色区域,这个地方需要注意,所有的这些盘面都是一起连轴转的,都是同步旋转的。
假设此书我们要读取的是物理地址为 0 的扇区,一直到物理地址为八的扇区,也就是一直读到扇区,这个读取的过程应该是这样的。首先要读取的是 0 号盘面的最内侧磁道所有的这些扇区,所以首先需要把 0 号盘面的磁头激活,然后让磁盘开始旋转并并且旋转的过程中进行读写。通过之前的分析,我们知道它需要转两圈才可以把最内侧的磁道给读完。转了两圈之后,此时磁头指向的是这个位置,那相应的一号盘面和 0 号盘面也是同步旋转的,所以一号盘面应该也是指向了他自己的0 号扇区所对应的这个位置。
但是之前咱们说过在读取完一个扇区之后,需要有一小段时间进行处理,并不能立即读取下一个扇区,但是我们的磁盘又是在不停旋转的。所以其实读完了 0 号盘面的最后扇区之后,磁盘继续旋转,在这个旋转的过程当中,由于磁头还没有准备好读写数据,因此 1 号盘面的 0 号扇区也就是物理地址为 8 的扇区,从磁头下面划过的过程当中,并不能直接把这块的数据给读入,如果要读入这块的数据,只能等到磁盘再转一圈,让扇区再次滑过此后下方
也就是说如果我们把这些盘面它们相对位置相同的这些扇区都设置为相同的编号,那么可能会增加延迟时间(也就是第一个面读完后,下一个盘面的位置就是下一个要读取的,但是由于磁头还没准备好,不能读取,所以有延迟)
所以为了解决这个问题,可以用错位命名的方式来进行。再看这个图的时候,大家需要自己想象一下,0 号盘面是在 1 号旁边的正上方,
也就是说 0 号盘面的 0 号扇区,它的正下方对应的应该是 1 号盘面的 7 号扇区
而 0 号盘面的 4 号扇区,它的正下方对应的应该是1 号盘面的 0 号扇区,也就是说这些扇区的编号他们是错开的,所以这也是为什么叫错位命名的原因。
我们还是用刚才的例子继续分析,假设此时要读取 0 号盘面最内侧磁道的所有的扇区的话,那么需要让激活 0 号盘面的磁头,并且让盘面旋转,然后旋转两圈之后就可以读完所有的这些内测磁道的扇区了,最后读取的应该是橙色这个区域,
读取完这个区域的数据之后,磁头它需要有一定的时间进行准备,在准备的过程中是不能读入任何数据的,不过当我们接下来需要读取的橙色区域到磁头下面的时候,磁头就可以准备好,继续读写了。因此接下来继续旋转的话,那么 0 号扇区第一次滑过磁头下方的时候,就可以把这个数据给读取了。相比于之前的那种方案,这种方案很显然可以减少延迟时间,这个点其实是看书的时候不太容易理解的一个点。
# 小结
那么这个小节我们主要介绍了两种减少延迟时间的方法,第一种方法叫做交替编号,第二种方法叫做错位命名。
无论是哪种方法所参考的原理,其实都是我们的磁头在读取完了一个扇区之后,需要有一段时间的准备才可以继续读入下一个扇区,结合之前的动图,相信这些并不难理解。
除此之外,我们在中间介绍了磁盘的地址结构的设计,我们需要理解为什么柱面号一定要在盘面号之前,其实本质原因就是为了减少移动字头的次数,理解了小节的内容之后,可以对磁盘工作的一个原理有更深刻更形象的理解。