From 1556f62047a30948c5a86939b53d9cd3b1d06892 Mon Sep 17 00:00:00 2001 From: ViperEkura <3081035982@qq.com> Date: Sun, 26 Apr 2026 17:39:10 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E9=AB=98=E5=93=8D?= =?UTF-8?q?=E5=BA=94=E6=AF=94=E4=BC=98=E5=85=88=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- experiment/README.md | 25 +++++++++++++- experiment/code/hrrn.py | 72 +++++++++++++++++++++++++++++++++++++++++ experiment/code/main.py | 2 ++ 3 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 experiment/code/hrrn.py diff --git a/experiment/README.md b/experiment/README.md index be77d48..d24c022 100644 --- a/experiment/README.md +++ b/experiment/README.md @@ -3,7 +3,7 @@ ## 实验目的 1. 理解进程调度的基本概念和原理 -2. 掌握 FCFS、SJF、RR、优先级调度、MLFQ 等算法 +2. 掌握 FCFS、SJF、RR、优先级调度、HRRN、MLFQ 等算法 3. 通过模拟实验比较各算法的性能指标 ## 实验环境 @@ -22,6 +22,7 @@ experiment/ ├── sjf.py # 短作业优先调度 (含 SRTF) ├── rr.py # 时间片轮转调度 ├── priority.py # 优先级调度 + ├── hrrn.py # 高响应比优先调度 └── mlfq.py # 多级反馈队列调度 ``` @@ -102,6 +103,28 @@ $$ \text{吞吐量} = \frac{n}{T_{\text{总}}} \quad \text{其中 } T_{\text{总}} = CT_{\text{max}} - AT_{\text{min}} $$ +### HRRN 响应比 + +$$ +R = \frac{\text{等待时间} + \text{服务时间}}{\text{服务时间}} = 1 + \frac{WT}{BT} +$$ + +**特点**: +- 非抢占式 +- 综合考虑等待时间和服务时间 +- 避免长作业饥饿(等待时间越长,响应比越高) + +## 算法对比 + +| 算法 | 类型 | 优点 | 缺点 | +|------|------|------|------| +| FCFS | 非抢占 | 简单、公平 | 平均等待时间长 | +| SJF | 非抢占/抢占 | 平均等待时间最优 | 长作业饥饿 | +| HRRN | 非抢占 | 避免长作业饥饿 | 开销较大 | +| RR | 抢占 | 响应时间短、公平 | 开销较大 | +| 优先级 | 抢占/非抢占 | 可控性强 | 低优先级饥饿 | +| MLFQ | 抢占 | 综合性能好 | 实现复杂 | + ## 运行方式 ```bash diff --git a/experiment/code/hrrn.py b/experiment/code/hrrn.py new file mode 100644 index 0000000..f583da5 --- /dev/null +++ b/experiment/code/hrrn.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python3 +""" +高响应比优先调度算法 (HRRN) +Highest Response Ratio Next +""" + +from typing import List, Dict + +from base import ( + Process, + ProcessScheduler, + generate_random_processes, + print_processes +) + + +class HRRNScheduler(ProcessScheduler): + """ + 高响应比优先调度 (Highest Response Ratio Next) + + 响应比 = (等待时间 + 服务时间) / 服务时间 + = 1 + 等待时间 / 服务时间 + + 特点: + - 非抢占式 + - 综合考虑了等待时间和服务时间 + - 避免长作业饥饿问题 + """ + + def calculate_response_ratio(self, p: Process, current_time: int) -> float: + """计算响应比""" + waiting_time = current_time - p.arrival_time + return 1 + (waiting_time / p.burst_time) if p.burst_time > 0 else float('inf') + + def schedule(self) -> Dict: + """HRRN 调度算法""" + processes = sorted(self.processes, key=lambda p: p.arrival_time) + ready_queue: List[Process] = [] + current_time = 0 + completed = 0 + + while completed < len(processes): + # 添加所有到达的进程 + for p in processes: + if p.arrival_time <= current_time and p not in ready_queue and p not in self.results: + ready_queue.append(p) + + if ready_queue: + # 计算每个进程的响应比,选择最高的 + ready_queue.sort( + key=lambda p: self.calculate_response_ratio(p, current_time), + reverse=True # 响应比高优先 + ) + p = ready_queue.pop(0) + + p.start_time = current_time + current_time += p.burst_time + self.calculate_metrics(p, current_time) + self.results.append(p) + completed += 1 + else: + current_time += 1 + + return self.print_results("HRRN (高响应比优先)") + + +if __name__ == "__main__": + processes = generate_random_processes(n=5, seed=42) + print_processes(processes, "测试数据") + + scheduler = HRRNScheduler(processes) + scheduler.schedule() diff --git a/experiment/code/main.py b/experiment/code/main.py index d5b2587..3e7864e 100644 --- a/experiment/code/main.py +++ b/experiment/code/main.py @@ -29,6 +29,7 @@ from sjf import SJFScheduler from rr import RoundRobinScheduler from priority import PriorityScheduler from mlfq import MLFQScheduler +from hrrn import HRRNScheduler # 预设演示数据 @@ -50,6 +51,7 @@ def get_algorithm_config() -> Dict: 'Priority': lambda p: PriorityScheduler(p, preemptive=False), 'RR': lambda p: RoundRobinScheduler(p, time_slice=4), 'MLFQ': lambda p: MLFQScheduler(p), + 'HRRN': HRRNScheduler, }