基于java的驱动臂调度算法

这篇博客展示了操作系统中磁盘调度的三种算法实现:先来先服务(FCFS)、最短寻找时间优先(SSFC)和电梯调度算法。通过Java代码详细解释了每种算法的逻辑,并提供了输入和输出示例,有助于理解这些算法的工作原理。
摘要由CSDN通过智能技术生成

以前操作系统的一份大作业,觉得写得还行(大佬勿喷),分享出来,互相帮助。

import java.util.*;

public class MyDisk {
    private Integer justNowTrack;                          //已过磁道数
    private Integer currentTrack;                          //当前所在磁道数
    private Integer[] disc;                                //请求访问磁道序列

    public MyDisk(Integer justNowTrack, Integer currentTrack, Integer[] disc) {
        this.justNowTrack = justNowTrack;
        this.currentTrack = currentTrack;
        this.disc = disc;
    }

    public void FCFS() {                                 //先来先服务
        System.out.print("FCFS:\t");
        for (int i = 0; i < this.disc.length; i++) {
            switchTo(disc[i]);
        }
        System.out.print("end\n");
    }

    public void SSFC() {                                 //最短寻找时间
        System.out.print("SSFC:\t");
        List<Integer> list = new ArrayList<Integer>(Arrays.asList(this.disc));
        Integer shorter = Integer.MAX_VALUE;
        Integer shorts = 0;                             //路径距离,可以代替花费时间
        while (!list.isEmpty()) {
            for (Integer i : list) {
                int abs = Math.abs(i - this.currentTrack);//目标位置与当前位置的距离
                if (abs < shorter) {
                    shorts = i;
                    shorter = abs;
                }
            }
            switchTo(shorts);                           //驱动臂切换到目标磁道
            list.remove(shorts);
            shorter = Integer.MAX_VALUE;
        }
        System.out.print("end\n");
    }

    public void lift() {                                     //电梯调度
        System.out.print("lift:\t");
        boolean flag = (this.currentTrack - this.justNowTrack) > 0;
        Set<Integer> setUp = new TreeSet<>((o1, o2) -> o1 - o2);
        Set<Integer> setDown = new TreeSet<>((o1, o2) -> o2 - o1);
        for (Integer i : this.disc) {
            if (i > this.currentTrack)
                setUp.add(i);
            else
                setDown.add(i);
        }
        if (flag) {
            liftRun(setUp, setDown);
        } else {
            liftRun(setDown, setUp);
        }
        System.out.print("end\n");
    }

    public void liftRun(Set<Integer> set1, Set<Integer> set2) {
        for (Integer i : set1) {
            switchTo(i);
        }
        for (Integer i : set2)
            switchTo(i);
    }

    public void switchTo(Integer i) {                        //切换到目标磁道
        justNowTrack = currentTrack;
        currentTrack = i;
        System.out.print(currentTrack + "->");
    }
}

执行代码

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入已访问磁道数和当前驱动臂所在磁道,以空格隔开");
        int justNowTruck = scanner.nextInt();
        int currentTruck = scanner.nextInt();
        System.out.println("请输入请求访问磁道序列个数");
        int n = scanner.nextInt();
        Integer [] disc = new Integer[n];
        System.out.println("请输入请求访问序列,以空格隔开");
        for (int i=0;i<disc.length;i++)
            disc[i]=scanner.nextInt();
        MyDisk myDisk1 = new MyDisk(justNowTruck, currentTruck, disc);
        myDisk1.FCFS();
        MyDisk myDisk2 = new MyDisk(justNowTruck, currentTruck, disc);
        myDisk2.SSFC();
        MyDisk myDisk3 = new MyDisk(justNowTruck, currentTruck, disc);
        myDisk3.lift();
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值