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

- 本节难度: **一定比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

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

实验要求
+++++++++++++++++++++++++++++++++++++++++++++
- 实现分支:ch5。
- 完成实验指导书中的内容,实现进程控制,可以运行 usershell。
deathwish5's avatar
deathwish5 已提交
29
- 实现自定义系统调用 spawn,并通过 `Rust测例 <https://github.com/DeathWish5/rCore_tutorial_tests>`_ 中chapter5对应的所有测例。
deathwish5's avatar
deathwish5 已提交
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51

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 接口可以自定义。可以写多个文件。
Y
Fix ex5  
Yifan Wu 已提交
53

deathwish5's avatar
deathwish5 已提交
54 55 56
    .. code-block:: rust

        fn main() {
Y
Fix ex5  
Yifan Wu 已提交
57
            let a = get_a();
deathwish5's avatar
deathwish5 已提交
58 59 60 61 62 63 64 65 66
            if fork() == 0 {
                let b = get_b();
                println!("a + b = {}", a + b);
                exit(0);
            }
            println!("a = {}", a);
            0
        }

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

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

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