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

扫描(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. UITableView设置单元格选中后只显示一个打勾的三种简单方法(仅供参考)

    1.第一种方法:先定位到最后一行,若选中最后一行直接退出,否则用递归改变上次选中的状态,重新设置本次选中的状态. - (UITableViewCell*)tableView:(UITableView* ...

  2. 如何在Eclipse CDT中编译含有多个main函数的项目

    最近在杭电ACM上做题,使用的C++工具是Eclipse,但是Eclipse CDT不能同时存在多个main函数的文件,上网也搜了很多资料,但是按他们的步骤来,还是不能实现自己想要的效果.经过一下午的 ...

  3. M1卡区块控制位详解

    M1卡区块控制位详解 Mifare 1S50/Mifare 1S70 每个扇区的密码和存取控制都是独立的,可以根据实际需要设定各自的密码及存取 控制.存取控制为4个字节,共32位,扇区中的每个块(包括 ...

  4. vncdotool - A command line VNC client

    作者:Daly 出处:http://www.cnblogs.com/daly 欢迎转载,也请保留这段声明.谢谢! 之前的一个项目需要需求希望可以通过命令行去远程执行一些Windows 系统操作. 所以 ...

  5. [ SSH框架 ] Hibernate框架学习之四(JPA)

    一.JPA概述以及它和Hibernate之间的关系 1.1.Hibernate 概述 JPA Java Persistence API,是EJB3规范中负责对象持久化的应用程序编程接口(ORM接口), ...

  6. 8 个最好的 jQuery 树形 Tree 插件

    由于其拥有庞大,实用的插件库,使得 jQuery 变得越来越流行.今天将介绍一些最好的 jQuery 树形视图插件,具有扩展和可折叠的树视图.这些都是轻量级的,灵活的 jQuery 插件,它将一个无序 ...

  7. 从JavaWeb危险字符过滤浅谈ESAPI使用

    事先声明:只是浅谈,我也之用了这个组件的一点点. 又到某重要XX时期(但愿此文给面临此需求的同仁有所帮助),某Web应用第一次面临安全加固要求,AppScan的安全测试报告还是很清爽的,内容全面,提示 ...

  8. Storyboard中ViewController加载的四种方式

    这个总结来自于<Programming iOS 10>一书: 1.storyboard的初始化ViewController,通过方法instantiateInitialViewContro ...

  9. sql server 多行数据合并成一列

    首先是源数据: ),cip.CheckIn_StartTime, )),cip.CheckIn_EndTime, )),cip.Rental_Price)) as content from Check ...

  10. Python的易错点

    一.列表和元组的区别 列表是允许修改的,而元组是不能修改的,元组只能实现拼接,形成一个新的元组.两者可以实现相互转换,列表转换成元组使用truple函数,而元组转换成列表使用list函数. 二.Raw ...