OS-李治军-L28-生磁盘的使用
生磁盘的使用
磁盘具有更复杂的结构,在操作系统内有着更为复杂的抽象层次,这里的生(raw)是让disk跑起来的意思。
可以将磁盘的结构理解为多个原片叠起来的柱面,我们用以下的参数取描述一个磁盘:
- 柱面(cyl),实际上就是圆柱的半径,
- 磁头(head),实际上就是圆柱的高度,
- 扇区(sec),是磁盘读写的基本单元,512Byte,实际上就是圆柱对应的角度,
- 缓存,一个扇区内的存储单元,
理论上,我们要操控一个磁盘,就要对其控制器发出指令,控制磁头的电机,使磁头移动到相应的轨道上去(找到一个柱面),然后开始旋转,完成电磁转换的过程,以实现数据的读写。为了方便用户使用磁盘,OS先做了第一层抽象:将磁盘抽象为多个磁盘块,用户只需要对这些连续的磁盘块进行操作,不需要进一步去 管理磁盘控制器的各个参数。
磁盘的访问时间是:写入控制器时间+寻道时间+磁头旋转读取时间+传输时间。其中,寻道涉及电机的直线运动,所费时间较高,在设计上我们要尽可能让相邻的盘块具有相投的轨道,也就是半径长度一致,避免在连续读写的时候频繁移动磁头的位置。
扇区号=C * (Head * Sectors) + H * Sectors +S
从扇区号到盘块号:
因为寻道时间和旋转时间占了大头(尤其是寻道时间),而数据传输时间占比小,每次读1M和读1k所话的时间是比较接近的。所以引入了盘块号,是多个扇区组成,将原先要多次的读写合并为一次读写,这样可以提升读写速度。但是,这样容易造成碎片,因为一个盘块内容较大时,用不完ei,这是一种以空间换时间的做法。
第二层抽象:
计算机是多进程图像,有多个进程在使用磁盘,需要增加一个请求队列,做出一些调度。
每做完一件事,磁盘发出中断,驱动从队列中取出一个新的blokc号,然后进行参数换算。
如何合理调度?肯定是所花时间衡量,而寻道时间是这里的主要矛盾!
-
FCFS磁盘调度算法,就是正常的先进先出。但是有一个问题,就是磁头在长途奔袭。
-
SSTF磁盘调度,就是一种贪婪算法,每次移动最短距离,问题是磁头有可能总是会在中间一段晃动,远的请求得不到解决,就产生了饥饿问题。
-
SCAN磁盘调度(电梯算法)
就是先找一个移动方向,一走到底,然后再回头走另一边,这样就变成了线性时间。(其实也就是像线性扫描)
进一步改进,中间的人还是有可能占优,如果起点在中间的话。考虑不让占便宜的办法:走到头后,瞬间复位(很快),再往回走。
像电梯一样,在中间楼层启动,会先走到底,然后上面还有一些下楼的请求,就会先一走到顶,把所有人都带上,再往下走到底,而不是带一些人走一段。
其实时间花的好像差不多,只是后者不会更在照顾中间的人而而已。