操作系统课程设计磁盘调度算法.docx
《操作系统课程设计磁盘调度算法.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计磁盘调度算法.docx(11页珍藏版)》请在冰豆网上搜索。
![操作系统课程设计磁盘调度算法.docx](https://file1.bdocx.com/fileroot1/2022-11/15/3145d57d-0f3b-407e-872a-534e3b10dd21/3145d57d-0f3b-407e-872a-534e3b10dd211.gif)
操作系统课程设计磁盘调度算法
1. 实验题目:
磁盘调度算法。
建立相应的数据结构;
在屏幕上显示磁盘请求的服务状况;
将一批磁盘请求的情况存磁盘文件,以后可以读出并重放;
计算磁头移动的总距离及平均移动距离;
支持算法:
FIFO、SSTF、SCAN、CSCAN;
2.设计目的:
调度磁盘I/O请求服务,采用好的方式能提高访问时间和带宽。
本实验通过编程对磁盘调度算法的实现,加深对算法的理解,同时通过用C++语言编写程序实现这些算法,并在windos平台上实现,更好的掌握操作系统的原理以及实现方法,提高综合运用专业课知识的能力。
3.任务及要求
3.1设计任务
编程实现下述磁盘调度算法,并求出每种算法的平均寻道长度:
1、 先来先服务算法(FCFS)
2、 最短寻道时间算法(SSTF)
3、 扫描算法(SCAN)
4、 循环扫描算法(CSCAN)
3.2设计要求
对用户指定的磁盘调度请求序列,基于以上四种算法,实现各自的调度顺序并输出,同时计算出各种算法下的平均寻道长度。
4.算法及数据结构
4.1算法的总体思想
queue[n]为请求调度序列,diskrode为磁盘磁道数,headstarts为正在调度的磁道
①先来先服务算法(FCFS)
按queue[n]数组的顺序进行磁盘调度,将前一个调度磁道与下一个调度磁道的差值累加起来,得到总的寻道长度,再除以n得到平均寻道长度。
②最短寻道时间优先算法(SSTF)
将queue[n]进行由小到大的排序,首先定位当前调度磁headstarts在queue[n]的位置,通过循环语句找出离起始磁头最短的位置。
③扫描算法(SCAN)
将queue[n]进行由小到大的排序,首先定位当前调度磁headstarts在queue[n]的位置,然后在此位置按给定的方向遍历queue[n],当道端点(queue[0]或queue[n-1])时,再在定位处反向遍历到另一端。
当调度磁道不在queue端点时,总的寻道长度为为前一个磁道与后一个磁
道差值的累加,当到达端点且queue[n]未全调度时,总寻道长度加上端点值再加上下一个调度磁道的值,再按前面的算法进行,直到磁道全部都调度完毕,得到总的寻道长度,除以n得到平均寻道长度。
④循环扫描算法(CSCAN)
将queue[n]进行由小到大的排序,首先定位当前调度磁headstarts在queue[n]的位置,然后在此位置按给定的方向遍历queue[n],当道端点(queue[0]或queue[n-1])时,反向到另一端点再以此方向进行遍历,直到queue[n]中所有都调度完。
当调度磁道不在queue端点时,总的寻道长度为为前一个磁道与后一个磁道差值的累加,当到达端点且queue[n]未全调度时,总寻道长度加上端点值再加上磁盘磁道总长度,再加上下一个调度磁道的值,再按前面的算法进行,直到磁道全部都调度完毕,得到总的寻道长度,除以n得到平均寻道长度。
5、源代码:
#include
#include
#include
voidmenu()
{
cout<<"*********************菜单*********************"< cout<<"******1、先来先服务算法(FCFS) **********"< cout<<"******2、最短寻道时间优先算法(SSTF)**********"< cout<<"******3、扫描算法(SCAN) **********"< cout<<"******4、循环扫描算法(CSCAN) **********"< cout<<"******5、退出 **********"< cout<<"**********************************************"<}
/*======================初始化序列=======================*/
voidinit(intqueue[],intqueue_copy[],intn)
{
inti;
for(i=0;i queue[i]=queue_copy[i];
}
//对当前正在执行的磁道号进行定位,返回磁道号小于当前磁道中最大的一个
intfix(intqueue[],intn,intheadstarts)
{
inti=0;
while(iqueue[i])
{
i++;
}
if(i>n-1)
returnn-1; //当前磁道号大于磁盘请求序列中的所有磁道
if(i==0)
return-1; //当前磁道号小于磁盘请求序列中的所有磁道
else
returni-1; //返回小于当前磁道号中最大的一个
}
/*=================使用冒泡算法从小到大排序==============*/
int*bubble(intqueue[],intm)
{
inti,j;
inttemp;
for(i=0;i for(j=i+1;j {
if(queue[i]>queue[j])
{
temp=queue[i];
queue[i]=queue[j];
queue[j]=temp;
}
}
cout<<"排序后的磁盘序列为:
";
for(i=0;i {
cout< }
cout< returnqueue;
}
/*====================以下是FCFS算法==================*/
voidFCFS(intqueue[],intn,intdiskrode,intheadstarts) //queue是请求调度序列,n为其个数,diskroad为磁盘磁道数,headstarts为正在调度的磁道
{
cout<<"************以下为FCFS调度算法***********"< inti;
intcount=0;
if(headstarts>queue[0])
count+=headstarts-queue[0];
else
count+=queue[0]-headstarts;
cout<<"调度序列为:
";
cout< for(i=0;i {
cout< if(queue[i]>queue[i+1])
count+=queue[i]-queue[i+1];
else
count+=queue[i+1]-queue[i];
}
cout< cout< cout<<"总的寻道长度为:
"< cout<<"平均寻道长度为:
"<}
/*=====================SSTF算法====================*/
voidSSTF(intqueue[],intn,intdiskrode,intheadstarts)
{
intk=1;
intl,r;
inti,j,count=0;
queue=bubble(queue,n);
cout<<"************以下为SSTF调度算法***********"< if(queue[n-1]<=headstarts) //若当前磁道号大于请求序列中最大者,则直接由外向内依次给予各请求服务
{
cout<<"磁盘扫描序列为:
";
cout< for(i=n-1;i>=0;i--)
cout< count=headstarts-queue[0];
}
if(queue[0]>=headstarts) //若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务
{
cout<<"磁盘扫描序列为:
";
cout< for(i=0;i cout< count=queue[n-1]-headstarts;
}
if(headstarts>queue[0]&&headstarts {
cout<<"磁盘扫描序列为:
";
cout< while(queue[k] {
k++;
}
l=k-1;
r=k;
while((l>=0)&&(r {
if( (headstarts-queue[l])<(queue
-headstarts))
{
cout< count+=headstarts-queue[l];
headstarts=queue[l];
l=l-1;
}
else
if((headstarts-queue[l])==(queue-headstarts))
{
cout< count+=headstarts-queue[l];
headstarts=queue[l];
l=l-1;
}
else
{
cout< count+=queue-headstarts;
headstarts=queue;
r=r+1;
}
}
if(l==-1) //磁头移动到序列的最小号,返