1、磁盘调度课程设计任务书 学 院 计算机与信息学院 专 业 网络工程 课程名称 计算机操作系统 题 目 磁盘调度 完毕期限 自6月3日至6月30日共4周 内 容 及 任 务 一、项目目 通过设计一种磁盘调度模仿系统,从而使磁盘调度算法更加形象化,容易使人理解,使磁盘调度特点更简朴明了,能使使用者加深对先来先服务算法、最短寻道时间优先算法、扫描算法以及循环扫描算法等磁盘调度算法理解。 二、项目任务重要内容和规定 磁盘调度算法重要涉及四种算法,先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)、循环扫描算法(C
2、SCAN)。 三、 项目设计(研究)思路 1.先来先服务算法(FCFS): 输入磁道号,按先来先服务方略输出磁盘祈求序列,求平均寻道长度,输出移动平均磁道数。 2.最短寻道时间优先算法(SSTF):磁道号用冒泡法从小到大排序,输出排好序磁道序列,输入当前磁道号,依照前磁道在已排序列中位置,选取扫描顺序,求出平均寻道长度,输出移动平均磁道数。 3.扫描算法(SCAN):将磁道号用冒泡法从小到大排序,输出排好序序列,输入当前磁道号,选取移动臂移动方向,依照当前磁道在已排序列中位置,选取扫描顺序,求出平均寻道长度,输出移动平均磁道数。 4.循环扫描算法(CSCAN):将磁道号用冒泡法从小到
3、大排序,输出排好序序列,输入当前磁道号,规定移动臂单向重复从内向外移动,依照当前磁道在已排序列中位置,选取扫描顺序,求出平均寻道长度,输出移动平均磁道数。 四、详细成果形式和规定 设计一种磁盘调度程序,按顾客不同选取,用不同算法进行不同模仿。 进 度 安 排 起止日期 工作内容 /6/3-/6/10 理解磁盘调度原理背景、查询有关资料设计规划设计总体思路 /6/11-/6/20 编写代码实现各某些功能、综合各个模块详细操作 /6/21-/6/30 进行测试软件以及对软件进行调试、修改。最后编写文档 主 要 参 考 资 料 [1]汤小丹,梁红兵.计算机操
4、作系统[M].西安:西安电子科技大学出版社, [1]何钦铭,颜晖.C语言程序设计[M].北京:高等教诲出版社, [2]严蔚敏,吴伟民. 数据构造(C语言版)[M].北京:清华大学出版社, 指引教师 意见 (签字): 年 月 日 系(教研室)主任意见 (签字): 年 月 日 设备管理课程设计阐明书 学院名称: 滁州学院
5、 班级名称: 网络工程 学生姓名:王大龙、王俊、王鹏、杨涛、张炎 学 号:、 题 目: 磁盘调度 指引教师: 李元金 起止日期: 6月8—6月30日 目录 第一某些:正文某些 5 一、选题背景 5 二、设计理念 5 三、过程阐述 6 3.1系统概要设计 6 3.2详细设计
6、 6 3.2.1设计任务 6 3.2.2设计规定 6 3.2.3算法思想 6 四、成果分析 12 4.1 先来先服务(FCFS) 12 4.2 最短寻道时间优先算法(SSTF) 12 4.3 扫描算法(SCAN) 13 4.4 循环扫描算法(CSCAN) 13 五、结论(或总结) 14 第二某些:参照文献 14 第三某些:指引教师评语 15 第四某些:成绩评估 15 第一某些:正文某些 一、选题背景 为了加深对操作系统原理进一步结识,加强实践动手能力和程序开发能力培养,提高分析问题解决问题能力
7、培养合伙精神,以巩固和加深磁盘调度概念。操作系统是一门工程性很强课程,它不但规定学生掌握操作系统工作原理和理论知识,也规定学生实际动手能力,以加深对所学习内容理解,使学生纯熟地掌握计算机操作办法,使用各种软件工具,加强对课程内容理解。这次课程设计,就是通过模仿磁盘调度来加深对操作系统中磁盘调度概念理解,使咱们熟悉磁盘管理系统设计办法;加深对所学各种磁盘调度算法理解及其算法特点。 二、设计理念 2.1先来先服务(FCFS)方略,即先来祈求先被响应。FCFS方略看起来似乎是相称"公平",但是当祈求频率过高时候FCFS方略响应时间就会大大延长。FCFS方略为咱们建立起一种随机访问机制模型,但是
8、如果用这个方略重复响应从里到外祈求,那么将会消耗大量时间。为了尽量减少寻道时间,看来咱们需要对等待着祈求进行恰当排序,而不是简朴使用FCFS方略。这个过程就叫做磁盘调度管理。有时候FCFS也被看作是最简朴磁盘调度算法。 2.2最短时间优先(SSTF)算法选取这样进程。规定访问磁道,与当前磁头所在磁道距离近来,以使每次寻道时间最短。 2.3扫描(SCAN)调度算法:该算法不但考虑到欲访问磁道与当前磁道间距离,更优先考虑是磁头当前移动方向。例如,当磁头正在自里向外移动时,SCAN算法所考虑下一种访问对象,应是其欲访问磁道,既在当前磁道之外,又是距离近来。这样自里向外访问,直至再无更外磁道需要访
9、问时,才将磁道换向自外向里移动。这时,同样也是每次选取这样进程来调度,也就是要访问当前位置内距离近来者,这样,磁头又逐渐地从外向里移动,直至再无更里面磁道要访问,从而避免了浮现“饥饿”现像。 2.4循环扫描(CSCAN)算法:当磁头刚从里向外移动而越过了某一磁道时,正好又有一进程祈求访问此磁道,这时,该里程就必要等待,为了减少这种延迟,CSCAN算法规定磁头单向移动。 三、过程阐述 3.1系统概要设计 设计办法为任务分解、逐渐求精办法,先完毕各个模块功能(FCFS、SSTF、SCAN、CSCAN),并进行调试和验证,最后完毕系统完整设计,使设计过程得到可靠保证。 3.2 详细设计
10、 3.2.1设计任务 本系统划分为四个模块:先来先服务算法模块FCFS、最短寻道时间优先算法模块SSTF、扫描算法模块SCAN和循环扫描算法模块:CSCAN,用来实现磁盘调度模仿。 3.2.2设计规定 依照磁盘调度算法思想,编程实现先来先服务、最短寻道时间优先、扫描算法、循环扫描算法等,并通过数据分析比较各种算法平均寻道长度。 3.2.3算法思想 系统主界面可以灵活选取某种算法,算法涉及:先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)、循环扫描算法(CSCAN)。 (1)先来先服务算法(FCFS) 这是一种比较简朴磁盘调度算法。它依照进程祈求访
11、问磁盘先后顺序进行调度。此算法长处是公平、简朴,且每个进程祈求都能依次得到解决,不会浮现某一进程祈求长期得不到满足状况。此算法由于未对寻道进行优化,在对磁盘访问祈求比较多状况下,此算法将减少设备服务吞吐量,致使平均寻道时间也许较长,但各进程得到服务响应时间变化幅度较小。 (2)最短寻道时间优先算法(SSTF) 该算法选取这样进程,其规定访问磁道与当前磁头所在磁道距离近来,以使每次寻道时间最短,该算法可以得到比较好吞吐量,但却不能保证平均寻道时间最短。其缺陷是对顾客服务祈求响应机会不是均等,因而导致响应时间变化幅度很大。在服务祈求诸多状况下,对内外边沿磁道祈求将会无限期被延迟,有些祈求响应时
12、间将不可预期。 (3)扫描算法(SCAN) 扫描算法不但考虑到欲访问磁道与当前磁道距离,更优先考虑是磁头当前移动方向。例如,当磁头正在自里向外移动时,扫描算法所选取下一种访问对象应是其欲访问磁道既在当前磁道之外,又是距离近来。这样自里向外地访问,直到再无更外磁道需要访问才将磁臂换向,自外向里移动。这时,同样也是每次选取这样进程来调度,即其要访问磁道,在当前磁道之内,从而避免了饥饿现象浮现。由于这种算法中磁头移动规律颇似电梯运营,故又称为电梯调度算法。此算法基本上克服了最短寻道时间优先算法服务集中于中间磁道和响应时间变化比较大缺陷,而具备最短寻道时间优先算法长处即吞吐量较大,平均响应时间较小
13、但由于是摆动式扫描办法,两侧磁道被访问频率仍低于中间磁道。 (4)循环扫描算法(CSCAN) 循环扫描算法是对扫描算法改进。如果对磁道访问祈求是均匀分布,当磁头到达磁盘一端,并反向运动时落在磁头之后访问祈求相对较少。这是由于这些磁道刚被解决,而磁盘另一端祈求密度相称高,且这些访问祈求等待时间较长,为理解决这种状况,循环扫描算法规定磁头单向移动。例如,只自里向外移动,当磁头移到最外被访问磁道时,磁头及时返回到最里欲访磁道,即将最小磁道号紧接着最大磁道号构成循环,进行扫描。 3.2.4算法设计 (1)先来先服务算法模块:void FCFS(int array[],int m)输入磁道号,
14、按先来先服务方略输出磁盘祈求序列,求平均寻道长度,输出移动平均磁道数。 FCFS算法流程图 (2)最短寻道时间优先算法模块:void SSTF(int array[],int m)将磁道号用冒泡法从小到大排序,输出排好序磁道序列,输入当前磁道号,依照前磁道在已排序列中位置,选取扫描顺序,求出平均寻道长度,输出移动平均磁道数。 SSTF算法流程图 (3)扫描算法模块:void SCAN(int array[],int m)将磁道号用冒泡法从小到大排序,输出排好序序列,输入当前磁道号,选取移动臂移动方向,依照当前磁道在已排序列中位置,选取扫描顺序,求出平均寻道长度,
15、输出移动平均磁道数。 SCAN算法流程图 (4)循环扫描算法模块:void CSCAN(int array[],int m)将磁道号用冒泡法从小到大排序,输出排好序序列,输入当前磁道号,规定移动臂单向重复从内向外移动,依照当前磁道在已排序列中位置,选取扫描顺序,求出平均寻道长度,输出移动平均磁道数。 CSCAN算法流程图 四、成果分析 4.1 先来先服务(FCFS) 图4.1.1 FCFS算法运营成果 4.2 最短寻道时间优先算法(SSTF) 图4.1.1 SSTF算法运营成果 4.3 扫描算法(SCAN) 图4.1.3 SCAN算法运营成果 4.4
16、循环扫描算法(CSCAN) 图4.1.3 CSCAN算法运营成果 五、结论(或总结) 本系统具备很强健壮性,当输入错误数据类型时,系统提示顾客输入数据类型错误,让顾客重新输入,保证系统稳定性,不会由于顾客误操作而致使系统瘫痪;虽然是在dos状态下,但是本系统界面还是设计比较美丽,具备比较好交互性;对于软件中重用代码,设计成一种函数,实当代码重用。本系统是在dos状态下进行编译执行,没有图形化界面,可以设计出一种图形化界面,使顾客操作更加简朴,明了。 通过对这次操作系统课程设计亲自参加和操作,使我深刻体会到了:只要你想做只要你想学没有弄不懂得事情,工程里面也不能不在乎细节,等等。感觉
17、很受益匪浅。懂得了操作系统磁盘调度四种算法:先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)和循环扫描算法(CSCAN)。加深了我对这门课程理解。锻炼了自己在考虑全局也不是细节能力。通过这次实验,再一次熟悉并进一步掌握了程序设计语言和算法设计。同步,我也深深体会到了团队重要性,如果没有同组人互相勉励和督促我跟本不能不久完毕任务。一滴水力量是有限,但汇聚成溪流将是美丽。虽然咱们每个人力量都是有限,但是激烈讨论、互相勉励使咱们在实践中成长。感谢和我一起面对同伴们,由于有你们我才变得勤奋。更感谢予以咱们谆谆辅导教师,在咱们踌躇困惑时予以咱们指引,谢谢您! 第二某些
18、参照文献 1.汤小丹,梁红兵.计算机操作系统[M].西安:西安电子科技大学出版社,. 2.何钦铭,颜晖.C语言程序设计[M].北京:高等教诲出版社,. 3.严蔚敏,吴伟民.数据构造(C语言版)[M].北京:清华大学出版社,. 学生签名: 填表日期: 年 月 日 第三某些: 指引教师评语 第四某些:成绩评估 指引教师签名: 填表日期: 年 月 日 附录: 程序源代码 #include"stdio.h" #include"
19、stdlib.h"
#define maxsize 100 //定义最大数组域
#include 20、移动距离,abs函数取绝对值
}
avg=sum/m;//计算平均寻道长度
printf("\n 移动总道数: %d \n",sum);
printf(" 平均寻道长度: %d \n",avg);
}
//最短寻道时间优先调度算法
void SSTF(int array[],int m)
{
int temp;
int k=1;
int now,l,r;
int i,j,sum=0;
int avg;
for(i=0;i 21、f(array[i]>array[j])//两磁道号之间比较
{
temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}
}
for( i=0;i 22、
{
for(i=m-1;i>=0;i--)//将数组磁道号从大到小输出
printf("%d ",array[i]);
sum=now-array[0];//计算移动距离
}
else if(array[0]>=now)//判断整个数组里数与否都不不大于当前磁道号
{
for(i=0;i 23、{
k++;
}
l=k-1;
r=k;
//拟定当前磁道在已排序列中位置
while((l>=0)&&(r 24、tf("%d ",array[r]);
sum+=array[r]-now;//计算移动距离
now=array[r];
r=r+1;
}
}
if(l=-1)//////////此时now为array[0],需要到达array[m-1],即前半段扫描结束,后半段尚有剩余
{
for(j=r;j 25、/////此时now为array[m-1]需要到达array[0],后半段扫描结束,前半段尚有剩余
{
for(j=l;j>=0;j--)
{
printf("%d ",array[j]);
}
sum+=array[m-1]-array[0];//计算移动距离
}
}
avg=sum/m;
printf("\n 移动总道数: %d \n",sum);
printf(" 平均寻道长度: %d \n",avg);
}
//扫描算法
void SCAN(int array[],int m)//先 26、要给出当前磁道号和移动臂移动方向,到了端点时磁臂到另一端点
{
int temp;
int k=1;
int now,l,r,d;
int i,j,sum=0;
int avg;
for(i=0;i 27、
printf("%d ",array[i]);//输出排序后磁道号数组
}
printf("\n 请输入当前磁道号:");
scanf("%d",&now);
if(array[m-1]<=now)//判断整个数组里数与否都不大于当前磁道号
{
printf("\n SCAN调度成果: ");
for(i=m-1;i>=0;i--)
{
printf("%d ",array[i]);//将数组磁道号从大到小输出
}
sum=now-array[0];//计算移动距离
}
else if(array[0]>=now 28、)//判断整个数组里数与否都不不大于当前磁道号
{
printf("\n SCAN调度成果: ");
for(i=0;i 29、
scanf("%d",&d);
printf("\n SCAN调度成果: ");
if(d==0)//磁道号减小方向<-
{
for(j=l;j>=0;j--)
{
printf("%d ",array[j]);
}
for(j=r;j 30、//依照距离算
}
else////////////////磁道增长方向->
{
for(j=r;j 31、intf("\n 移动总道数: %d \n",sum);
printf(" 平均寻道长度: %d \n",avg);
}
//循环扫描算法
void CSCAN(int array[],int m)
{
int temp;
int k=1;
int now,l,r,d;
int i,j,sum=0;
int avg;
for(i=0;i 32、 array[i]=array[j];
array[j]=temp;
}
}
}
for( i=0;i 33、[i]);//将磁道号从小到大输出
}
sum=now-array[0]+array[m-1];//计算移动距离
}
else if(array[0]>=now)//判断整个数组里数与否都不不大于当前磁道号
{
printf("\n CSCAN调度成果: ");
for(i=0;i 34、以拟定K值
{
k++;
}
l=k-1;
r=k;
printf("\n 请输入当前移动臂移动方向 (1 磁道号增长方向,0磁道号减小方向) :");
scanf("%d",&d);
printf("\n CSCAN调度成果: ");
if(d==0)////////////<-
{
for(j=l;j>=0;j--)
{
printf("%d ",array[j]);
}
for(j=m-1;j>=r;j--)
{
printf("%d ",array[j]);
35、 }
sum=2*(array[m-1]-array[0])-array[r]+now;//计算移动距离
/////sum=now-array[0]+array[m-1]-array[0]+array[m-1]-array[r] 先<-再<-循环到尾再<-
}//磁道号减小方向
else
{
for(j=r;j 36、m=2*(array[m-1]-array[0])+array[r-1]-now;//计算移动距离
////////sum=array[m-1]-now+array[m-1]-array[0]+array[r-1]-array[0]//////////先->再循环到尾->再->
}
}//磁道号增长方向
avg=sum/m;
printf("\n 移动总道数: %d \n",sum);
printf(" 平均寻道长度: %d \n",avg);
}
// 操作界面
int main()
{
system("color 97");
int c 37、
FILE *fp;//定义指针文献
int cidao[maxsize];//定义磁道号数组
int i=0,count;
fp=fopen("D://cidao.txt","r+");//读取cidao.txt文献
if(fp==NULL)//判断文献与否存在
{
printf("\n 请 先 设 置 磁 道!\n");
exit(0);
}
while(!feof(fp))//如果磁道文献存在
{
fscanf(fp,"%d",&cidao[i]);//调入磁道号
i++;
}
count=i-1;
printf( 38、"\n ***************************************************\n");
printf("\n *********************************************\n");
printf("\n --------------------------------------------------\n");
printf(" 操作系统课程设计--磁盘调度算法模仿");
printf("\n --------------------------------------------------\n" 39、);
printf("\n 磁道读取成果:\n");
for(i=0;i<=count;i++)
{
printf("%5d",cidao[i]);//输出读取磁道磁道号
}
printf("\n ");
while(1)
{
printf("\n 算法选取:\n");
printf(" 1、先来先服务算法(FCFS)\n");
printf(" 2、最短寻道时间优先算法(SSTF)\n");
printf(" 3、扫描算法(SCAN)\n");
printf(" 4、循环扫描算法(CSCAN)\n") 40、
printf(" 5. 退出\n");
printf("\n");
printf("请选取:");
scanf("%d",&c);
if(c>5)
break;
switch(c)//算法选取
{
case 1:
FCFS(cidao,count);//先来先服务算法
printf("\n");
break;
case 2:
SSTF(cidao,count);//最短寻道时间优先算法
printf("\n");
break;
case 3:
SCAN(cidao,count);//扫描算法
printf("\n");
break;
case 4:
CSCAN(cidao,count);//循环扫描算法
printf("\n");
break;
case 5:
exit(0);
}
}
return 0;
}
©2010-2025 宁波自信网络信息技术有限公司 版权所有
客服电话:4009-655-100 投诉/维权电话:18658249818