操作系统移动臂调度算法的实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

南京工程学院

上机实验报告课程名称:操作系统

实验项目名称:移动臂调度算法的实现

学生班级:

学生学号:

学生姓名:

指导教师:

实验时间:

实验地点:信息楼专业机房

实验成绩评定:

2016-2017-1 学期

、实验目的及内容

掌握操作系统的设备管理功能,熟悉移动臂调度算法,设计恰当的数据结构和算法,模拟实现移动臂调度算法。要求至少模拟实现一种磁盘移臂调度算法。

二、实验相关知识简介

磁盘移臂调度的目标就是要使磁盘访问的总时间中的寻找时间最小。因此,磁盘移臂调度要尽量减少磁盘移动臂移动的距离。磁盘移臂调度算法很多,常用的也有好几种,一个好的磁盘调度算法,不仅要使磁盘寻找时间最小,同时,还要避免移动臂频繁地改变移动方向,因为频繁的改向不仅使时间增加,还容易损耗机械部件。

常用的磁盘移臂调度算法有:先来先服务、最短寻找时间优先、单向扫描、双向扫描调度算法等。

三、解决问题思路及关键程序代码分析

(一)最短寻找时间优先调度算法简介

最短寻找时间调度算法总是使寻找时间最短的请求最先得到服务,跟请求者的请求时间先后顺序无关。这种算法具有比先来先服务更好的性能。但是该算法可能会出现请求者被“饿死”的情况,当靠近磁头的请求源源不断地到来,这会使早来的但离磁头较远的请求长时间得不到服务。

该算法的优点是可以得到较短的平均响应时间,有较好的吞吐量。该算法的缺点是缺乏公平性,对中间磁道的访问比较“照顾”,对两端磁道访问比较“疏远”,相应时间的变化幅度较大。该算法与先来先服务算法一样,都会导致移动臂频繁改向。

(二)算法模拟

1. 对算法设计进行说明

该算法的实现中,主要是选择调度处理的磁道是与当前磁头所在磁道距离最近的磁道,以使每次的寻道时间最短。当选择了某个离当前磁头所在磁道最近的磁道,下一轮的当前磁道便改成了上一轮的最近磁道,并且把这个最近的磁道从请求序列取消,直到请求序列中不再有请求的磁道。

2. 关键代码分析

import .*;

import .*;

public class

{

private static int maxsize = 100;

private static int Disc []= new int [ maxsize ]; // 请求序列

private static int cou nt ; // 要访问的磁道数

private static int disc ; // 当前磁道号

private static int perTime ; //移过每个柱面需要时间

private static int Dista nee =0; //总寻道长度

private static int Fin dTime ;//查找时间

private static double AvgDistanee ; // 平均寻道长度

public Suanfa( int disc, int cou nt, int perTime, int Disc[]) {

=disc;

=cou nt;

=perTime;

for (int i=0;i<;i++)

Disc[i]=Disc[i];

}

public void input()

{

"请输入当前磁道号:“);

Scanner s1丄new Scanner;

disc =();

"请输入要访问的磁道数:");

Scanner s2匕new Scanner;

cou nt =();

"请输入移过每个柱面需要的时间:”);

Scanner s3二new Scanner;

perTime =();

"请输入磁盘请求序列(以空格隔开) :“);

Scanner s4二new Scanner;

for (int i=0;i< count ;i++)

Disc [i]=();

}

public void Delete( int arr[], int n)

{

for (int i=n;i<;i++)

arr[i]=arr[i+1];

}

public void running()

{

int j=0,count1= count ;

int mi n;

int discc= disc ;

int Discc[]= new int [ count ];

while (j< count )

{

int n um=0;

min=( Disc [0]>=discc)( Disc [O]-discc):(discc- Disc [0]);

for ( int i=0;i

{

if ((( Disc [i]>=discc;)&&( Disc [i]-discc

min=(

n

Disc [i]>=discc)( Disc [i]-discc):(discc- Disc [i]);

um=i;

}

}

Discc[j++]= Disc [num];

Dista nee +=min;

discc= Disc [num];

Delete( Disc ,num);

cou nt1--;

}

AvgDistanee =( double ) Distanee / count

FindTime =perTime * Distanee "\n 服务序列:"+disc +""); for (int i=0;i< count ;i++) "“);

"\n 总寻道长度:"+ Distanee );

"平均寻道长度:"+AvgDistanee );

"寻道时间:"+FindTime +"ms");

相关文档
最新文档