.. . .
实验四 磁盘调度
一、实验目的:
本实验要求学生模拟设计一个磁盘调度程序,观察调度程序的动态运行过程。通过实验让学生理解和掌握磁盘调度的职能。
二、实验容:
对磁盘进行移臂操作,模拟磁盘调度算法并计算平均寻道时间
三、实验准备:
1.相关理论知识:
(1)假设磁盘只有一个盘面,并且磁盘是可移动头磁盘。
(3)磁盘是高速、大容量、旋转型、可直接存取的存储设备。它作为计算机系统的辅助存储器,担负着繁重的输入输出工作,在现代计算机系统中往往同时会有若干个要求访问磁盘的输入输出要求。系统可采用一种策略,尽可能按最佳次序执行访问磁盘的请求。由于磁盘访问时间主要受寻道时间T的影响,为此需要采用合适的寻道算法,以降低寻道时间。
(2)磁盘是可供多个进程共享的存储设备,但一个磁盘每个时刻只能为一个进程服务。当有进程在访问某个磁盘时,其它想访问该磁盘的进程必须等待,直到磁盘一次工作结束。当有多个进程提出输入输出请求而处于等待状态时,可用磁盘调度算法从若干个等待访问者中选择一个进程,让它访问磁盘。
2.测试数据:
磁盘读写请求队列:20,44,40,4,80,12,76 当前磁头位置:50
. 学习.资料.
.. . .
试问采用FCFS、SSTF、SCAN磁盘调度算法时寻道顺序及平均寻道时间分别为多少?
四、实验过程:
1.流程图
SCAN算法(扫描算法)流程图:
开始 输入磁道号 使用冒泡法从小到大排序 输出排好序的磁道序列 输入当前磁道号 判断当前磁头在序列中的位置 选择移动臂移动方向,开始扫描 移动到最小(大)号,改向外(内)移动扫描未扫描的磁道 求平均寻道长度 输出移动的平均磁道数 结束
. 学习.资料.
.. . .
2. 源代码
#include #include #include #include #define maxsize 1000
/*********************判断输入数据是否有效**************************/ int decide(char str[]) //判断输入数据是否有效 {
int i=0; while(str[i]!='\\0') { if(str[i]<'0'||str[i]>'9') { return 0; break; } i++; } return i; }
/******************将字符串转换成数字***********************/ int trans(char str[],int a) //将字符串转换成数字 { int i; int sum=0; for(i=0;i/*********************冒泡排序算法**************************/ int *bubble(int cidao[],int m) {
int i,j; int temp;
for(i=0;i if(cidao[i]>cidao[j]) {
. 学习.资料.
.. . .
temp=cidao[i]; cidao[i]=cidao[j]; cidao[j]=temp; } }
cout<<\排序后的磁盘序列为:\ for( i=0;i {
cout</*********************先来先服务调度算法************************/ void FCFS(int cidao[],int m) //磁道号数组,个数为m {
int now;//当前磁道号
int sum=0; //总寻道长度
int j,i; int a; char str[100];
float ave; //平均寻道长度 cout<<\磁盘请求序列为:\
for( i=0;i cout< cout<<\请输入当前的磁道号:\
B: cin>>str; //对输入数据进行有效性判断
a=decide(str); if(a==0) { cout<<\输入数据的类型错误,请重新输入!\ goto B; } else now=trans(str,a); //输入当前磁道号 sum+=abs(cidao[0]-now); cout<<\磁盘扫描序列为:\
for( i=0;i cout< . 学习.资料.
.. . .
for(i=0,j=1;j sum+=abs(cidao[j]-cidao[i]); ave=(float)(sum)/(float)(m); }
cout< cout<<\平均寻道长度:\
}
/**********************最短寻道时间优先调度算法********************/ void SSTF(int cidao[],int m) {
int k=1; int now,l,r; int i,j,sum=0; int a;
char str[100]; float ave;
cidao=bubble(cidao,m); //调用冒泡排序算法排序 cout<<\请输入当前的磁道号:\
C: cin>>str; //对输入数据进行有效性判断
a=decide(str); if(a==0) { cout<<\输入数据的类型错误,请重新输入!\
goto C; } else now=trans(str,a); //输入当前磁道号
if(cidao[m-1]<=now) //若当前磁道号大于请求序列中最大者,则直接由外向依次给予各请求服务
{ cout<<\磁盘扫描序列为:\
for(i=m-1;i>=0;i--) cout< if(cidao[0]>=now) //若当前磁道号小于请求序列中最小者,则直接由向外依次给予各请求服务
{ cout<<\磁盘扫描序列为:\ for(i=0;i . 学习.资料.