操作系统——移动臂调度算法的实现
- 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;
for(int i=0;i Disc[i]=Disc[i]; } public void input() { System.out.print("请输入当前磁道号:"); Scanner s1=new Scanner(System.in); disc=s1.nextInt(); System.out.print("请输入要访问的磁道数:"); Scanner s2=new Scanner(System.in); count=s2.nextInt(); System.out.print("请输入移过每个柱面需要的时间:"); Scanner s3=new Scanner(System.in); perTime=s3.nextInt(); System.out.print("请输入磁盘请求序列(以空格隔开):"); Scanner s4=new Scanner(System.in); for(int i=0;i Disc[i]=s4.nextInt(); } public void Delete(int arr[],int n) { for(int i=n;i arr[i]=arr[i+1]; } public void running() { int j=0,count1=count; int min; int discc=disc; int Discc[]=new int[count]; while(j { int num=0; min=(Disc[0]>=discc)?(Disc[0]-discc):(discc-Disc[0]); for(int i=0;i { if(((Disc[i]>=discc)&&(Disc[i]-discc ] { min=(Disc[i]>=discc)?(Disc[i]-discc):(discc-Disc[i]); num=i; } } Discc[j++]=Disc[num]; Distance+=min; discc=Disc[num]; Delete(Disc,num); count1--; } AvgDistance=(double)Distance/count; FindTime=perTime*Distance; System.out.print("\n服务序列:"+disc+" "); for(int i=0;i System.out.print(Discc[i]+" "); System.out.println("\n总寻道长度:"+Distance); System.out.println("平均寻道长度:"+AvgDistance); System.out.println("寻道时间:"+FindTime+"ms"); } public static void main(String[] args) { System.out.println("----------最短寻找时间优先算法----------"); Suanfa Suanfa=new Suanfa(disc,count,perTime,Disc); Suanfa.input(); Suanfa.running(); } } 四、运行结果 程序的运行结果如图所示: