操作系统课程设计磁盘调度.docx
《操作系统课程设计磁盘调度.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计磁盘调度.docx(21页珍藏版)》请在冰豆网上搜索。
![操作系统课程设计磁盘调度.docx](https://file1.bdocx.com/fileroot1/2023-2/2/0eb1ed74-8d44-4eac-824b-899b24047515/0eb1ed74-8d44-4eac-824b-899b240475151.gif)
操作系统课程设计磁盘调度
计算机操作系统课程设计
设计说明书
磁盘调度算法的实现与分析
学生姓名
班级
学号
成绩
指导教师(签字)
计算机与通信学院
目录
1课程设计简介3
1.1课程设计的目的3
1.2课程设计内容3
1.2.1先服务FCFS(FirstComeFirstServer)3
1.2.2最短寻道时间优先SSFT(ShortestSeekTimeFirst)3
1.2.3SCAN4
1.2.4C-SCAN5
2数据结构的设计6
2.1数据结构的设计理念6
2.2数据结构的详细设计6
2.2.1FCFS策略6
2.2.2SSTF策略6
2.2.3SCAN策略7
2.2.4C_SCAN策略7
3功能模块(或算法)描述8
3.1排序模块(流程图)8
3.1.1SSTF策略8
3.1.2SCAN策略8
3.1.3C_SCAN策略9
3.2求移动的磁道数模块(流程图)9
4程序运行结果11
4.1FCSF策略的运行结果11
4.2SSTF策略的运行结果11
4.3SCAN策略的运行结果12
4.4C_SCAN策略的运行结果12
5、心得体会13
参考文献14
附源代码15
附录一:
FCFS策略15
附录三:
SCAN策略16
附录四:
C_SCAN策略18
1课程设计简介
1.1课程设计的目的
使学生熟悉磁盘管理系统的设计方法;加深对所学各种磁盘调度算法的了解及其算法的特点。
主要对FCFS(先来先服务),SSTF(最短寻道时间优先),SCAN(电梯调度算法),C-SCAN(循环调度算法)这几种磁盘调度的算法分析和实现。
1.2课程设计内容
1.2.1先服务FCFS(FirstComeFirstServer)
这是最简单的磁盘调度策略,它根据进程请求访问磁盘的时间顺序进行调度。
假设磁盘有200个磁道,磁盘请求队列中是一些随机请求。
被请求的磁道按接收顺序分别为:
55、58、39、18、90、160、150、38、184,当前磁头在100磁道处
FCFS策略磁头臂的移动轨迹如下:
1.2.2最短寻道时间优先SSFT(ShortestSeekTimeFirst)
它是根据磁头当前的位置,选择请求队列中距离磁头最短的请求响应。
假设磁盘有200个磁道,磁盘请求队列中是一些随机请求。
被请求的磁道按接收顺序分别为:
55、58、39、18、90、160、150、38、184,当前磁头在100磁道处
SSTF策略磁头臂的移动轨迹如下:
1.2.3SCAN
也称电梯策略,要求磁头臂仅仅沿一个方向移动,并在途中满足所有未完成的请求,直到它到达这个方向的最后一个磁道,或这个方向没有别的请求为止,然后倒转服务方向,同样按顺序完成的有请求。
假设磁盘有200个磁道,磁盘请求队列中是一些随机请求。
被请求的磁道按接收顺序分别为:
55、58、39、18、90、160、150、38、184,当前磁头在100磁道处
SCAN策略磁头臂的移动轨迹如下:
1.2.4C-SCAN
是循环扫描法,当到达最后一个磁道时,磁头臂返回到磁头的另一端,并再次开始扫描。
假设磁盘有200个磁道,磁盘请求队列中是一些随机请求。
被请求的磁道按接收顺序分别为:
55、58、39、18、90、160、150、38、184,当前磁头在100磁道处
C-SCAN策略磁头臂的移动轨迹如下:
2数据结构的设计
2.1数据结构的设计理念
根据磁道请求队列和不同的策略需求,先将磁道队列排好序,然后再根据已排好序的磁道队列求出总的移动磁道数,然后求出平均磁道数。
2.2数据结构的详细设计
2.2.1FCFS策略
申请磁道的队列数组按照队列的顺序进行移动,如:
申请的队列为:
request[n],初始磁道为:
Init_Position,则可令当前磁道为pre,初始状态的pre的值为Init_Position,数据结构顺序为:
输入队列为request[n]:
1
2
3
4
5
6
7
8
9
55
58
39
18
90
160
150
38
184
根据该序列,磁道按顺序移动,将移动的磁道数加到sum中之后,将当前移动到的磁道赋给pre,然后按顺序进行下一个磁道移动,直到队列中的所有申请都移动到了。
2.2.2SSTF策略
该策略是最短寻道时间优先,在申请磁道的队列数组中剩余的磁道找出离当前磁道最近的磁道进行移动,直到全部申请磁道都移动了。
如:
申请的队列为:
request[n],初始磁道为:
Init_Position,则可令当前磁道为pre,初始状态的pre的值为Init_Position,数据结构为:
申请磁道的队列request[n]:
1
2
3
4
5
6
7
8
9
55
58
39
18
90
160
150
38
184
将该申请磁道按照最短寻道时间优先规则,即当前磁道到剩下的磁道的距离最短的磁道为当前磁道的下一个磁道。
可得,重新排序的磁道队列request1[n]:
1
2
3
4
5
6
7
8
9
90
58
55
39
38
18
150
160
184
然后得到的新的磁道队列再按照FCFS策略进行移动。
2.2.3SCAN策略
该策略是扫描,首先要确定扫描方向(本课程设计确定为正方向),在申请磁道的队列数组中剩余的磁道先找出离当前磁道最近的正方向磁道进行移动,直到全部正方向的磁道都移动了,然后再按照反方向寻找当前磁道的最近磁道进行移动。
如:
申请的队列为:
request[n],初始磁道为:
Init_Position,则可令当前磁道为pre,初始状态的pre的值为Init_Position,数据结构为:
根据,申请磁道的队列request[n]:
1
2
3
4
5
6
7
8
9
55
58
39
18
90
160
150
38
184
可得,重新排序的磁道队列request1[n]:
1
2
3
4
5
6
7
8
9
150
160
184
90
58
55
39
38
18
然后得到的新的磁道队列再按照FCFS策略进行移动。
2.2.4C_SCAN策略
该策略是循环扫描,其大部分和SCAN策略相同,首先要确定扫描方向(本课程设计确定为正方向),在申请磁道的队列数组中剩余的磁道先找出离当前磁道最近的正方向磁道进行移动,直到全部正方向的磁道都移动了,然后移动到剩余申请磁道的最小磁道的位置,然后再按照正方向寻找剩余磁道。
如:
申请的队列为:
request[n],初始磁道为:
Init_Position,则可令当前磁道为pre,初始状态的pre的值为Init_Position,数据结构为:
根据,申请磁道的队列request[n]:
1
2
3
4
5
6
7
8
9
55
58
39
18
90
160
150
38
184
可得,重新排序的磁道队列request1[n]:
1
2
3
4
5
6
7
8
9
150
160
184
18
38
39
55
58
90
然后得到的新的磁道队列再按照FCFS策略进行移动。
3功能模块(或算法)描述
3.1排序模块(流程图)
根据策略的不同,有不同的排序规则,FCFS策略是先到先服务策略,所以该策略不需要将队列重新排序,可以直接根据队列顺序求出总的移动磁道数,然后根据总的移动磁道数求出平均移动磁道数。
3.1.1SSTF策略
该策略的流程图如图3-1-1所示。
图3-1-1SSTF策略的队列排序流程图
3.1.2SCAN策略
该策略的流程图如图3-1-2所示。
图3-1-2SCAN策略的队列排序流程图
3.1.3C_SCAN策略
该策略的流程图如图3-1-3所示。
图3-1-2SCAN策略的队列排序流程图
3.2求移动的磁道数模块(流程图)
由于所有的策略都是已经将队列给排好序了的,那么,我们只需要求出按照排好序的队列的磁道一个一个的移动的磁道数,然后相加就可以了,具体流程图如图3-2所示。
图3-2求移动的磁道数流程图
4程序运行结果
4.1FCSF策略的运行结果
如图4-1所示为FCSF策略的运行结果,初始磁道为100,该结果的第一行为磁道的移动过程,sum表示的是磁道的移动总数,average表示的是平均移动磁道数。
图4-1FCSF策略的运行结果
4.2SSTF策略的运行结果
如图4-2所示为SSTF策略的运行结果,初始磁道为100,该结果的第一行为磁道的移动过程,sum表示的是磁道的移动总数,average表示的是平均移动磁道数。
图4-2SSTF策略的运行结果
4.3SCAN策略的运行结果
如图4-3所示为SCAN策略的运行结果,初始磁道为100,该结果的第一行为磁道的移动过程,sum表示的是磁道的移动总数,average表示的是平均移动磁道数。
图4-3SCAN策略的运行结果
4.4C_SCAN策略的运行结果
如图4-4所示为C_SCAN策略的运行结果,初始磁道为100,该结果的第一行为磁道的移动过程,sum表示的是磁道的移动总数,average表示的是平均移动磁道数。
图4-4C_SCAN策略的运行结果
5、心得体会
通过此次课程设计,对磁盘调度算法有了充分的了解,并增强了自身的动手能力,通过自己翻阅书籍,重新熟悉了C语言和一些算法实现。
从中也了解到,学习知识要善于动手,并且要学会克服困难,解决遇到的问题。
只有在不断的动手学习和克服困难的过程中,学习到更多的知识,知识也会因为应用而记忆更加深刻。
由此可知,我们要从实际中去检验自己的知识,去了解自己对知识的掌握程度。
最终,达到学以致用的目的。
参考文献
[1]刘振鹏,石强数据结构(第三版)中国铁道出版社.2007.
[2]罗宇,邹鹏,邓胜兰操作系统(第三版).北京:
电子工业高等教育出版社,2012.
[3]李长云,廖立君,王平,童启C语言程序设计[CIP].北京:
国防工业大学出版社2011.
附源代码
附录一:
FCFS策略
intfunFCFS()
{
intrequest[]={55,58,39,18,90,160,150,38,184};
intstart=Init_Position;
inti,d_value;//d_value跨过的磁道数
intsum=0;
printf("FCFS先来先服务算法\n");
printf("磁道的起始位置:
%d\n",start);
for(i=0;i<=8;i++)
{
d_value=abs(start-request[i]);//abs()求绝对值
sum=sum+d_value;
printf("下一磁道为:
%d\t",request[i]);
printf("横跨的磁道数是:
%d\n",d_value);
start=request[i];
}
printf("总共跨过的磁道数是%d\n",sum);
printf("平均经历的磁道数是%f\n",(double)sum/9);
return0;
}
附录二:
SSTF策略
intfunSSTF()
{
intrequest[]={55,58,39,18,90,160,150,38,184};
intstart=Init_Position;//当前磁头的位置
intsum=0,n=9,i;
intd_value,j,next;//下一磁道位置
inttemp;
printf("SSTF最短寻道时间优先算法\n");
printf("磁道的起始位置:
%d\n",Init_Position);
for(i=0;inext=request[i];
d_value=abs(next-start);
//将磁道重新排序
for(j=i+1;jif(abs(request[j]-start)request[i]=request[j];
request[j]=next;
next=request[i];
d_value=abs(next-start);
}
}
start=next;
}
start=Init_Position;//初始化位置53
for(i=0;itemp=abs(request[i]-start);
sum+=temp;//磁头总的移动磁道数
start=request[i];
printf("磁头移动的下一个磁道:
%d\t",start);
printf("横跨的磁道数:
%d\n",temp);
}
printf("移动总的磁道数:
%d\n",sum);
printf("平均移动总的磁道数%f\n",1.0*sum/n);
return0;
}
附录三:
SCAN策略
intfunSCAN()
{
intrequest[]={55,58,39,18,90,160,150,38,184};
intstart=Init_Position,next;
intsum=0;
//使用递增方向
intj,i;
intd_value,s_value;
inttemp;
printf("SCAN电梯调度算法\n");
printf("磁道的起始位置:
%d\n",Init_Position);
for(i=0;i<9;i++){
next=request[i];
d_value=next-start;
for(j=i+1;j<9;j++){
s_value=request[j]-start;
if((d_value*s_value)<0){
if(s_value>0){
request[i]=request[j];
request[j]=next;
next=request[i];
d_value=next-start;
}
}else{
if(abs(d_value)>abs(s_value)){
request[i]=request[j];
request[j]=next;
next=request[i];
d_value=next-start;
}
}
}
start=next;
}
start=Init_Position;
for(i=0;i<9;i++){
temp=abs(request[i]-start);
sum+=temp;
start=request[i];
printf("下一个磁道:
%d\t",start);
printf("横跨的磁道数:
%d\n",temp);
}
printf("移动总的磁道数:
%d\n",sum);
printf("平均移动的磁道数:
%f\n",1.0*sum/9);
return0;
}
附录四:
C_SCAN策略
intfunC_SCAN()
{
intrequest[]={55,58,39,18,90,160,150,38,184};
intpre=Init_Position;
intsum=0,n=9;
inttemp;
inti,j;
//使用递增方向
ints,d_value,next;
printf("C-SCAN循环调度算法\n");
printf("磁道的起始位置:
%d\n",Init_Position);
//先区分请求磁道是在初始位置的左还是右
for(i=0;inext=request[i];
d_value=next-pre;
if(d_value<0){
for(j=i+1;js=request[j]-pre;
if(s>0){
request[i]=request[j];
request[j]=next;
break;
}
}
if(j==n){
break;
}
}
}
for(i=0;inext=request[i];
d_value=next-pre;
if(d_value>0){
for(j=i+1;js=request[j]-pre;
if((d_value*s)>0){
//找出在当前磁道增大方向且离他最近的磁道
if(abs(d_value)>abs(s)){
request[i]=request[j];
request[j]=next;
next=request[i];
d_value=next-pre;
}
}else{
break;
}
}
}else{
pre=0;
//再以距磁道0最近的排序,距离近的排在前
d_value=next-pre;
for(j=i+1;js=request[j]-pre;
if(abs(d_value)>abs(s)){
request[i]=request[j];
request[j]=next;
next=request[i];
d_value=next-pre;
}
}
}
pre=next;
}
pre=Init_Position;
for(i=0;itemp=abs(request[i]-pre);
sum+=temp;
pre=request[i];
printf("下一个磁道:
%d\t",pre);
printf("横跨的磁道数:
%d\n",temp);
}
printf("\nsum=%d\n",sum);
printf("average=%f\n",1.0*sum/n);
return0;
}