请珍惜小编劳动成果,该文章为小编原创,转载请注明出处。

扫描(SCAN)调度算法:总是从磁臂当前位置开始,沿磁臂的移动方向去选择离当前磁臂最近的那个柱面的访问者。如果沿磁臂的方向无请求访问时,就改变磁臂的移动方向。采用这种调度算法,需要为访问者设置两个队列,根据磁头的移动方向,能访问到的访问者由近及远排队,背离磁头移动方向的访问者也由近及远排为另一队。先按磁头移动方向队列调度访问者访问磁盘,当该方向没有访问者时,再改变方向,选择另一个访问者队列访问磁盘。

java代码实现:

import java.util.Scanner;

public class SCAN {

	int visitAdd[];
int visitSub[];
int index=0; //存放下标,已排序序列中找到比它大的最小值的下标
public void scan(int data[],int begin,int direction){
int temp=0;
//从小到大排序
for(int i=0;i<data.length;i++){
for(int j=i;j<data.length;j++){
if(data[i]>data[j]){
temp=data[i];
data[i]=data[j];
data[j]=temp;
}
}
} for(int i=0;i<data.length;i++){
if(data[i]>begin){ //在已排序序列中找到比它大的最小值的下标
index=i;
break;
}
}
//比起始位置小的
visitSub=new int[index]; //比他小的共有index个
for(int i=0;i<index;i++){
visitSub[i]=data[i];
}
//比起始位置大的
visitAdd=new int[data.length-index]; //比他大的共data.length-index个
for(int i=0;i<visitAdd.length;i++){
visitAdd[i]=data[i+index];
}
//计算平均时间
int lengthAdd=0;
int lengthSub=0;
int length=0;
for(int i=0;i<visitAdd.length-1;i++){
lengthAdd+=Math.abs(visitAdd[i]-visitAdd[i+1]);
}
for(int i=visitSub.length-1;i>0;i--){
lengthSub+=Math.abs(visitSub[i]-visitSub[i-1]);
}
length=lengthAdd+lengthSub+Math.abs(begin-visitAdd[0])+Math.abs(begin-visitSub[visitSub.length-1]); if(direction==0){ //找小的
for(int i=visitSub.length-1;i>=0;i--){
System.out.print(visitSub[i]+" ");
}
//回转
for(int i=0;i<visitAdd.length;i++){
System.out.print(visitAdd[i]+" ");
}
length+=Math.abs(visitSub[0]-begin);
}else{ //找大的
for(int i=0;i<visitAdd.length;i++){
System.out.print(visitAdd[i]+" ");
}
//回转
for(int i=visitSub.length-1;i>=0;i--){
System.out.print(visitSub[i]+" ");
}
length+=Math.abs(visitAdd[visitAdd.length-1]-begin);
}
System.out.println("平均寻道长度为"+length/data.length);
}
public static void main(String[] args) {
SCAN scan=new SCAN();
Scanner scanner=new Scanner(System.in);
System.out.println("请输入数据个数");
int num=scanner.nextInt();
System.out.println("请一次输入数据,空格隔开");
int data[]=new int[num];
for(int i=0;i<num;i++){
data[i]=scanner.nextInt();
}
System.out.println("请输入读写头起始位置");
int begin=scanner.nextInt();
System.out.println("请输入磁头移动方向 0:磁道减少方向 1:磁道增加方向 ");
int direction=scanner.nextInt();
scan.scan(data, begin, direction); }
//98 183 37 122 14 124 65 67
}

测试:

版权声明:本文为博主原创文章,未经博主允许不得转载。

电梯调度算法---SCAN算法的更多相关文章

  1. 磁盘寻道时间算法之----------------SCAN算法和最短寻道时间优先调度算法

    若干个等待访问磁盘者依次要访问的柱面编号为:80,40,74,14,60,31,61,假设每移动一个柱面需要4毫秒时间,移动到当前位于35号柱面,且当前的移动方向向柱面号增加的方向.请计算: (1)若 ...

  2. 关于软件工程结对编程作业 PairProject : Elevator Scheduler(电梯调度算法的实现与测试)的总结

    1)结对编程队友 1106xxxx 张扬 1106xxxx 杨军 其中,此项目的编程实现主要由前者完成. 2)关于结对编程 结对编程的优点: 最直接的一点:在结对编程中,由于有另一个人在你身边和你配合 ...

  3. 软件工程 --- Pair Project: Elevator Scheduler [电梯调度算法的实现和测试] [附加题]

    软件工程 --- Pair Project: Elevator Scheduler [电梯调度算法的实现和测试] [附加题] 首先,在分组之前,我和室友薛亚杰已经详细阅读了往届学长的博客,认为电梯调度 ...

  4. 软件工程 --- Pair Project: Elevator Scheduler [电梯调度算法的实现和测试]

    软件工程  ---   Pair Project: Elevator Scheduler [电梯调度算法的实现和测试] 说明结对编程的优点和缺点. 结对编程的优点如下: 在独立设计.实现代码的过程中不 ...

  5. Pair Project: Elevator Scheduler [电梯调度算法的实现和测试][关于电梯调度算法的附加思考]:刘耀先-11061183,罗凡-11061174

    本文为对于电梯调度算法的三个附加题思考 1.改进电梯调度的interface 设计, 让它更好地反映现实, 更能让学生练习算法, 更好地实现信息隐藏和信息共享. <1>进一步提高API定义 ...

  6. 凸包Graham Scan算法实现

    凸包算法实现点集合中搜索凸包顶点的功能,可以处理共线情况,可以输出共线点也可以不输出而只输出凸包顶点.经典的Graham Scan算法,点排序使用极角排序方式,并对共线情况做特殊处理.一般算法是将共线 ...

  7. Pair Project: Elevator Scheduler [电梯调度算法的实现和测试] --11061188刘强

    结对编程总结 队员:刘强(11061188) 林谋武(11061169) 结对编程: 结对编程的优点: 1.  两个人合作,相比于一个人自己奋斗而言,更能激发自己的潜能:我们在合作过程中,互相学习,互 ...

  8. Pair Project: Elevator Scheduler [电梯调度算法的实现和测试]

    作业提交时间:10月9日上课前. Design and implement an Elevator Scheduler to aim for both correctness and performa ...

  9. Pair Project: Elevator Scheduler [电梯调度算法的实现和测试]:思考题——谢勤政11061197

    第一题: 大楼里面的电梯一般分区域,或考虑思考题第四题的情况,运行楼层不一样的电梯属于不同的区域.然后在接口IRequest和IPassenger还有IElevator里面都加上int area这个属 ...

随机推荐

  1. 苹果新的编程语言 Swift 语言进阶(九)--方法和下标

    一.方法 方法是与特定类型相关的函数.与属性一样,方法也包括实例方法和类型方法. 类.结构.枚举都能定义实例方法,用来封装或实现给定类型的一个实例相关的功能或特定任务. 类.结构.枚举也能定义与类型本 ...

  2. myBatis源码学习之SqlSession

    在上一篇文章中SqlSessionFactory介绍了生产SqlSession的工厂,SqlSession是一个接口其具体实现类为DefaultSqlSession,SqlSession接口主要定义了 ...

  3. 提高HBase写性能

    以下为使用hbase一段时间的三个思考,由于在内存充足的情况下hbase能提供比较满意的读性能,因此写性能是思考的重点.希望读者提出不同意见讨论 1 autoflush=false的影响 无论是官方还 ...

  4. MATLAB三点确定圆

    function [circleCenter,radius] = ThreePointCircle(obj,x,y,z) A=[x(1)-y(1),x(2)-y(2);z(1)-y(1),z(2)-y ...

  5. PHP单元测试使用

    单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证.对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类, ...

  6. html5中的网页结构

    一.html5中的大纲 在html5中,使用各种结构元素所描述出来的整个网页的层次结构,就是该网页的大纲.因此在组织这份大纲的时候,不能使用div元素,因为div元素只能当做容器,用在需要对网页中某个 ...

  7. 用 Javascript 实现的“Dual listbox”(双向选择器)

    这是我用 Javascript 制作的"Dual listbox"(双向选择器)的一个应用示例,是从我的代码中抠出来的.在网页编程中经常会用到. 也许我的实现太烦琐了,希望大家有更 ...

  8. IDEA 下新建 Hibernate 项目

    Hibernate 概述 什么是 Hibernate 一个 Java 领域的持久化框架 一个 Java 领域的ORM 框架 什么是持久化 持久化是指把对象永久保存到数据库中 持久化包括和数据库相关的各 ...

  9. 2013-8:SDCE大会笔记

    百度移动云三大开发框架:Clouda,SiteApp,AppBuilder MBaaS解决高性能Server很难的问题 百度开放云的区域运营服务于创业者 Pinterest架构变迁: 互联网就是把线下 ...

  10. 关于django migrations的使用

    django 1.8之后推出的migrations机制使django的数据模式管理更方便容易,现在简单谈谈他的机制和一些问题的解决方法: 1.谈谈机制:migrations机制有两个指令,第一个是ma ...