操作系统——移动臂调度算法的实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
南京工程学院
上机实验报告课程名称:操作系统
实验项目名称:移动臂调度算法的实现学生班级:
学生学号:
学生姓名:
指导教师:
实验时间:
实验地点:信息楼专业机房实验成绩评定:
2016-2017-1学期
一、实验目的及内容
掌握操作系统的设备管理功能,熟悉移动臂调度算法,设计恰当的数据结构和算法,模拟实现移动臂调度算法;要求至少模拟实现一种磁盘移臂调度算法;
二、实验相关知识简介
磁盘移臂调度的目标就是要使磁盘访问的总时间中的寻找时间最小;因此,磁盘移臂调度要尽量减少磁盘移动臂移动的距离;磁盘移臂调度算法很多,常用的也有好几种,一个好的磁盘调度算法,不仅要使磁盘寻找时间最小,同时,还要避免移动臂频繁地改变移动方向,因为频繁的改向不仅使时间增加,还容易损耗机械部件;
常用的磁盘移臂调度算法有:先来先服务、最短寻找时间优先、单向扫描、双向扫描调度算法等;
三、解决问题思路及关键程序代码分析
一最短寻找时间优先调度算法简介
最短寻找时间调度算法总是使寻找时间最短的请求最先得到服务,跟请求者的请求时间先后顺序无关;这种算法具有比先来先服务更好的性能;但是该算法可能会出现请求者被“饿死”的情况,当靠近磁头的请求源源不断地到来,这会使早来的但离磁头较远的请求长时间得不到服务;
该算法的优点是可以得到较短的平均响应时间,有较好的吞吐量;该算法的缺点是缺乏公平性,对中间磁道的访问比较“照顾”,对两端磁道访问比较“疏远”,相应时间的变化幅度较大;该算法与先来先服务算法一样,都会导致移动臂频繁改向;
二算法模拟
1. 对算法设计进行说明
该算法的实现中,主要是选择调度处理的磁道是与当前磁头所在磁道距离最近的磁道,以使每次的寻道时间最短;当选择了某个离当前磁头所在磁道最近的磁道,下一轮的当前磁道便改成了上一轮的最近磁道,并且把这个最近的磁道从请求序列取消,直到请求序列中不再有请求的磁道;
2. 关键代码分析
import java.io.;
import java.util.;
public class
{
private static int maxsize = 100;
private static int Disc = new int maxsize; //请求序列
private static int count;//要访问的磁道数
private static int disc; //当前磁道号
private static int perTime;//移过每个柱面需要时间
private static int Distance=0;//总寻道长度
private static int FindTime;//查找时间
private static double AvgDistance;//平均寻道长度
public Suanfa int disc,int count,int perTime,int Disc
{
this.disc=disc;
this.count=count;
this.perTime=perTime;
forint i=0;i<Disc.length;i++
Disci=Disci;
}
public void input
{
System.out.print"请输入当前磁道号:";
Scanner s1=new ScannerSystem.in;
disc=s1.nextInt;
System.out.print"请输入要访问的磁道数:";
Scanner s2=new ScannerSystem.in;
count=s2.nextInt;
System.out.print"请输入移过每个柱面需要的时间:";
Scanner s3=new ScannerSystem.in;
perTime=s3.nextInt;
System.out.print"请输入磁盘请求序列以空格隔开:";
Scanner s4=new ScannerSystem.in;
forint i=0;i<count;i++
Disc i=s4.nextInt;
}
public void Delete int arr,int n
{
forint i=n;i<arr.length-1;i++
arri=arri+1;
}
public void running
{
int j=0,count1=count;
int min;
int discc=disc;
int Discc=new int count;
while j<count
{
int num=0;
min=Disc0>=discc Disc0-discc:discc-Disc0;
forint i=0;i<count1;i++
{
if Disc i>=discc&&Disc i-discc<min||Disc i<discc&&discc-Disc i<min {
min=Disc i>=discc Disc i-discc:discc-Disc i;
num=i;
}
}
Disccj++=Disc num;
Distance+=min;
discc=Disc num;
Delete Disc,num;
count1--;
}
AvgDistance=double Distance/count;
FindTime=perTimeDistance;
System.out.print"\n服务序列:"+disc+" ";
forint i=0;i<count;i++
System.out.printDiscci+" ";
System.out.println"\n总寻道长度:"+Distance;
System.out.println"平均寻道长度:"+AvgDistance;
System.out.println"寻道时间:"+FindTime+"ms";
}
public static void mainString args
{
System.out.println"----------最短寻找时间优先算法----------";
Suanfa Suanfa=new Suanfa disc,count,perTime,Disc;
Suanfa.input;
Suanfa.running;
}
}
四、运行结果
程序的运行结果如图所示:
五、体会与提高
通过本次的实验设计,把教材中的理论知识转化为实践,在一定程度上深了我对读者-写者这类经典的同步问题的理解,同时也提高了我的动手编程和独立思考的能力;虽然在分析问题的过程中,遇到了很多的疑惑与不解,。