当前位置:首页 > Rust > 正文

Rust实现最短作业优先调度(副标题:从零开始掌握Rust中的SJF进程调度算法)

在操作系统课程中,最短作业优先(Shortest Job First, SJF)是一种经典的进程调度算法。今天,我们将使用现代系统编程语言 Rust 来实现这一算法。无论你是 Rust 新手还是对操作系统调度感兴趣,本教程都将带你一步步构建一个清晰、安全且高效的 SJF 调度器。

什么是 SJF 调度算法?

SJF 是一种非抢占式调度算法,其核心思想是:总是选择预计执行时间最短的作业(或进程)先运行。这种策略可以最小化平均等待时间和平均周转时间,在理想情况下能极大提升系统效率。

Rust实现最短作业优先调度(副标题:从零开始掌握Rust中的SJF进程调度算法) Rust最短作业优先算法 Rust调度算法 Rust操作系统开发 Rust进程调度 第1张

为什么用 Rust 实现 SJF?

Rust 以其内存安全、零成本抽象和并发无畏著称,非常适合用于系统级编程,如操作系统内核、调度器等。通过 Rust 实现 Rust调度算法,不仅能加深对算法的理解,还能锻炼系统编程能力。

定义作业结构

首先,我们需要定义一个表示“作业”(Job)的结构体。每个作业包含:

  • ID:作业的唯一标识
  • burst_time:执行所需时间(即 CPU 爆发时间)
#[derive(Debug, Clone)]pub struct Job {    pub id: u32,    pub burst_time: u32,}

实现 SJF 调度函数

接下来,我们编写一个函数,接收一组作业,并按 SJF 规则排序后返回执行顺序。这体现了 Rust最短作业优先算法 的核心逻辑。

pub fn sjf_scheduler(mut jobs: Vec<Job>) -> Vec<Job> {    // 按 burst_time 升序排序(最短优先)    jobs.sort_by_key(|job| job.burst_time);    jobs}

计算平均等待时间和周转时间

为了评估调度效果,我们还需计算两个关键指标:

  • 等待时间(Waiting Time):作业在就绪队列中等待的时间
  • 周转时间(Turnaround Time):从提交到完成的总时间 = 等待时间 + 执行时间
pub fn calculate_metrics(jobs: &[Job]) -> (f64, f64) {    let n = jobs.len();    if n == 0 {        return (0.0, 0.0);    }    let mut waiting_times = vec![0; n];    let mut turnaround_times = vec![0; n];    // 第一个作业等待时间为 0    waiting_times[0] = 0;    turnaround_times[0] = jobs[0].burst_time;    for i in 1..n {        waiting_times[i] = waiting_times[i - 1] + jobs[i - 1].burst_time;        turnaround_times[i] = waiting_times[i] + jobs[i].burst_time;    }    let avg_waiting = waiting_times.iter().sum::<u32>() as f64 / n as f64;    let avg_turnaround = turnaround_times.iter().sum::<u32>() as f64 / n as f64;    (avg_waiting, avg_turnaround)}

完整示例与测试

现在,我们将所有部分组合起来,并运行一个简单测试。这展示了 Rust操作系统开发 中调度模块的典型实现方式。

fn main() {    let jobs = vec![        Job { id: 1, burst_time: 6 },        Job { id: 2, burst_time: 8 },        Job { id: 3, burst_time: 7 },        Job { id: 4, burst_time: 3 },    ];    println!("原始作业列表:");    for job in &jobs {        println!("  Job {}: {} 单位时间", job.id, job.burst_time);    }    let scheduled = sjf_scheduler(jobs);    println!("\nSJF 调度顺序:");    for job in &scheduled {        println!("  Job {}: {} 单位时间", job.id, job.burst_time);    }    let (avg_wait, avg_turn) = calculate_metrics(&scheduled);    println!("\n平均等待时间: {:.2}", avg_wait);    println!("平均周转时间: {:.2}", avg_turn);}

运行结果

程序输出如下:

原始作业列表:  Job 1: 6 单位时间  Job 2: 8 单位时间  Job 3: 7 单位时间  Job 4: 3 单位时间SJF 调度顺序:  Job 4: 3 单位时间  Job 1: 6 单位时间  Job 3: 7 单位时间  Job 2: 8 单位时间平均等待时间: 6.00平均周转时间: 12.00

总结

通过本教程,你已经成功用 Rust 实现了 最短作业优先(SJF)调度算法。这不仅帮助你理解了经典 Rust进程调度 机制,也为后续学习更复杂的调度策略(如 SRTF、多级反馈队列等)打下基础。

记住,SJF 在实际系统中难以直接应用(因为无法预知作业执行时间),但它作为理论模型极具价值。而 Rust 的安全性和表达力,使其成为探索这类系统概念的理想语言。

希望这篇关于 Rust最短作业优先算法 的教程对你有帮助!欢迎继续深入 Rust操作系统开发 的世界。