一次磁盘读写需要的时间,寻道时间,延迟时间,传输时间.
一:寻道时间Ts:在读写数据之前,将磁头移动到指定磁道所需要的时间。
分为两步:
①启动磁头臂,花费时间s;
②移动磁头也花费时间。假设磁头匀速移动,没跨越一个磁道花费m,总共需要跨越n条磁道,则花费时间为m*n;
所以寻道时间Ts = s + m * n;
二:延迟时间Tr:通过旋转磁盘,使磁头定位到目标扇区所需要的时间。设磁盘转速为r(转/秒),那么1/r就是(秒/转)。即r为一秒多少转,1/r为一转多少秒.
所以平均所需的延迟时间为Tr = (1/2) * (1/r) = 1 / (2r);
三:传输时间Tt:从磁盘读取或者写入数据所经历的时间,磁盘转速为r,此次读写字节数为b,每个磁道上字节数为N.
所以传输时间Tt = (b / N) * (1 / r) = b / (Nr),即b个字节数据需要b/N的磁道,在乘以一转多少秒。
所以平均存取时间Ta = Ts + 1/2r + b / (Nr)
可以观察到,延迟时间和传输时间都和转速相关,且为线性相关,因为操作系统无法优化延迟时间和传输时间。
但是操作系统可以优化寻道时间,不同的磁盘调度算法会有不同的寻道时间。
磁盘调度算法
先来先服务
按照进程请求访问磁盘的先后顺序进行调度。
这个就很好理解了,根据进程先后请求磁道的顺序来访问磁道,如果比较集中的话,那么寻道就在集中那些磁道,性能还好,但是如果请求的磁道1,500,2,501,3,502这样顺序的话,它的性能就很差,寻到时间也比较长。
最短寻找时间优化
优先处理与磁头最近的磁道。
可以看出他的性能相比于先来先服务算法的话性能还是比较好的,但是它的缺点就是如果有源源不断的磁头旁边的磁道到来的话,可能会一直左右徘徊,那么请求的边缘磁道有可能一直访问不到,则会导致进程饥饿。
扫描算法
在最短时间优先算法的基础上,不让他来回的进行徘徊在一个区间,而是只要到最边上的磁道的时候,才能向内移动,反之也是。电梯算法很形象。这个磁头很“犟”,属于不撞南墙不回头的人。
可以看出来地电梯算法的性能也还不错,也不会导致饥饿,但是它的缺点就是只有到达最边上的磁道才能改变磁头的方向,犟的像头驴,如果请求的磁道分别是 4,5,6,7,8,开始磁头在6磁道这个位置,并且磁道此时正在往大方向磁道移动,那么当到达8的时候,他就要为4到达4号磁道,但是他还要到达边缘磁道,才能向内移动,所以在应对访问的磁道都是中间磁道的话,那么这个算法效率就不是很高了。
所以应该优化
①他到达访问磁道的最右边磁道就不要继续向右移动了
②对各个位置磁道的响应频率不均,对于距离边缘磁道近的磁道,磁道可以很快的得到响应,如果是远的磁道要是想再次得到响应的话,要等一段时间。
Look调度算法
不需要在到达边缘磁道才能改变磁头方向了,如果在磁头移动方向上已经没有别的磁道请求了,就可以立即改变磁头方向。
look算法就解决了电梯算法的第一个问题,使寻道时间进一步缩短了。
但是他还有第二个问题,就是对各个磁道的响应频率不均匀。
循环扫描算法
原来的扫描算法时,到了边缘磁道后,从边缘磁道掉头,一个个处理磁道请求,但是这样就会造成响应磁道的频率很不均,所以这次我们让磁头到达边缘磁道后,直接移动到最里测磁道。
这样刚刚响应完的接近边缘磁道的磁道不会很快得到响应,距离边缘磁道远的也不会很慢的得到响应。
解决了磁道响应不均的问题,但是平均寻道时间更长了,因为每次到达边缘磁道都会从边缘磁道到达最内侧测到。
C-LOOK
刚刚我们的循环扫描算法的缺点是,每次都要到达最边缘磁道,而且返回的时候还要直接到达最内侧磁道,起始大可不必,如果磁头移动的方向已经没有磁道访问请求了,就立即让他返回,返回的时候也不需要返回道最内侧磁道,只需要返回到最小的磁道访问请求位置即可。
这样我们就解决了平均寻道时间长的问题。这个C-LOOK是在扫描算法的基础上综合了循环扫描算法(C-SCAN)和LOOK算法的优点而形成的,看名字也知道啦!
不战斗就无法生存,肝!