0%

Axsl666-2023秋季OS训练营第二阶段总结

首先感谢learningOS社区的所有贡献者。前几次训练营因为错过报名时间而未能参加,终于在2023秋季参与到了本次训练营活动。

实验一内容总结

多任务系统的简单实现

  • 扩展 TaskControlBlock
    • start_time
    • started
    • syscall_times
  • 设计 TaskManager 的公共接口
    • add_syscall_times
    • get_current_task_info
  • 在相应函数中更新 TCB 数据, 记录开始时间:
    • run_first_task
    • run_next_task
  • 在系统调用处理函数中调用 add_syscall_times 更新 TCB 中的记录
  • 完成 sys_task_info 系统调用
    • 主要是调用 get_current_task_info 并返回 TaskInfo

实验二内容总结

系统开启虚拟地址空间

重写 sys_get_time 和 sys_task_info

  • 在内存管理中增加 translated_mut_ptr 函数,实现进程用户地址空间中的指针到可变引用的转换
  • 其余类似 ch3 中的操作

mmap 和 munmap 匿名映射

  • 内存管理接口
    • delete_frame_area
  • 任务管理接口
    • mmap:调用insert_framed_area增加映射区域
    • munmap:调用delete_frame_area删除映射区域
  • 系统调用的实现
    • 合法性检验
    • 调用任务管理接口 mmap 和 munmap

实验三内容总结

实现进程管理相关系统调用

实现系统调用 spawn

  • 扩展 Task 公共接口
    • spawn
      • MemorySet::from_elf 新建地址空间,用户栈,程序入口点
      • 分配 pid 与内核栈
      • 建立 TCB
      • 加入父进程的子进程链表
      • 准备 TrapContext
      • 返回新子进程的TCB
  • 完成系统调用功能
    • sys_spawn

实现 stride 调度算法

  • 扩展 TCB
    • stride
    • priority
  • 扩展 Task 公共接口
    • set_priority
  • 修改 TaskManager 调度算法
    • fetch 修改为 stride 调度算法
  • 完成系统调用功能
    • sys_set_priority 调用 set_priority

实验四内容总结

实现几个文件系统相关系统调用

sys_linkat

  • 给 File trait 增加 fstat 接口
  • 扩展 efs 中 DiskInode 接口
    • get_inode_id: get_disk_inode_pos的逆过程
  • 在 vfs 中 Inode 增加接口
    • create_link
      • 新建目录项,(new_name, old_inode_id)
  • 完成系统调用 sys_linkat

sys_unlinkat

  • 给 File trait 增加 fstat 接口
  • 扩展 efs 中 DiskInode 接口
    • get_inode_id: get_disk_inode_pos的逆过程
  • 在 vfs 中 Inode 增加接口
    • delete_link
      • 遍历目录下所有目录项,找到与对应文件名相同的inode
      • 删除(清空)对应目录项
  • 完成系统调用 sys_unlinkat

sys_stat

  • 给 File trait 增加 fstat 接口
  • 扩展 efs 中 DiskInode 接口
    • get_inode_id: get_disk_inode_pos的逆过程
  • 在 vfs 中 Inode 增加接口
    • inode_id: 实现获取自身 inode id
    • isdir:判读是 inode 否为目录
    • linknum: 获取 root inode 下的某一个 inode id 对应的硬链接数量
  • 完成系统调用 sys_stat

实验五内容总结

本节主要几种同步原语与及其内核实现。

  • 加入死锁检测机制,实现银行家算法。
  • 扩展 PCB 和 TCB
    • 可利用资源向量 分配矩阵 需求矩阵
  • 数据更新
    • 相关系统调用时进行更新数据
  • 检测算法
    • 获取资源前进行死锁检测

Rustlings 练习总结

作为一名前端全栈开发者,刚开始学习Rust时,给我的感觉是没想象中的难度那么高,学起来还挺轻松…
然而,还是太年轻了,当我开始真的用起来之后,我发现,编译器成为了我前进的“恶梦”,它无时无刻不在教我做人,总是会在不经意间鞭挞我:“你,还很菜呢!”
所以,慢慢的,我开始放弃了保守的学习方式:“先将文档中的内容都大致学会,并记下来”,它让我一直停留在学习的舒适区,对学习Rust来说是很低效的。
Rustlings 其实就是一种很好的学习语言的方式,通过大量的几乎全覆盖式的Rust练习,在练习中不断遇到问题,并解决问题,就像打怪升级,心理上会不断的得到激励感,并不断的做下去。
通过Rustlings的110道题目的练习,其实也让我意识到了,自己以为的会使用Rust了,只是井底之蛙吧了。
练习的内容虽然都在文档中,只看文档学习的化,其实有时候会忽略这些知识的真实用途是什么,也就无法在实际项目中灵活的去使用了。
通过这段时间的练习,不一定让我在Rust的熟练成都有很大的提升,但是让我看到了一个Rust用法的大纲,这已经是一个很好的开始了。
希望在接下来的开发里,不断精进对Rust使用,当然,也不能只专注在语法本身,对操作系统本身知识的学习,会更重要,非常期待!


title: 2024春夏季开源操作系统训练营第一阶段总结报告-fengtdi
date: 2024-04-24 21:38:58
tags:
- author:zlh20040308


2024春夏季开源操作系统训练营第一阶段总结报告

前言

了解到这个训练营源自一次机缘巧合,刚学完操作系统的鄙人在b站刷课时无意刷到了前训练营的导学部分,并在评论区看到了up主留下的链接,点进去一看正好都是我很感兴趣的方向,而且学习资源和github页面都整理得很完善,于是果断加入了

Rust编程基础

初探

第一阶段的的主要任务是学习Rust语言,刚接触这门语言时候的第一感觉就是概念十分的多,有些概念甚至看起来匪夷所思,如生命周期标注,我十分不理解为什么Rust要这么设计,但是秉持着能跑就行的原则,还是硬着头皮和编译器作斗争

初窥门径

带着以上这些问题,我找到了斯坦福大学CS110L这门课,这门课并不是教学生如何进行Rust编程,而是希望通过Rust的视角反映出当今两种主流内存分配机制——手动管理(malloc&free)和垃圾回收(GC)——的不足,在其三节课就主要讨论了它们所会遇到的问题:

  • 手动管理(C/C++)

    C/C++的类型系统对内存所有权的表达能力是十分有限的,以至于工程师在设计函数接口时会显得十分臃肿,还必须附上大量的注释来告知调用者去担负起管理内存的责任,也就是说内存的管理取决于程序员的自觉性,这就导致程序员经常会忘记之前申请过释放内存,而且随着工程的不断壮大,这种错误会不可避免地发生

  • 垃圾回收(Java)

    Java通过某种类似于引用计数的方式来自动回收内存,但这种设计会带来性能上的损耗(回收机制过于复杂)

而Rust便带来了属于它的第三种方案,那就是所有权机制,在这种机制下,内存管理会变得高效且安全,这得益于它强大的静态检测机制,能够在编译时期就规避掉很多内存泄露的隐患

但这也是有代价的,既然要求在编译时期就能发现错误,那么Rust编译器就会要求程序员在编码时附带足够多的信息供它推断,也就出现了类似于生命周期标注这些语法

牛刀小试

在初步过完几轮Rust基础并完成了rustlings之后,便开始着手用Rust复刻了一些之前写过的小项目(当然,还有那令Rust新手望而生畏的链表),在这段过程中越发能感受到Rust的一些设计理念在影响着我的编码习惯,也引起了我对与内存安全的思考

总结

在经历了这一阶段的学习后,虽然我到现在也不认为我是一个Rust程序员,但是也多多少少能用Rust去进行一些有效编码了

十分感谢第一阶段中为我答疑解惑的老师和同学,同时更要感谢开源操作系统训练营提供了这么一个平台把大家聚集在了一起,我十分喜欢这里的学习氛围,大家一起交流着学习上的疑惑并提出自己的见解,这开源的理念也使我收益颇丰

第一阶段练习总结

作为一名Cpper,我之前对Rust的了解可以说是毫无了解,这次受到朋友的邀请,第一次接触Rust,刚开始以为就是像C一样的过程语言。然而,当我真正开始深入学习和使用Rust时,我发现它远比我预想的要有趣和富有挑战性。特别是在进行Rustlings练习的过程中,我收获颇丰,也深刻体会到了Rust语言的强大和魅力。

Rustlings是一个设计精良的Rust语言练习项目,通过一系列由简到难的练习题,帮助开发者逐步掌握Rust的语法和特性。在练习的过程中,我遇到了许多看似简单但实则深奥的问题,这些问题让我不断思考和探索,也让我对Rust有了更深入的理解。

通过Rustlings的练习,我只能感叹面向编译器编程的魅力。

此外,Rustlings的练习还让我认识到了自己在编程思维方面的不足总的来说,Rustlings练习是我学习Rust过程中的一个重要环节。它不仅让我掌握了Rust的基本语法和特性,还锻炼了我的编程思维和解决问题的能力。我相信,在未来的学习和工作中,我会继续利用Rustlings等资源来深化对Rust的理解和应用,并不断提升自己的编程水平。同时,我也期待在未来的项目中能够充分发挥Rust的优势,写出更加健壮、高效的程序。

感想与规划

自己想学Rust很久了,但一直没有行动起来。然后自己最近也在为1年之后找工作有点焦虑,想着找一些开源项目做一做,自己也对os比较感兴趣,然后搜了一下os开源训练,接着就了解到了这个开源操作系统训练营。

大概花了5 6天的时间把《rust权威指南》看完了,把rustlings刷完了,总体来说难度不高,主要涉及的是rust的语法,没有很深入的地方。最后10个rust写算法的练习算是对所学语法的巩固,这里面还是踩了不少所有权、生命周期的坑。题目本身不难,但要一次通过还是比较考验对rust的掌握程度的。我个人总结的rust比较核心、困难的知识点如下:

  • 所有权
  • 生命周期
  • 借用,共享借用与可变借用
  • 智能指针:Box, Rc, Arc, RefCell
  • trait与泛型
  • unsafe rust

接下来希望能继续巩固rust,用rust写一些项目。

  • 读《Programming Rust》这本书,加深对Rust的理解
  • 读《Effective Rust》,学会Rust的最佳实践
  • 看rust死灵书的课
  • 用Rust完成本次开源操作系统训练营,争取能达到项目实习的水平
  • 用Rust写一个toy编译器
  • 用Rust写一个toy数据库

2024开源操作系统训练营第一阶段总结-高泽文

本文是对OS训练营第一阶段的总结

1.
rust非常的严谨(通俗来说就是要求特别多)
对变量的限制更多了相比于cpp等语言 对于我写习惯cpp之后,太不适应了一开始 ,但是也一定会有好处,
代码的安全性是它最重要的一点,而且rust编译器的提示也非常的方便 减少运行的错误。
2.安全性完全吸引我了,独有的所有权系统和生命周期规则解决了cpp的空指针 null 内存泄漏等 其次还有多线程的安全保证 (鉴于自身水平所以对于多线程安全摘自文心一言的一段:Rust通过其强大的并发原语,如Arc、Mutex和Atomic类型等,为多线程编程提供了安全的支持。这些原语使得开发者能够在不使用垃圾回收的情况下,安全地共享和管理内存。同时,Rust的所有权系统也确保了同一时间只有一个线程能够访问某个数据,从而避免了竞态条件和其他并发问题。)
3.还有rust的社区是真的友好 我第一次了解到还可以在社区学习语言,圣经就是非常好的一个教程

###rust一阶段学习总结
rust和之前学过的java,python,c有很多的不同。尤其是rust的所有权的方面,让人又爱又恨。
写完了rustlings的110道题目让我对rust有了初步的认识,还需在后面的阶段中深入学习以及巩固。
一阶段存在的问题是效率还可以提升,花费了出乎意料的较长时间,后阶段要更加高效解决问题。
较好的方面是持之以恒,在繁忙的学业中抽出时间,是很困难也是很需要毅力的,希望自己后面可以保持。

2024 开源操作系统训练营第一阶段总结

学习过C,C++,Java,Python,再来学习Rust,可以明显感受到它的不同,本次总结我想聊一下Rust的一些特性

  • 所有权

这应该是Rust最特别的地方了,一般我们给函数传递参数,如果是值传递,只会把实参拷贝一份传入函数,而在Rust中不显式说明的情况下都是传递变量的所有权,相当于是把变量的值和原来的名称解绑,再和形参的名称绑定在一起,并且改变了生命周期。这种做法无疑会减少很多安全隐患,但是开发者使用时就需要多加考虑了。

  • 枚举类型

在很多语言中,枚举类型就是有类型规范的宏定义,但在Rust语言中,许多函数的设计都是围绕着枚举类型展开的,最重要的是Option和Result,它们在模式匹配和作函数的返回值中都十分有用,通过None和Err枚举就消除了exception和null的问题。除此之外,还可以让元组和结构体作为枚举,扩展了应用。

  • 智能指针

Rust的智能指针和C++的有很大的区别,原因在于Rust中的变量只能有一个可变引用或多个不可变引用,这使得许多在C++中很容易实现的操作在Rust中需要通过智能指针,Box就像是malloc出一片空间,rc,cell则是多个引用和可变性的工具,但实际操作中这样的限制非常多,运用起来感觉挺麻烦的。

除此之外,还有特征、宏定义、属性、生命周期、多线程、闭包、迭代器、泛型等可圈可点的特性,在此就不多说了。

感受

最后就说一下做题感受,一开始没有rust-analyzer的时候做的有点难受,因为不知道许多内置函数的参数列表和返回值类型,而所有权的转交又会导致报错,后来知道类型了稍微好一些,不过关于可变性的问题一直都不是太清楚。

开源rCore项目初识

  • time:about 2023/8~10

    最初接触操作系统的经历十分巧合,因为是刚从土木老哥转到cau的cs大类,刚入行的紧迫感鞭策我不断搜集信息。恰好本系某位大佬前辈(人称炸药哥)钟爱操作系统,已经不只一次向我们强烈安利此项目,但去年由于考研以及学(da)业(bai)繁(te)忙(bai),虽然报了名,但完全没做…..

    今年又到了开营的时间,同时经过半年多的摸爬滚打,对于自己今后发展方向也有了大致的轮廓,也算是借着rust的强大能力,帮我去理解RISC-V的原理,为今后科研打下基础!

    配置rust编译环境

  • time:2024/4/11-2024/4/12

    心累的一晚上,由于第一次接触github,第一次安装wsl2,没有实际上手过跑在Linux环境下的项目,rustling的配置遇到了超级多的问题。习惯root权限进行Linux操作,这个坏习惯给我带来了巨大的困难,例如vscode无法访问wsl内文件,以及git无法提交代码至仓库……
    多次修改权限无果后,最后决定全盘重新装(前前后后弄了3-4个小时),还好最后终于配置好了环境,终于可以开始和rust斗智斗勇了。

    基本变量和if类型(包括综合quiz练习)

  • time:2024/4/13

    心得体会

    初见rust,接触前几道题并没有太大难度,经历基本的rust环境编译后,最初的几道题做起来真的舒心不少。quiz1练习提供了一个基本的语法综合训练。目前感觉rust并没有传说中那么大的难度qwq。

    收获

    了解了if的使用方法,和c语言最大的不同就是变量不可修改(修改必须要mut),所有权以及的命名使用规则,理解起来还是比较容易的。

    基本数据类型和vec

  • time:2024/4/16

    心得体会

    最近课太多了,鸽了几天。不知道是,手生了还是变难了,总感觉难度陡增,尤其是vecs2,网上搜了一下都没太搞懂(后买翻答疑发现是后面的课程,我:“????”)

    收获

    发现基本数据类型和c还是有相似之处的,只是代码表达方式上要别扭很多,往往是,逻辑清楚,不知道怎么改。在vec的一系列题中,这种问题尤为明显。所有权类的题仔细思考后还是有思路的。

    所有权

  • time:2024/4/20

    心得体会+收获

    所有权类的题仔细思考后还是有思路的。最大的问题还是读代码的能力欠缺,面对“一大坨”代码无从下手,经历这一系列的作答,还是收获满满

    struct类型

  • time:2024/4/20

    心得体会

    难度骤增,这种类c的结构体真的很容易出现小毛病,对于我这种基础不牢的人来说真的是拉到了新的难度等级,每道题要花一些时间去想emmm,又到了快凌晨一点,睡!!

    收获

    基本了解了struct的命名使用规则,深一脚浅一脚往下走叭

    枚举类型,包,模块

  • time:2024/4/25

    心得体会

    好吧,这周课程依旧很多,又拖了好久,新知识吸收速度好慢,今天的枚举总体来说类似struct,学习应用起来并不难。模块主要在封装层面用途很大,就是改变量名字很捉急……

    收获

    了解枚举定义,以及如何创建成员,熟悉如何在不同模块中修改名称以及引入不同的库.

    哈希表创建,option枚举,error系列练习

  • time:2024/4/26

    心得体会

    哈希表提供了一个可以快速管理数据的方法,但是读代码好痛苦,太不熟悉了。option同昨天的枚举相似,做起来熟练很多。error的习题考察的好综合,经常改着改着就把整个代码弄乱了……遂ctrl^z重新来过(捂脸)

    收获

    了解哈希表以及option枚举类型如何使用,加深了对如何处理不同错误的理解,并了解如何修改(或许)

    泛型扩展,trait,生命周期,test练习,迭代器

  • time:2024/4/27

    心得体会

    重新见到泛型,做的也得心应手起来了。越来越感觉在严谨的rust中,泛型真算一个万金油,又能保证封装,还能调用方便,赞。trait反而更像一个接口(就是我做的什么别人也可以借用的感觉)。
    生命周期emmm,某个元素需不需要活,活多久,怎么活……都是其他语言没有的”独特”含义。虽然理解起来费劲,但是题目比较简单。test练习又是两眼一抹黑的翻资料去做,练习需要的广度比课程上要求的多得多。
    迭代器给了一个遍历元素的方法,但是迭代器是惰性的,使用前需要先调用。

    收获

    扩充了在方法中使用泛型的实例,了解trait如何在不同函数或结构体中实现,浅显的理解生命周期含义,知道test函数基本语法,迭代器如何声明与调用

    余下内容,Rc< T >,box等

  • time:2024/4/28

    心得体会

    后面的语法更趋向于数据某种数据结构,理解起来很容易,但运用很难。好在题目并不难,有的题哪怕不了解此类语法也能通过联系上下文做出来(虽然对于提升并没有什么帮助),不过鉴于此项目本质为写os,rust的深度学习就留在需要的时候了(手动狗头)

    收获

    了解box,Rc,Arc,等结构体的使用环境,了解多线程如何创建,了解宏的创建和使用,接触代码分析工具Clippy。以及如何实现数据结构