电梯调度算法
if (a != 0) {//若比较得到当前柱面号与下一个准备操作进程柱面号不同,则按照side方向寻找适合值
System.out.println("即将调度的进度不在此柱面号中,按照" + side + "方向寻找适配进度");
}
if (a == 0 && b != 0) {//若比较得到当前磁道号与下一个准备操作进程磁道号不同,则按照side方向寻找适合值
static int cylinder = 0;//定义静态值存放柱面位置
static int track = 0;//定义静态值存放磁道位置
static int record = 0;//定义静态值存放物理记录位置
static String side = "up";//定义静态值存放当前摆臂方向,初始为up
if (io.getCylinder() > cylinder) {
if (io.getTrack() > track) {
if (io.getRecord() > record) {
waitlist.add(io);
}
}
} else {
list.add(io);
}
}
toContinue();
}
public void firstRequest() {//初始化io表元素
p = i;
}
}
}
}
if (p == 0 && list.size() >= 1) {//若找到比当前值小的元素,进行list表中对应元素的删除并继续
io io = (io) list1.get(p);
int a, b, c;
a = io.getCylinder() - cylinder;
b = io.getTrack() - track;
io io = (io) waitlist.get(i);
System.out.println(io.getCourse() + " " + io.getCylinder() + " " + io.getTrack() + " " + io.getRecord());
}
int p = 0;//当前要访问的下一个记录在io表中的位置
System.out.println("即将调度的进度在此柱面号中,但是不在此磁道号中,按照" + side + "方向寻找适配进度");
}
if (a == 0 & b == 0 & c != 0) {//仅物理记录号变化时,按照side方向寻找适合值
System.out.println("即将调度的进度在此柱面号,磁道号中,但是不在此物理记录号中,按照" + side + "方向寻找适配进度");
Scanner sc = new Scanner(System.in);
System.out.println("输入随机数:");
//double i = Math.random();
//int i = 1;
//int i=0;
int i = sc.nextInt();
if (list.isEmpty() && waitlist.isEmpty()) {
if (io.getCylinder() < cylinder) {
if (io.getTrack() < track) {
if (io.getRecord() < record) {
waitlist.add(io);
}
}
} else {
list.add(io);
}
}
if ("down".equals(side)) {//摆臂方向为down时,当输入值大于当前操作数的值时,不加入list进行比较而是存放进waitlist中等待
for (int i = 0; i < list1.size(); i++) {//通过比较找到下一个准备操作的元素
io io = (io) list1.get(i);
if (fcylinder > io.getCylinder()) {
if (ftrack >io.getTrack()) {
if (frecord > io.getRecord()) {
int Track;//磁道号
int Record;//物理记录号
int Way;
}PROCESS;
PROCESS pcbs[PCB];
PROCESS a;//记录当前位置(柱面号、物理记录号)采用带头节点的循环链表存
源程序并附上注释
public class DiskDispatchArithmetic {
ds.Request();
}
}
}
public boolean isHave(int a, int b, int c) {
ArrayList<io> list1 = (ArrayList<io>) list.clone();
int flag = 0;
for (int i = 0; i < list.size(); i++) {
io.setCourse(sc.next());
io.setCylinder(sc.nextInt());
io.setTrack(sc.nextInt());
io.setRecord(sc.nextInt());
if ("up".equals(side)) {//摆臂方向为up时,当输入值小于当前操作数的值时,不加入list进行比较而是存放进waitlist中等待
io io = (io) list.get(i);
if (a == io.getCylinder() && b == io.getTrack() && c == io.getRecord()) {
flag = 1;
Байду номын сангаас} else {
flag = 0;
}
}
if (flag == 1) {
return true;
实验题目
模拟电梯调度算法,对磁盘进行移臂调度和旋转调度。
数据结构及其说明
const int PCB=100;//定义100个进程
int pcbs_num=0;//记录当前io表的进程个数
typedef struct process//请求io表
{
char pname[10];//进程名
int Cylinder;//柱面号
io io = (io) list2.get(i);
System.out.println(io.getCourse() + " " + io.getCylinder() + " " + io.getTrack() + " " + io.getRecord());
}
for (int i = 0; i < waitlist.size(); i++) {
System.out.println(course + " " + cylinder + " " + track + " " + record);
System.out.println("当前摆臂方向不变,为" + side);
list.remove(io);//删除当前所指向io表元素
} else if (list.isEmpty()) {//list表为空,则改变side指向为down
io.setRecord(sc.nextInt());
list.add(io);
}
public void Scheduling() {
ArrayList<io> list1 = (ArrayList<io>) list.clone();
ArrayList<io> list2 = (ArrayList<io>) list.clone();
int fcylinder = cylinder;//当前所在的柱面
int ftrack = track;//当前所在的磁道
int frecord = record;//当前所在的物理记录
if ("up".equals(side)) {//判断side方向为up时执行
ComparatorIo comparator = new ComparatorIo();
public static ArrayList<io> list = new ArrayList<io>();//io表
public static ArrayList<io> waitlist = new ArrayList<io>();//输入的值不符合时,临时存入此表
static String course = "Null";//定义静态值存放进程名
Collections.sort(list1, comparator);//调用从小到大排序进行排序
System.out.println("当前io表:");