跳转到内容

练习

目标位置:kernel/src/syscall/process.rs

pub fn sys_waitpid(pid: isize, exit_code_ptr: *mut i32) -> isize {
    todo!("Lab 5: implement sys_waitpid")
}
A. 判定是否有匹配子进程
   无 -> return -1
B. 判定匹配子进程是否有 Zombie
   无 -> return -2
C. 回收 Zombie 并写回退出码
   remove(child) -> *translated_refmut(...) = exit_code -> return child_pid
  1. pid == -1:等待任意子进程;
  2. pid > 0:等待指定子进程;
  3. 无匹配子进程返回 -1
  4. 有匹配但未 Zombie 返回 -2
  5. 回收成功返回子 pid,并写回退出码。

目标位置:kernel/src/task/manager.rs

pub fn stride_fetch(&mut self) -> Option<Arc<TaskControlBlock>> {
    None
}

原先我们实现的调度算法十分简单. 现在我们要为我们的 OS 实现一种带优先级的调度算法:stride 调度算法.

算法描述如下:

  1. 为每个进程设置一个当前 stride,表示该进程当前已经运行的“长度”. 另外设置其对应的 pass 值 (只与进程的优先权有关系),表示对应进程在调度后,stride 需要进行的累加值.
  2. 每次需要调度时,从当前 runnable 态的进程中选择 stride 最小的进程调度. 对于获得调度的进程 P,将对应的 stride 加上其对应的步长 pass.
  3. 一个时间片后,回到上一步骤,重新调度当前 stride 最小的进程.

为了实现对于 stride 的比较,你可能需要实现 PartialOrd 方法. 当然,直接比较也是可行的,这会更容易实现.

stride_fetch 需要找出 stride 最小的任务索引,取出任务并 step 更新 stride 值.