操作系统 磁盘调度算法 java版.docx
《操作系统 磁盘调度算法 java版.docx》由会员分享,可在线阅读,更多相关《操作系统 磁盘调度算法 java版.docx(15页珍藏版)》请在冰豆网上搜索。
![操作系统 磁盘调度算法 java版.docx](https://file1.bdocx.com/fileroot1/2023-1/30/a4eab774-c49a-4a60-8852-355c32a06eed/a4eab774-c49a-4a60-8852-355c32a06eed1.gif)
操作系统磁盘调度算法java版
实验六磁盘调度算法
1、实验目的
通过这次实验,加深对磁盘调度算法的理解,进一步掌握先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法的实现方法。
2、试验内容
问题描述:
设计程序模拟先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法的工作过程。
假设有n个磁道号所组成的磁道访问序列,给定开始磁道号m和磁头移动的方向(正向或者反向),分别利用不同的磁盘调度算法访问磁道序列,给出每一次访问的磁头移动距离,计算每种算法的平均寻道长度。
3、程序要求:
1)利用先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法模拟磁道访问过程。
2)模拟四种算法的磁道访问过程,给出每个磁道访问的磁头移动距离。
3)输入:
磁道个数n和磁道访问序列,开始磁道号m和磁头移动方向(对SCAN和循环SCAN算法有效),算法选择1-FCFS,2-SSTF,3-SCAN,4-循环SCAN。
4)输出:
每种算法的平均寻道长度。
4、需求分析
(1)输入的形式和输入值的范围
算法选择
要访问的磁道数
磁道
当前磁道号
输入当前移动臂的移动的方向(第三个算法)
(2)输出的形式
每种算法的平均寻道长度
(3)测试用例
先来先服务FCFS
最短寻道时间优先
SCAN算法
CSCAN
5、调试分析
通过对这次操作系统实验,使我懂得了操作系统磁盘调度的四种算法:
先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)和循环扫描算法(CSCAN)。
加深了我对这门课程的理解。
锻炼了自己在考虑全局也不是细节的能力。
通过这次实验,再一次熟悉并深入掌握了程序设计语言和算法设计。
6、测试结果
(1)使用FCFS算法
输入
输出
(2)使用SSTF算法
输入
输出
(3)使用SCAN算法(向增长方向)
输入
输出
(4)使用SCAN算法(向减少方向)
输入
输出
(5)使用CSCAN算法
输入
输出
7、附录(java)
packageexperiment;
importjava.io.BufferedInputStream;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.util.Scanner;
publicclassF_Disc_Dispatch{
privatestaticintmaxsize=100;
//要访问的磁道数
privatestaticintcount;
//磁道
privatestaticintcidao[]=newint[maxsize];
//当前磁道号
privatestaticintnow;
//总寻道长度
privatestaticintsum=0;
//平均寻道长度
privatestaticdoubleAverageDistance;
//当前移动臂的移动的方向(1(true)表示向外,0(false)表示向内)
privatestaticbooleandirection;
//算法选择
//1-使用FCFS算法
//2-使用SSTF算法
//3-使用SCAN算法
//4-使用CSCAN算法
privatestaticintoption=0;
//for循环用到变量
privatestaticinti;
privatestaticintj;
privatestaticintk;
privatestaticScannerstdin;
publicstaticvoidmain(String[]args)throwsFileNotFoundException{
//输入数据
input();
//inta;
switch(option){
case1:
//使用FCFS算法
FCFS();
break;
case2:
//使用SSTF算法
SSTF();
break;
case3:
//使用SCAN算法
SCAN();
break;
case4:
//使用CSCAN算法
CSCAN();
break;
}
}
//输入数据
publicstaticvoidinput()throwsFileNotFoundException{
BufferedInputStreamin=newBufferedInputStream(newFileInputStream(
"./file/06"));
System.setIn(in);
stdin=newScanner(System.in);
//算法选择
//1-使用FCFS算法
//2-使用SSTF算法
//3-使用SCAN算法
//4-使用CSCAN算法
option=stdin.nextInt();
//要访问的磁道数
count=stdin.nextInt();
//磁道
for(i=0;icidao[i]=stdin.nextInt();
}
//当前磁道号
now=stdin.nextInt();
if(option==3){
//输入当前移动臂的移动的方向(1表示向外,0表示向内):
try{
intg=stdin.nextInt();
if(g==1){
direction=true;
}else{
direction=false;
}
}catch(Exceptione){
//TODO:
handleexception
System.out.println("direction没有正确输入");
return;
}
}
stdin.close();
}
/*********************先来先服务调度算法**************************/
publicstaticvoidFCFS(){
sum+=Math.abs(cidao[0]-now);
System.out.print("磁盘扫描序列为:
");
for(i=0;i{
System.out.print(cidao[i]+"");
}
for(i=0,j=1;j{
sum+=Math.abs(cidao[j]-cidao[i]);
AverageDistance=(float)(sum)/(float)(count);
}
System.out.println("");
System.out.println("平均寻道长度:
"+AverageDistance);
}
/**********************最短寻道时间优先调度算法********************/
publicstaticvoidSSTF(){
k=1;
intl,r;
bubble();//调用冒泡排序算法排序
if(cidao[count-1]<=now)//若当前磁道号大于请求序列中最大者,则直接由外向内依次给予各请求服务
{
System.out.print("磁盘扫描序列为:
");
for(i=count-1;i>=0;i--){
System.out.print(cidao[i]+"");
}
sum=now-cidao[0];
}
if(cidao[0]>=now)//若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务
{
System.out.print("磁盘扫描序列为:
");
for(i=0;iSystem.out.print(cidao[i]+"");
}
sum=cidao[count-1]-now;
}
if(now>cidao[0]&&now{
System.out.print("磁盘扫描序列为:
");
while(cidao[k]{
k++;
}
l=k-1;
r=k;
while((l>=0)&&(r{
if((now-cidao[l])<=(cidao[r]-now))//选择与当前磁道最近的请求给予服务
{
System.out.print(cidao[l]+"");
sum+=now-cidao[l];
now=cidao[l];
l=l-1;
}else{
System.out.print(cidao[r]+"");
sum+=cidao[r]-now;
now=cidao[r];
r=r+1;
}
}
if(l==-1)//磁头移动到序列的最小号,返回外侧扫描仍未扫描的磁道
{
for(j=r;jSystem.out.print(cidao[j]+"");
}
sum+=cidao[count-1]-cidao[0];
}else//磁头移动到序列的最大号,返回内侧扫描仍未扫描的磁道
{
for(j=l;j>=0;j--){
System.out.print(cidao[j]+"");
}
sum+=cidao[count-1]-cidao[0];
}
}
AverageDistance=(float)(sum)/(float)(count);
System.out.println("");
System.out.println("平均寻道长度:
"+AverageDistance);
}
/*****************************扫描调度算法*******************************/
publicstaticvoidSCAN()//先要给出当前磁道号和移动臂的移动方向
{
k=1;
intl,r;
bubble();//调用冒泡排序算法排序
if(cidao[count-1]<=now)//若当前磁道号大于请求序列中最大者,则直接由外向内依次给予各请求服务,此情况同最短寻道优先
{
System.out.print("磁盘扫描序列为:
");
for(i=count-1;i>=0;i--){
System.out.print(cidao[i]+"");
}
sum=now-cidao[0];
}
if(cidao[0]>=now)//若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务,此情况同最短寻道优先
{
System.out.print("磁盘扫描序列为:
");
for(i=0;iSystem.out.print(cidao[i]+"");
sum=cidao[count-1]-now;
}
if(now>cidao[0]&&now{
while(cidao[k]k++;
}
l=k-1;
r=k;
if(direction==false)//选择移动臂方向向内,则先向内扫描
{
System.out.print("磁盘扫描序列为:
");
for(j=l;j>=0;j--){
System.out.print(cidao[j]+"");//输出向内扫描的序列
}
for(j=r;j{
System.out.print(cidao[j]+"");//输出向外扫描的序列
}
sum=now-2*cidao[0]+cidao[count-1];
}else//选择移动臂方向向外,则先向外扫描
{
System.out.print("磁盘扫描序列为:
");
for(j=r;jSystem.out.print(cidao[j]+"");//输出向外扫描的序列
}
for(j=l;j>=0;j--)//磁头移动到最大号,则改变方向向内扫描未扫描的磁道
{
System.out.print(cidao[j]+"");
}
sum=-now-cidao[0]+2*cidao[count-1];
}
}
AverageDistance=(float)(sum)/(float)(count);
System.out.println("");
System.out.println("平均寻道长度:
"+AverageDistance);
}
/************************循环扫描调度算法*****************************/
publicstaticvoidCSCAN(){
k=1;
intl,r;
bubble();//调用冒泡排序算法排序
if(cidao[count-1]<=now)//若当前磁道号大于请求序列中最大者,则直接将移动臂移动到最小号磁道依次向外给予各请求服务
{
System.out.print("磁盘扫描序列为:
");
for(i=0;iSystem.out.print(cidao[i]+"");
}
sum=now-2*cidao[0]+cidao[count-1];
}
if(cidao[0]>=now)//若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务,此情况同最短寻道优先
{
System.out.print("磁盘扫描序列为:
");
for(i=0;iSystem.out.print(cidao[i]+"");
sum=cidao[count-1]-now;
}
if(now>cidao[0]&&now{
System.out.print("磁盘扫描序列为:
");
while(cidao[k]{
k++;
}
l=k-1;
r=k;
for(j=r;jSystem.out.print(cidao[j]+"");//输出从当前磁道向外扫描的序列
}
for(j=0;j{
System.out.print(cidao[j]+"");
}
sum=2*cidao[count-1]+cidao[l]-now-2*cidao[0];
}
AverageDistance=(float)(sum)/(float)(count);
System.out.println("");
System.out.print("平均寻道长度:
"+AverageDistance);
}
/*********************冒泡排序算法**************************/
publicstaticvoidbubble(){
inttemp;
for(inti=0;ifor(intj=i+1;jif(cidao[i]>cidao[j]){
temp=cidao[i];
cidao[i]=cidao[j];
cidao[j]=temp;
}
}
}
System.out.println("排序后的磁盘序列为:
");
for(i=0;i{
System.out.print(cidao[i]+"");
}
System.out.println("");
}
}