操作系统课程设计磁盘调度算法_磁盘调度算法课程设计

2020-02-28 其他范文 下载本文

操作系统课程设计磁盘调度算法由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“磁盘调度算法课程设计”。

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 void menu(){ cout

1、先来先服务算法(FCFS)**********“

cout

2、最短寻道时间优先算法(SSTF)**********”

cout

3、扫描算法(SCAN)**********“

cout

4、循环扫描算法(CSCAN)**********”

cout

5、退出 **********"

/*======================初始化序列=======================*/ void init(int queue[],int queue_copy[],int n){ int i;for(i=0;i

//对当前正在执行的磁道号进行定位,返回磁道号小于当前磁道中最大的一个 int fix(int queue[], int n, int headstarts){ int i =0;while(iqueue[i]){ i++;} if(i>n-1)return n-1;//当前磁道号大于磁盘请求序列中的所有磁道 if(i==0)return-1;//当前磁道号小于磁盘请求序列中的所有磁道 else return i-1;//返回小于当前磁道号中最大的一个 } /*=================使用冒泡算法从小到大排序==============*/ int *bubble(int queue[],int m){ int i,j;int temp;for(i=0;i queue[j]){ temp=queue[i];queue[i]=queue[j];queue[j]=temp;} } cout

/* ====================以下是FCFS算法==================*/ void FCFS(int queue[],int n,int diskrode,int headstarts)//queue是请求调度序列,n为其个数,diskroad为磁盘磁道数,headstarts为正在调度的磁道 { coutqueue[0])count +=headstarts-queue[0];else count+=queue[0]-headstarts;coutqueue[i+1])count +=queue[i]-queue[i+1];else count +=queue[i+1]-queue[i];} cout

/*=====================SSTF算法====================*/ void SSTF(int queue[], int n, int diskrode, int headstarts){ int k=1;int l,r;int i,j,count=0;queue =bubble(queue,n);cout=0;i--)cout=headstarts)//若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务 { coutqueue[0] && headstarts =0)&&(r

-headstarts)){ cout=0;j--){ cout

/*======================以下是SCAN算法====================*/ void SCAN(int queue[], int n, int diskrode, int headstarts){ int direction, i, fixi;cout>direction;double count=0;*bubble(queue,n);fixi = fix(queue,n,headstarts);cout=0;i--){ cout=0;i--)//从大到小 { cout-1;i--){ cout-1;i--)//从大到小 { cout

/*======================以下是CSCAN算法====================*/ void CSCAN(int queue[],int n,int diskrode,int headstarts){ int direction,i,fixi;cout>direction;int count=0;//count表示磁道移动的长度 *bubble(queue,n);fixi=fix(queue,n,headstarts);cout-1;--i){ cout-1;--i){ cout-1;i--){ coutfixi;i--){ cout

void main(){ int n, i, diskrode, headstarts;//n表示调度磁盘请求序列queue的长度,diskrode表示磁盘磁道的个数,headstarts表示目前正在调度的磁道; cout> diskrode;cout>n;int *queue;queue =(int*)malloc(n*sizeof(int));//给quneue数组分配空间...int *queue_copy;queue_copy =(int*)malloc(n*sizeof(int));cout>queue[i];for(i=0;i>headstarts;int menux;menu();cout>menux;while(menux!=0){ if(menux ==1)FCFS(queue,n,diskrode,headstarts);

if(menux ==2)SSTF(queue,n,diskrode,headstarts);

if(menux ==3)SCAN(queue,n,diskrode,headstarts);if(menux ==4)CSCAN(queue,n,diskrode,headstarts);if(menux ==5)cout>menux;cout

《操作系统课程设计磁盘调度算法.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
操作系统课程设计磁盘调度算法
点击下载文档
相关专题 磁盘调度算法课程设计 磁盘 算法 课程设计 磁盘调度算法课程设计 磁盘 算法 课程设计
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文