练习
实现 sys_waitpid
Section titled “实现 sys_waitpid”目标位置:kernel/src/syscall/process.rs
pid == -1:等待任意子进程;pid > 0:等待指定子进程;- 无匹配子进程返回
-1; - 有匹配但未 Zombie 返回
-2; - 回收成功返回子 pid,并写回退出码。
实现 stride 调度算法
Section titled “实现 stride 调度算法”目标位置:kernel/src/task/manager.rs
原先我们实现的调度算法十分简单. 现在我们要为我们的 OS 实现一种带优先级的调度算法:stride 调度算法.
算法描述如下:
- 为每个进程设置一个当前 stride,表示该进程当前已经运行的“长度”. 另外设置其对应的 pass 值 (只与进程的优先权有关系),表示对应进程在调度后,stride 需要进行的累加值.
- 每次需要调度时,从当前 runnable 态的进程中选择 stride 最小的进程调度. 对于获得调度的进程 P,将对应的 stride 加上其对应的步长 pass.
- 一个时间片后,回到上一步骤,重新调度当前 stride 最小的进程.
为了实现对于 stride 的比较,你可能需要实现 PartialOrd 方法. 当然,直接比较也是可行的,这会更容易实现.
stride_fetch 需要找出 stride 最小的任务索引,取出任务并 step 更新 stride 值.