操作系统 磁盘调度算法 java版.docx

上传人:b****5 文档编号:8364710 上传时间:2023-01-30 格式:DOCX 页数:15 大小:64.68KB
下载 相关 举报
操作系统 磁盘调度算法 java版.docx_第1页
第1页 / 共15页
操作系统 磁盘调度算法 java版.docx_第2页
第2页 / 共15页
操作系统 磁盘调度算法 java版.docx_第3页
第3页 / 共15页
操作系统 磁盘调度算法 java版.docx_第4页
第4页 / 共15页
操作系统 磁盘调度算法 java版.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

操作系统 磁盘调度算法 java版.docx

《操作系统 磁盘调度算法 java版.docx》由会员分享,可在线阅读,更多相关《操作系统 磁盘调度算法 java版.docx(15页珍藏版)》请在冰豆网上搜索。

操作系统 磁盘调度算法 java版.docx

操作系统磁盘调度算法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;i

cidao[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;i

System.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;j

System.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;i

System.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;j

System.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;i

System.out.print(cidao[i]+"");

}

sum=now-2*cidao[0]+cidao[count-1];

}

if(cidao[0]>=now)//若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务,此情况同最短寻道优先

{

System.out.print("磁盘扫描序列为:

");

for(i=0;i

System.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;j

System.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;i

for(intj=i+1;j

if(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("");

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 生产经营管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1