chapter5练习

  • 本节难度: 一定比lab4简单

编程作业

进程创建

大家一定好奇过为啥进程创建要用 fork + execve 这么一个奇怪的系统调用,就不能直接搞一个新进程吗?思而不学则殆,我们就来试一试!这章的编程练习请大家实现一个完全 DIY 的系统调用 spawn,用以创建一个新进程。

spawn 系统调用定义( 标准spawn看这里 ):

  • syscall ID: 400

  • C 接口: int spawn(char *filename)

  • Rust 接口: fn spawn(file: *const u8) -> isize

  • 功能:相当于 fork + exec,新建子进程并执行目标程序。

  • 说明:成功返回子进程id,否则返回 -1。

  • 可能的错误:

    • 无效的文件名。

    • 进程池满/内存不足等资源错误。

实验要求

  • 实现分支:ch5。

  • 完成实验指导书中的内容,实现进程控制,可以运行 usershell。

  • 实现自定义系统调用 spawn,并通过 Rust测例 中chapter5对应的所有测例。

challenge: 支持多核。

实验检查

  • 实验目录要求

    目录要求不变(参考lab1目录或者示例代码目录结构)。同样在 os 目录下 make run 之后可以正确加载用户程序并执行。 加载的用户测例位置: ../user/build/bin

  • 检查

    可以正确 make run 执行,可以正确执行目标用户测例,并得到预期输出(详见测例注释)。

问答作业

  1. fork + exec 的一个比较大的问题是 fork 之后的内存页/文件等资源完全没有使用就废弃了,针对这一点,有什么改进策略?

  2. 其实使用了题(1)的策略之后,fork + exec 所带来的无效资源的问题已经基本被解决了,但是今年来 fork 还是在被不断的批判,那么到底是什么正在”杀死”fork?可以参考 论文注意:回答无明显错误就给满分,出这题只是想引发大家的思考,完全不要求看论文,球球了,别卷了。

  3. fork 当年被设计并称道肯定是有其好处的。请使用 带初始参数 的 spawn 重写如下 fork 程序,然后描述 fork 有那些好处。注意:使用”伪代码”传达意思即可,spawn 接口可以自定义。可以写多个文件。

    1. fn main() {
    2. let a = get_a();
    3. if fork() == 0 {
    4. let b = get_b();
    5. println!("a + b = {}", a + b);
    6. exit(0);
    7. }
    8. println!("a = {}", a);
    9. 0
    10. }
  4. 描述进程执行的几种状态,以及 fork/exec/wait/exit 对于状态的影响。

报告要求

  • 简单总结本次实验与上个实验相比你增加的东西。(控制在5行以内,不要贴代码)

  • 完成问答问题

  • (optional) 你对本次实验设计及难度的看法。