操作系统|操作系统----磁盘调度(电梯调度算法)
一、实验内容
模拟电梯调度算法,实现对磁盘的调度。
二、实验目的
磁盘是一种高速、大量旋转型、可直接存取的存储设备。它作为计算机系统的辅助存储器,负担着繁重的输入输出任务,在多道程序设计系统中,往往同时会有若干个要求访问磁盘的输入输出请示等待处理。系统可采用一种策略,尽可能按最佳次序执行要求访问磁盘的诸输入输出请求,这就叫磁盘调度,使用的算法称磁盘调度算法。磁盘调度能降低为若干个输入输出请求服务所须的总时间,从而提高系统效率。本实验要求学生模拟设计一个磁盘调度程序,观察磁盘调度程序的动态运行过程。
三、实验原理
模拟电梯调度算法,对磁盘调度。
磁盘是要供多个进程共享的存储设备,但一个磁盘每个时刻只能为一个进程服务。
当有进程在访问某个磁盘时,其他想访问该磁盘的进程必须等待,直到磁盘一次工作结束。
当有多个进程提出输入输出请求处于等待状态,可用电梯调度算法从若干个等待访问者中选择一个进程,让它访问磁盘。当存取臂仅需移到一个方向最远的所请求的柱面后,如果没有访问请求了,存取臂就改变方向。
假设磁盘有200个磁道,用C语言随机函数随机生成一个磁道请求序列(不少于15个)放入模拟的磁盘请求队列中,假定当前磁头在100号磁道上,并向磁道号增加的方向上移动。请给出按电梯调度算法进行磁盘调度时满足请求的次序,并计算出它们的平均寻道长度。
代码如下:
package CODE.磁盘调度;
//电梯调度算法import sun.misc.Request;
import java.util.Random;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
//进程访问磁盘的磁道号
class Requst
{
private int Number;
//访问的磁道号public Requst(int number) {
Number = number;
}public int getNumber() {
return Number;
}
}class DiaoDu
{
private Requst[] requests;
//磁道请求数
private int start;
//起始磁道号
private int end;
//终止磁道号
private int num;
//磁道请求数
private int curCidao=100;
//当前磁头在100磁道public DiaoDu(int start, int end, int num) {
this.start = start;
this.end = end;
this.num = num;
}//设置请求的磁道号
public void setRandomRequests()
{
requests=new Requst[num];
Set reqSet=new TreeSet<>();
//Set不存放重复数据,TreeSet是有序存储
int n=num;
//先将随机磁道号放在TreeSet中
int randomReq=0;
while((n--)>0)
{
Random random=new Random();
randomReq=random.nextInt(end-start)+start;
//注意:因为访问的磁道号是随机生成,但是磁道号不能重复,所以需要加此循环
while(reqSet.contains(randomReq))
{
randomReq=random.nextInt(end-start)+start;
}
reqSet.add(randomReq);
//生成start-end之间的随机整数
System.out.println(randomReq);
}
int i=0;
//初始化每一个磁道请求
for(int tmp:reqSet)
{
requests[i]=new Requst(tmp);
i++;
}
}//电梯调度算法
// 假定当前磁头在100号磁道上,
// 并向磁道号增加的方向上移动。请给出按电梯调度算法进行磁盘调度时满足请求的次序,
// 并计算出它们的平均寻道长度
//返回平均寻道长度
public float realSCAN()
{
float sum=0;
TreeSet bigNum=new TreeSet<>();
//存放高于当前磁道号的磁道号
TreeSet smallNum=new TreeSet<>();
//存放低于当前磁道号的磁道号
for(int i=0;
i=curCidao)
{
bigNum.add(requests[i].getNumber());
}
//存放低于当前磁道号的磁道号
else
{
smallNum.add(requests[i].getNumber());
}
}
System.out.println("被访问的下一个磁道号移动距离(磁道数)");
//将要访问的磁道在当前位置内未距离最近者,也就是bigNum的下一个数字
for(int tmp:bigNum)
{
System.out.println(""+tmp+""+(tmp-curCidao));
sum=sum+(tmp-curCidao);
curCidao=tmp;
}
//自里向外地访问,直至再无更外的磁道需要访问,才将磁臂换向为子外向里,所以需要将smallNum逆序
for(int tmp:smallNum.descendingSet())
{
System.out.println(""+tmp+""+(curCidao-tmp));
sum=sum+(curCidao-tmp);
curCidao=tmp;
}
return sum/num;
}
}
public class SCAN {
private static Scanner scanner =new Scanner(System.in);
public static void main(String[] args) {
System.out.print("请输入起始磁道号:");
int start=scanner.nextInt();
System.out.print("请输入终止磁道号:");
int end=scanner.nextInt();
System.out.println("请输入磁盘请求序列数(当前磁头在100)");
int num=scanner.nextInt();
DiaoDu diaoDu=new DiaoDu(start,end,num);
diaoDu.setRandomRequests();
float avglen=diaoDu.realSCAN();
System.out.println("平均寻道长度:"+avglen);
}
}
【操作系统|操作系统----磁盘调度(电梯调度算法)】测试:
请输入起始磁道号:1
请输入终止磁道号:200
请输入磁盘请求序列数(当前磁头在100)
16
60
133
147
59
89
148
156
180
95
105
57
111
42
62
179
183
被访问的下一个磁道号移动距离(磁道数)
1055
1116
13322
14714
1481
1568
17923
1801
1833
9588
896
6227
602
591
572
4215
平均寻道长度:14.0
推荐阅读
- 操作系统|[译]从内部了解现代浏览器(1)
- 《将来的你,一定会感谢现在战胜烦恼的自己-------第四章/第十一节/用逆向思维解除烦恼》
- 问题是那些问题,解决全在自己----转逆境为喜悦
- docker镜像探索----dive工具
- Swift|Swift ----viewController 中addChildViewController
- 《可复制的领导力》读后感之一----学会倾听,提高效率
- 车祸66天(七)----事故认定
- 005|005 大树日课(区块链与大数据----大数据从幻灭走向复苏的希望)
- python面试题----基础(80题)
- Ubuntu|Ubuntu 16.04(LTS)---- 系统安装(1)