0%

rcore-camp-2025S-stage1&2-颜熙炆.md

前导

本博客作为开源操作系统训练营2025S的1、2阶段学习记录,简单总结了在这两个阶段的学习和coding。留作纪念,也希望能够帮助到大家。

Stage1

所有权系统

在传统的语言中,要么使用GC来管理内存(如Java),要么让程序员自己管理内存(如C/C++)。
前者需要运行在虚拟机上,并且性能较低。
后者则对程序员提出了更高的要求,能力越大责任越大。并且程序员总有可能会出错,导致内存管理的疏漏。
而 Rust 提出了第三种方法——所有权系统:

  • Rust 中的每一个值都有一个被称为其 所有者(owner)的变量。
  • 值在任一时刻有且只有一个所有者。
  • 当所有者(变量)离开作用域,这个值将被丢弃。
    并在此基础上,诞生了引用、借用等特性。
    因为之前在C++中了解过RAII,所以对 rust 的 drop 也是易于理解的。

生命周期

其实这也是所有权系统的一部分,Rust的每一个引用都有其生命周期,也就是引用保持有效的作用域。
在大多数情况下,生命周期是被隐含且编译器可自行推断的。但是有时候也需要程序员的帮助。
详见:生命周期

Result 相较于传统语言的 try-catch 和 throw 等异常处理的优势

1.强制处理异常,避免了隐式传播

在传统的异常处理模型中,例如使用 try-catch 或 throw,异常会在程序中隐式传播,直到被捕获或程序终止。这种隐式的传播方式可能导致错误不容易追踪,并且可能被程序中断或忽视。

Rust 的 Result 类型则采用显式的错误传递。函数返回 Result<T, E>,调用者必须显式地处理错误(要么通过 .unwrap()、.expect(),要么通过模式匹配)。这种显式要求迫使开发者在编写代码时考虑错误的处理,而不是依赖于隐式的错误传递。

2.加强类型安全

Rust 的 Result 类型是泛型的,其中包含了明确的错误类型。这意味着可以对不同的错误进行不同的处理和类型化错误。每个 Result 类型都指定了具体的错误类型 E,这为错误处理提供了更强的类型安全性。

在传统的异常处理模型中,异常通常是某个基类的实例(如 Java 中的 Exception),导致很难进行精确的错误类型处理。例如,catch (Exception) 会捕获所有类型的异常,这样做会隐藏不同异常之间的细节。

Rust 通过类型系统强制调用者处理不同类型的错误,提供了更强的错误隔离和控制。

3.性能优势

在传统的异常机制中,抛出和捕获异常通常会涉及到栈展开和内存分配等操作,这对性能有一定的负担。而 Rust 的 Result 类型不涉及这些高昂的操作,它仅仅是返回一个枚举类型,并且依赖于函数调用栈上的显式处理,避免了异常机制的额外开销。

Trait

虽然trait类似于其他语言的接口,但是trait比interface更加强大。
TODO:这部分留到之后单独出一篇博客讲讲。

Cargo & Crates.io

一个项目管理工具,不用像 C++ 项目那样,想要引用外部的项目的话,就需要git子模块。相当难用,并且还有一堆依赖和版本问题。
有些C++程序员甚至会为了解决这种麻烦,选择了更麻烦的自己重新造轮子。
而Rust提供了一个非常方便的包管理工具,可以非常容易且方便地进行包管理

Clippy

可以帮助Rust程序员写出更加符合规范的代码

Docs

可以根据注释 /// 自动生成文档,非常方便

Stage2

本次训练营只实现了必做题,选做题都还TODO呢,有空再做做。
具体的每个Lab可以看对应链接,此处仅简单地总结一下:

Lab1

lab1
lab1实现了 get_timetrace 。详细地阅读了Rcore的设计

Lab2

lab2
lab2实现了 mmapmumap ,并且重写了lab1的两个实现。主要还是实现一个虚拟地址到物理地址的转换,然后读懂Rcore的内存组织形式

Lab3

lab3
lab3实现了 spawnstride 调度算法。
spawn 虽然不等于 fork + exec ,但是也大差不差,在这里就各copy一点出来就行了。
stride 就在各个进程里添加 stridepriority 。然后把 Manager 用来维护队列的数据结构换成优先队列(也就是堆)即可。

Lab4

lab4
lab4实现了 linkatunlinkatfstat 等。阅读了ez-fs的实现。

Lab5

lab5

其他

本次参加开源操作系统训练营,算是第二次参加了。相比于2024A那次,匆忙地、囫囵吞枣式地、碎片地学习操作系统。
这次相对来说更加轻松一点,因为已经系统性地学习过了。并且代码能力也有了不小的提升,能够更加理解这些设计。
上一期训练营中就接触到了Rust编程语言,非常认同其哲学,并非常喜欢使用Rust。
相较于上次勉强看懂,勉强能写lab,这次明显更加游刃有余了。