4exercise.rst 3.3 KB
Newer Older
deathwish5's avatar
deathwish5 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13
chapter5 练习
==============================================

- 本节难度: **一定比lab4简单** 

编程作业
---------------------------------------------

进程创建
+++++++++++++++++++++++++++++++++++++++++++++

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

deathwish5's avatar
deathwish5 已提交
14
spawn 系统调用定义( `标准spawn看这里 <https://man7.org/linux/man-pages/man3/posix_spawn.3.html>`_ ):
deathwish5's avatar
deathwish5 已提交
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51

- syscall ID: 400
- C 接口: ``int spawn(char *filename)`` 
- Rust 接口: ``fn spawn(file: *const u8) -> isize`` 
- 功能:相当于 fork + exec,新建子进程并执行目标程序。 
- 说明:成功返回子进程id,否则返回 -1。  
- 可能的错误: 
    - 无效的文件名。
    - 进程池满/内存不足等资源错误。  

实验要求
+++++++++++++++++++++++++++++++++++++++++++++
- 实现分支:ch5。
- 完成实验指导书中的内容,实现进程控制,可以运行 usershell。
- 实现自定义系统调用 spawn,并通过 并通过 `Rust测例 <https://github.com/DeathWish5/rCore_tutorial_tests>`_ 中chapter5对应的所有测例。

challenge: 支持多核。

实验检查
+++++++++++++++++++++++++++++++++++++++++++++

- 实验目录要求

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

- 检查

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

问答作业
--------------------------------------------

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

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

deathwish5's avatar
deathwish5 已提交
52
(3) fork 当年被设计并称道肯定是有其好处的。请使用 **带初始参数** 的 spawn 重写如下 fork 程序,然后描述 fork 有那些好处。注意:使用"伪代码"传达意思即可,spawn 接口可以自定义。可以写多个文件。
deathwish5's avatar
deathwish5 已提交
53 54 55 56 57 58 59 60 61 62 63 64 65
    .. code-block:: rust

        fn main() {
            let a  = get_a();
            if fork() == 0 {
                let b = get_b();
                println!("a + b = {}", a + b);
                exit(0);
            }
            println!("a = {}", a);
            0
        }

Y
Yifan Wu 已提交
66
4. 描述进程执行的几种状态,以及 fork/exec/wait/exit 对于状态的影响。
deathwish5's avatar
deathwish5 已提交
67 68 69 70 71 72 73

报告要求
------------------------------------------------------------

* 简单总结本次实验与上个实验相比你增加的东西。(控制在5行以内,不要贴代码)
* 完成问答问题
* (optional) 你对本次实验设计及难度的看法。