JAVA实现的优先数调度算法处理器调度程序

使用 GPT-4o Mini 回答,作者 GPT4oMini.app

问题:

使用JAVA语言设计一个按优先数调度算法实现处理器调度的程序。要求如下: (1) 假定系统有五个进程,每一个进程用一个进程控制块PCB来代表,进程控制块的格式为:进程名、指针、要求运行时间、优先数、状态。 其中,进程名——作为进程的标识,假设五个进程的进程名分别为P1,P2,P3,P4,P5。 指针——按优先数的大小把五个进程连成队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程中的指针为“0”。 要求运行时间——假设进程需要运行的单位时间数。 优先数——赋予进程的优先数,调度时总是选取优先数大的进程先执行。 状态——可假设有两种状态,“就绪”状态和“结束”状态。五个进程的初始状态都为“就绪”,用“R”表示,当一个进程运行结束后,它的状态为“结束”,用“E”表示。 (2) 在每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“优先数”和“要求运行时间”。 (3) 为了调度方便,把五个进程按给定的优先数从大到小连成队列。用一单元指出队首进程,用指针指出队列的连接情况。 (4) 处理器调度总是选队首进程运行。采用动态改变优先数的办法,进程每运行一次优先数就减“1”。由于本实验是模拟处理器调度,所以,对被选中的进程并不实际的启动运行,而是执行:优先数-1、要求运行时间-1来模拟进程的一次运行。 (5) 进程运行一次后,若要求运行时间0,则再将它加入队列(按优先数大小插入,且置队首标志);若要求运行时间=0,则把它的状态修改成“结束”(E),且退出队列。 (6) 若“就绪”状态的进程队列不为空,则重复上面(4)和(5)的步骤,直到所有进程都成为“结束”状态。 (7) 在所设计的程序中应有显示或打印语句,能显示或打印每次被选中进程的进程名以及运行一次后进程队列的变化。 (8) 为五个进程任意确定一组“优先数”和“要求运行时间”,启动所设计的处理器调度程序,显示或打印逐次被选中进程的进程名以及进程控制块的动态变化过程。

答案:

下面是一个使用Java语言实现的按优先数调度算法的处理器调度程序。该程序模拟了五个进程的调度过程,并按照要求实现了各项功能。

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

class PCB {
    String processName; // 进程名
    int requiredTime;   // 要求运行时间
    int priority;       // 优先数
    String state;       // 状态
    PCB next;          // 指向下一个进程的指针

    public PCB(String processName, int requiredTime, int priority) {
        this.processName = processName;
        this.requiredTime = requiredTime;
        this.priority = priority;
        this.state = "R"; // 初始状态为就绪
        this.next = null;
    }

    @Override
    public String toString() {
        return "PCB{" +
                "processName='" + processName + '\'' +
                ", requiredTime=" + requiredTime +
                ", priority=" + priority +
                ", state='" + state + '\'' +
                '}';
    }
}

public class Scheduler {
    private List<PCB> processList;

    public Scheduler() {
        processList = new ArrayList<>();
        // 初始化五个进程
        processList.add(new PCB("P1", 5, 3));
        processList.add(new PCB("P2", 3, 5));
        processList.add(new PCB("P3", 2, 4));
        processList.add(new PCB("P4", 4, 2));
        processList.add(new PCB("P5", 1, 1));
    }

    public void schedule() {
        while (true) {
            // 过滤出就绪状态的进程
            List<PCB> readyProcesses = new ArrayList<>();
            for (PCB pcb : processList) {
                if (pcb.state.equals("R")) {
                    readyProcesses.add(pcb);
                }
            }

            // 如果没有就绪状态的进程,结束调度
            if (readyProcesses.isEmpty()) {
                break;
            }

            // 按优先数从大到小排序
            Collections.sort(readyProcesses, new Comparator<PCB>() {
                @Override
                public int compare(PCB o1, PCB o2) {
                    return Integer.compare(o2.priority, o1.priority);
                }
            });

            // 选择队首进程
            PCB currentProcess = readyProcesses.get(0);
            System.out.println("被选中进程: " + currentProcess.processName);

            // 模拟运行一次
            currentProcess.requiredTime--;
            currentProcess.priority--;

            // 检查进程状态
            if (currentProcess.requiredTime == 0) {
                currentProcess.state = "E"; // 修改状态为结束
                System.out.println(currentProcess.processName + " 运行结束,状态变为 E");
            }

            // 打印当前进程状态
            printProcessList();

            // 重新插入队列
            if (currentProcess.state.equals("R")) {
                insertProcess(currentProcess);
            }
        }
    }

    private void insertProcess(PCB pcb) {
        // 将进程按优先数插入队列
        processList.remove(pcb);
        int i = 0;
        while (i < processList.size() && processList.get(i).priority > pcb.priority) {
            i++;
        }
        processList.add(i, pcb);
    }

    private void printProcessList() {
        System.out.println("当前进程队列:");
        for (PCB pcb : processList) {
            System.out.println(pcb);
        }
        System.out.println();
    }

    public static void main(String[] args) {
        Scheduler scheduler = new Scheduler();
        scheduler.schedule();
    }
}

代码说明:

  1. PCB类:表示进程控制块,包含进程名、要求运行时间、优先数、状态和指向下一个进程的指针。
  2. Scheduler类:负责调度进程,包含进程列表和调度逻辑。
  3. schedule方法:实现调度算法,选择优先数最高的进程进行模拟运行,并更新其状态和优先数。
  4. insertProcess方法:将进程按优先数重新插入队列。
  5. printProcessList方法:打印当前进程队列的状态。

运行结果:

运行该程序后,将会输出每次被选中进程的名称以及进程控制块的动态变化过程,直到所有进程都变为结束状态。