feat: 增加高响应比优先算法
This commit is contained in:
parent
eb1de7b3d1
commit
1556f62047
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
@ -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,
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue