0%

磁盘调度

磁盘调度

磁盘调度中寻道时间直接影响到数据访问的快慢,处理好磁盘寻道时间是关键

实验原理

先来先服务(FCFS)

基本思想:按照输入输出请求到达的顺序,逐一完成访问请求,它只考虑请求访问者的先后次序,而不考虑它们要访问的物理位置

最短寻道时间优先(SSTF)

基本思想:先对最靠近当前柱面位置的请求进行服务,即先对寻找时间最短的请求进行服务。SSTF算法总是让寻找时间最短的那个请求先服务,而不管请求访问者到来的先后次序。

实验内容

算法实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <stdio.h>
#include<iostream>
using namespace std;
int Getmin(int a[],int i,int temp) {
int min = 65535,mini=0,j=0;
while (i>0) {
if (abs(a[j]-temp) <= abs(min-temp)) { min = a[j]; mini = j; }
j++;
i--;
}
a[mini] = 65536;
return min;
}
void FCFS(int a[]) {
cout << "被访问的下一个磁盘号" << "\t\t" << "移动距离" << endl;
int i = 0,temp=100,count=0,dis=0;
while (a[i] != 0) {
dis= abs(temp - a[i]);
temp = a[i];
cout << a[i] << "\t\t\t\t" << dis << endl;
count += dis;
i++;
}
cout << "平均寻道长度" << count * 1.0 / i << endl;
}
void SSTF(int a[],int j) {
cout << "被访问的下一个磁盘号" <<"\t\t" << "移动距离" << endl;
int i = j, temp = 100, count = 0, dis = 0;
while (j> 0) {
int ele = Getmin(a, i,temp);
dis = abs(temp - ele);
temp = ele;
cout << ele << "\t\t\t\t" << dis << endl;
count += dis;
j--;
}
cout << "平均寻道长度" << count * 1.0 / i << endl;
}
int main()
{
int a[30] = {0 },i=0,j=0;
while (j==0||cin.get() != '\n') {
cin >> a[j];
j++;
}
//FCFS(a);
SSTF(a,j);
}

内容演示

FCFS

SSTF

alt text

实验总结

先来先服务算法(FCFS)First Come First Service

这是一种比较简单的磁盘调度算法。它根据进程请求访问磁盘的先后次序进行调度。此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。

最短寻道时间优先算法(SSTF) Shortest Seek Time First

该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短。其缺点是对用户的服务请求的响应机会不是均等的,因而导致响应时间的变化幅度很大。在服务请求很多的情况下,对内外边缘磁道的请求将会无限期的被延迟,有些请求的响应时间将不可预期。