进程调度是操作系统管理多任务的重要机制,通过调度算法将 CPU 时间分配给不同的进程,从而保证系统的性能和响应能力。本文主要介绍了两种调度策略的实现:时间片轮转调度和基于优先级的调度。
时间片大小:设置时间片大小为 10
,定义如下:
#define CNT 10
时间片管理:在 kerneltrap
函数中,加入时间片计数逻辑。当当前运行进程的时间片用完时,调用 yield()
将 CPU 切换到下一个进程:
if (myproc() != 0 && myproc()->state == RUNNING) {
myproc()->counter--;
if (myproc()->counter == 0) {
myproc()->counter = CNT;
yield();
}
}
运行命令 $ myfork
后,多个进程开始交替运行:
时间片分配:所有进程初始时间片为 10
。
时间片递减:随着运行,时间片逐渐减少,当前时间片耗尽的进程会被挂起,切换到其他进程。
输出示例:
------------------------------------------------
pid = 16 runing, time slice = 10
pid = 17 runing, time slice = 10
pid = 18 runing, time slice = 5
pid = 19 runing, time slice = 5
------------------------------------------------
结果表明,不同进程之间可以公平地分享 CPU 时间片,进程在时间片用尽后被调度器挂起。
新增优先级字段:在进程结构中添加 priority
字段,数值越小优先级越高。
int priority; // 进程优先级
调度逻辑:修改调度器逻辑,通过遍历所有进程,优先选择优先级最高的可运行进程:
只有优先级满足条件的进程会被选中运行。
```c
for(temp = proc; temp < &proc[NPROC]; temp++) {
acquire(&temp->lock);
if(temp->state == RUNNABLE && temp->priority < priority) {
priority = temp->priority;
}
release(&temp->lock);
}
```
运行命令 $ myfork
后,进程根据优先级进行调度:
优先级分配:
pid = 11, priority = 15
pid = 12, priority = 15
pid = 13, priority = 5
pid = 14, priority = 5