操作系统 java模拟磁盘调度

实验原理

模拟电梯调度算法,对磁盘调度。
磁盘是要供多个进程共享的存储设备,但一个磁盘每个时刻只能为一个进程服务。
当有进程在访问某个磁盘时,其他想访问该磁盘的进程必须等待,直到磁盘一次工作结束。
当有多个进程提出输入输出请求处于等待状态,可用电梯调度算法从若干个等待访问者中选择一个进程,让它访问磁盘。当存取臂仅需移到一个方向最远的所请求的柱面后,如果没有访问请求了,存取臂就改变方向。
假设磁盘有200个磁道,用C语言随机函数随机生成一个磁道请求序列(不少于15个)放入模拟的磁盘请求队列中,假定当前磁头在100号磁道上,并向磁道号增加的方向上移动。请给出按电梯调度算法进行磁盘调度时满足请求的次序,并计算出它们的平均寻道长度。
操作系统 java模拟磁盘调度_第1张图片

代码

package System.CiPan;

import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;

public class DiskSchedule {

    List<Integer> quest=new LinkedList<>();
    List<Integer> response=new LinkedList<>();
    private int sum=0;
    Comparator<Integer> comparator=new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            if(o1.intValue()>o2.intValue())
                return 1;
            else if(o1.intValue()==o2.intValue())
                return 0;
            else return -1;
        }
    };
    public void Schedule(){
        int CiskStart=100;
        Integer Queststart=quest.get(0);
        //System.out.println("排序后");
        quest.sort(comparator);
        int i;
        for (i=0;i<quest.size();i++) {
            if(quest.get(i).equals(Queststart)){
                break;
            }
        }
        if((quest.get(i))>=100){
            System.out.println("向右移动");
            int j;
            for (j=i;j<quest.size();j++){
                sum+=quest.get(j);
                response.add(quest.get(j));
            }
            sum+=quest.get(quest.size()-1)-quest.get(0);
            response.add(quest.get(0));
            for(j=1;j<i;j++){
                sum+=quest.get(j);
                response.add(quest.get(j));
            }
        }else{
            System.out.println("向左移动");
            int j;
            for (j=i;j>=0;j--){
                sum+=quest.get(j);
                response.add(quest.get(j));
            }
            sum+=quest.get(quest.size()-1)-quest.get(0);
            response.add(quest.get(quest.size()-1));
            for(j=quest.size()-2;j>i;j--){
                sum+=quest.get(j);
                response.add(quest.get(j));
            }
        }
        System.out.print("响应序列:");
        for (Integer ii:response){
            System.out.print(ii.intValue()+"  ");
        }
        System.out.println();
        System.out.println("平均寻道时间:"+sum/(double)quest.size());

    }

    public void init(){
        System.out.print("请求序列:");
        int max=-0x3f3f3f3f;
        int min=+0x3f3f3f3f;
        for(int i=0;i<20;i++){
            Integer integer=new Integer((int) (Math.random()*200));
            System.out.print(integer.toString()+" ");
            max=Math.max(integer,max);
            min=Math.min(integer,min);
            quest.add(integer);
        }
        System.out.println();
        System.out.println("最右边磁道:"+max+"  最左边磁道"+min);
        System.out.println();
    }

    public DiskSchedule(){
        init();
    }

    public static void main(String[] args) {
        DiskSchedule diskSchedule=new DiskSchedule();
        diskSchedule.Schedule();
    }
}

结果

操作系统 java模拟磁盘调度_第2张图片

你可能感兴趣的:(操作系统)