用Java模拟实现进程调度算法

进程调度算法是在操作系统中用于管理和安排进程执行顺序的算法。有效的进程调度能够提高系统的响应时间和资源利用率。本文将介绍几种基本的进程调度算法,包括先来先服务(FCFS)、短作业优先(SJF)和轮转调度(RR),并以 Java 代码示例进行模拟实现。

进程调度算法简介

  1. **先来先服务(FCFS)**:

    • 最简单的调度算法。
    • 按照进程到达的顺序进行调度,相同的执行时间按顺序执行。
  2. **短作业优先(SJF)**:

    • 优先调度执行时间短的进程。
    • 有利于提高系统吞吐量,但可能导致较长作业的“饥饿”现象。
  3. **轮转调度(RR)**:

    • 为每个进程分配一个固定的时间片,所有进程轮流执行。
    • 适合时间共享系统,保证了每个进程都有机会执行。

流程图

我们可以用流程图来表示进程调度的基本流程,如下:

flowchart TD
    A[开始] --> B{选择调度算法}
    B -->|FCFS| C[执行FCFS调度]
    B -->|SJF| D[执行SJF调度]
    B -->|RR| E[执行RR调度]
    C --> F[结束]
    D --> F
    E --> F

Java实现

接下来,我们来看看如何用 Java 实现这些调度算法。

1. 先来先服务(FCFS)

import java.util.*;

class Process {
    int id; // 进程ID
    int burstTime; // 进程运行时间

    Process(int id, int burstTime) {
        this.id = id;
        this.burstTime = burstTime;
    }
}

class FCFS {
    List<Process> processes;

    FCFS(List<Process> processes) {
        this.processes = processes;
    }

    void schedule() {
        int waitTime = 0;
        int totalWaitTime = 0;
        
        System.out.println("FCFS调度顺序:");
        for (Process process : processes) {
            System.out.println("Process ID: " + process.id + ", Wait Time: " + waitTime);
            totalWaitTime += waitTime;
            waitTime += process.burstTime;
        }
        
        System.out.println("平均等待时间: " + (totalWaitTime / processes.size()));
    }
}

2. 短作业优先(SJF)

import java.util.*;

class SJF {
    List<Process> processes;

    SJF(List<Process> processes) {
        this.processes = processes;
        // 按照 burstTime 排序
        this.processes.sort(Comparator.comparingInt(p -> p.burstTime));
    }

    void schedule() {
        int waitTime = 0;
        int totalWaitTime = 0;

        System.out.println("SJF调度顺序:");
        for (Process process : processes) {
            System.out.println("Process ID: " + process.id + ", Wait Time: " + waitTime);
            totalWaitTime += waitTime;
            waitTime += process.burstTime;
        }

        System.out.println("平均等待时间: " + (totalWaitTime / processes.size()));
    }
}

3. 轮转调度(RR)

class RR {
    List<Process> processes;
    int timeQuantum;

    RR(List<Process> processes, int timeQuantum) {
        this.processes = processes;
        this.timeQuantum = timeQuantum;
    }

    void schedule() {
        Queue<Process> queue = new LinkedList<>(processes);
        int waitTime = 0;
        
        System.out.println("RR调度顺序:");
        while (!queue.isEmpty()) {
            Process process = queue.poll();
            int execTime = Math.min(process.burstTime, timeQuantum);
            waitTime += (queue.size() > 0) ? execTime : 0; // 只有队列非空时才增加等待时间
            if (process.burstTime > timeQuantum) {
                process.burstTime -= timeQuantum;
                queue.offer(process); // 重新进入队列
            } else {
                System.out.println("Process ID: " + process.id + ", Wait Time: " + waitTime);
            }
        }

        System.out.println("总等待时间: " + waitTime);
        System.out.println("平均等待时间: " + (waitTime / processes.size()));
    }
}

使用示例

public class Main {
    public static void main(String[] args) {
        List<Process> processes = new ArrayList<>();
        processes.add(new Process(1, 10));
        processes.add(new Process(2, 5));
        processes.add(new Process(3, 3));

        FCFS fcfs = new FCFS(processes);
        SJF sjf = new SJF(processes);
        RR rr = new RR(processes, 4);

        fcfs.schedule();
        sjf.schedule();
        rr.schedule();
    }
}

结论

本文介绍了三种基本的进程调度算法及其在 Java 中的实现。每种算法都有其特点和适用场景,选择适当的调度算法可以有效提升系统性能和响应速度。在实际应用中,操作系统通常会结合多种算法以满足不同的需求和条件。通过简单的代码实现,读者可以自己体验如何管理和调度进程,为深入理解操作系统打下基础。希望这篇文章能帮助你理解进程调度的基本概念和实现方式。