0%

引言


9月的时候在Rust语言中文社区的微信公众号了解到了这个训练营,
当时想想正好可以获取一些操作系统的设计与实践的经验和感受感受Rust编程的实际运用,所以就报名了.

第一阶段概述


个人情况

  • 非科班
  • 大四备战考研ing
  • 有过一些C++Python的编程基础
  • 系统学习过linux的架构和原理
  • 了解过Rust的编程范式和语言特性(不过没怎么实际用过,只是简单的配过环境搓过些小玩意儿)

Rustling

说是100道题,不过实际上是80道题.
其中70道语言特性和语法相关的基础题目,而剩下的10道题都是算法相关的.

因为Rustling没啥平台依赖所有就直接在win本把仓库克隆下来然后cargo install&&rustling watch开干

语法基础题花了一个下午给整完,中途卡了两天然后又花了两天把剩下的这10道题也做了.不过有一说一最后几个算法题确实有那么点上强度的感觉了Xb

img.png

img_1.png

总结

唉唉,给我的感觉两类题目的难度曲线会稍微有点陡峭了,简单和困难的过渡不太平缓,中途如果没有Jetbrain RustRover的built-in linter(好用,推荐😋)可能还得多花些时间
img_2.png

个人感觉最难的几个部分有生命周期,借用和作用域

  1. 生命周期(Lifetimes):确保引用在其所指向的数据有效期内始终有效,防止悬空指针。虽说如此,但是实际上没有了'a和IDE的检查马上就歇菜了Xb.
  2. 借用(Borrowing):允许临时使用数据而不转移所有权,提高代码的灵活性和安全性。这个借用和cpp的借用机制类似,不过在rust中 borrowing 的时候会自动释放,不用像cpp那样手动释放,挺好.
  3. 作用域(Scopes):定义变量和引用的可见性和生命周期,确保资源在不再需要时被及时释放。最后我的理解感觉实际上也就是{}的范围.

不过难归难,实际上rust里面挺多编程范式确实体验蛮不错的,我挺喜欢模式匹配,建造者模式,鼓励链式调用(手动点赞).

最后在榜上捞了个Rank 39.

img_3.png

推荐阅读

  1. Rust官方文档 - Rust的官方文档是最权威的学习资源之一,提供了详尽的语言特性和标准库介绍,适合所有级别的学习者。

  2. Rust精选 - 提供了一系列聚焦于学习Rust的网络资源,包括但不限于使用Rust处理信号的文章,这些资源对于希望深入了解特定主题的学习者非常有帮助。

  3. 《Rust 程序设计》 - 一本全面介绍Rust编程的书籍,适合希望系统学习Rust的新手。

  4. 《Rust 权威指南》 - 这本书深入讲解了Rust的核心概念和高级特性,适合已经有一定Rust基础的学习者。

  5. 《Rust 实战》 - 通过实战项目帮助读者掌握Rust编程的实际应用,适合希望通过实践加深理解的学习者。

  6. 《深入理解 rust 并发编程》 - 针对Rust的并发编程特性进行了详细的讲解,适合对并发编程感兴趣的开发者。

  7. 《Command-Line Rust》 - 专注于使用Rust开发命令行应用程序,适合对此类应用感兴趣的学习者。

  8. 《Rust Atomics and Locks》 - 深入讲解了Rust中的原子操作和锁机制,适合希望深入了解并发控制的学习者。

  9. 《System Programing with Rust》 - 介绍了如何使用Rust进行系统级编程,适合希望探索这一领域的开发者。

  10. 《Rust 编程之道》 - 通过具体的例子和最佳实践,帮助读者更好地掌握Rust编程。

第一阶段:Rustlings

第一次接触rust,对于里面的借用和引用,智能指针,生命周期等概念接触起来还是有点难的。在第二阶段的rcore便体现出来了,在很多地方对于这些的理解不够,导致花了很多的时间。第一阶段的Rustlings的难度还是不大的,我通过rust圣经来学习rust。后面还是要多花时间对rust进行学习。

第二阶段:rcore

Lab 1

lab1的sys_task_info还是不难的,通过写这个对系统调用的理解更深了。

Lab 2

lab2重写sys_get_time和sys_task_info,主要是采用虚拟地址后怎样将其转化。sys_mmap可以调用insert_framed_area来进行。在这其中我遇到的问题就是怎么校验合法性,通过不断的调试也便通过了。munmap主要是来删除掉映射区域,也是要判断当前区域是否被映射。

Lab 3

lab3是实现sys_spawn和stride调度算法, 这个是比较简单的,更改了调度算法便完成了。

Lab 4

lab4实现了硬链接和获取文件信息。这个部分是我觉得最难的部分。因为对文件系统的了解不够,只有通过反复阅读实验指导书和rcore的代码来理解。理解了文件系统的不同层次后也便完成了。

Lab 5

lab5是实现死锁检测, 主要是理解死锁检测这个概念,我开始没能理解,导致想了很久都没有思路,最后通过反复看测试用例死锁检测的内容理解了。在写代码的时候对rust的借用不熟悉,导致了很多错误。最后修改后完成了死锁检测。

第一阶段总结

因为之前已经在学校里学习过Rust的内容,第一阶段更像是起到一个查缺补漏和复习的作用。通过完成Rustlings的100道练习题,对Rust生命周期、所有权机制、智能指针、移动语义等内容有了更深入的理解。

第二阶段总结

  • lab3: 实现syscall: sys_get_time(), sys_task_info()
  • lab4: 引入虚拟内存/分页机制,重新实现sys_get_time()和sys_task_info(), 实现mmap和munmap
  • lab5: 将task抽象为process进程,实现sys_spawn()和stride调度算法
  • lab6: 新增文件系统,可以将原来在内存中的数据持久化到硬盘上。 实现sys_linkat(), sys_unlinkat(), sys_stat()
  • lab8: 引入thread。实现死锁检测,实现sys_enable_deadlock_detect()
    通过完成5个操作系统的实验,对操作系统的基本原理有了更深入的理解。在实验过程中,我遇到了很多问题,比如在实验四中,我在实现文件系统时,由于对文件系统Inode/OSInode/DiskInode/File之间的关系和概念理解不够透彻,一开始写lab的时候确实是完全不知道该怎么做,也导致了一些错误。于是我认真阅读了实验手册,通过画图和总结,最终完成了lab。
    lab1-3个人认为是相对简单的,几乎每一个的pattern都是先去某个struct添加一个新的field,然后在impl中对这个新的field进行一些需要的操作。这其中还可能涉及用户态与内核态之间的数据传递,比如在lab1中的sys_task_info()函数就涉及到内核态数据到用户态数据之间的传递。
    总之,通过这次训练营,我对操作系统的原理有了更深入的理解,也对Rust的应用有了更多的实践经验。

第一阶段

我之前就做过rustlings了,前100道题还是比较容易的,但是在专业阶段开始之前再refresh一下知识挺好的。最后10道题我其实很喜欢,之前做rustlings 都是在非常零散的填空,最后十道题实现算法让我真正开始有了我可以用rust 做些什么的感觉(虽然写的时候也挺痛苦就是了,尤其是linked list)。现在回看其实有些地方可以用更好的方式实现,等放假了再去练一练!

第二阶段

在rcore的实验课中,我学到了很多OS相关的知识。每一章的实验难度循序渐进,其中ch6, ch4, ch8 是我认为最难的,也是学到了最多东西的部分。

这3周走来我收获良多,也理解了很多以前就知道,但是懵懵懂懂的知识。从开始的获取TaskInfo中和群友的激烈讨论,到理解计算机系统数据都是一串二进制数据。再到开始理解地址空间,学会实现跨页机制和申请/释放内存。再到实现进程的创建,公平的Stride调度算法。再到文件系统,实现了系统文件的数据以及硬链接和删除文件。再到实现了线程级别的死锁检测。现在回看我都理解我这么短时间内怎么学到这么多知识的。

说实话我觉得最重要的还是跟群友一起讨论,加深自己对知识的理解。如果是我自己一个人学的话可能刚开始就放弃了。而且,在追求技术的路上见到这么多志同道合的人也是非常开心,在讨论中也学到了很多超越课程本身的东西。

当然,训练营时间还是挺紧凑的,做完了实验题目并不代表我真正把所有知识都掌握了,我还需要自己花时间巩固吸收指导书的内容。希望有一天我能总结出一本自己的指导书,把原来指导书中晦涩难懂的部分以更简洁明了的方式写出来帮助未来训练营的同学们。

After the second stage of the 2024 autumn winter open source operating system training camp, I would like to share my experience and summary with you.

This is the twice time I participated in the training camp, and this time I mainly learned about the basic knowledge of operating systems, including the process of operating system development, the structure of operating systems, and the basic principles of operating systems.

In the past years, I have spent a lot in operating system for x86 boards, including assembly, multi-language, segmentation, paging and multitask, which covers the real mode and protected mode.

It was the training camp that made me touch the RISC-V64 architecture.

I love RustSBI, but it made me kind of confused. I cannot make sense of the base implementation of the system, although it may be all right to depend on it.

With RustSBI, I easily realised the TIMER interrupt. This makes OSDev much easy! In x86 board, we need to write the control words to the PIC/RTC peripheral.

We used Trampoline to implement the syscall, exception, interrupt and other traps. This is very smart and comfortable. And this is the only assemly code in the whole project.

I also had the problem to treat the paired-notions like: “task” and “thread”, “process” and “task”.

In general, I have had a better understanding of operating systems development, RISC-V64 architecture, Rust and QEmu Simulator.

In the future, I’d like to rewrite my MECOCOA project, which make architecture “x86” and “Risc-V64” harmonious.

Thank you. Thanks to teachers and the people who have helped me.

Dosconio.

2024AD Nov 10, Sun.

After the first stage of the 2024 autumn winter open source operating system training camp, I would like to share my experience and summary with you.

It was the training camp that made me touch the magic programming language – Rust.

In the stage, I learned the basic knowledge of Rust, and met a lot of like-minded students.

Before, besides assembly, I write the documents with only C series languages (C, C++ and C#). I was not able to imagine how the “memory-safety” would be. But after the touching the Rust, I found that the Rust is not only a simple language. Rust can check your code in compile time, considering the using for multi-thread, memory-leak, and the optimization in general.

Below are the impressive places that Rust has left me:

  • unsafe keyword: Like C#, Rust has a unsafe keyword, which is used to mark the code, which cannot be assured by the compiler. This enables us plug in the special code, solving the possible lack for the implementation of the current supply.

  • ownership and lifetime system: Rust has a very special ownership system, which is different from the C series language. It can help us to avoid the memory leak or multi-reference. In other languages, we may forget to consider the mechanism about variable usage.

  • trait: Rust has a very special trait system, which is similar to the interface in C#. It can make the code more flexible and reusable. We can avoid pure-virtual class in C++, which may import v-table making us uncomfortable.

  • default immutable: This encourages me to delare more variable when writing codes, which makes code more readable.

However, there are still a lot I need to learn. In fact, I have not mastered standard C and C++ yet. This let me have a weakness in computer programming – I cannot consider from all sides to output a great code.

In the future, I’d like to study the Embedded-development relatived knowledge of Rust.

Thank you. Thanks to teachers and the people who have helped me.

Dosconio.

2024AD Nov 10, Sun.

第一阶段总结

对Rust这门编程语言早有耳闻,在活动开始之前就学过一遍rust,不过因为用的不多也没有很熟练,第一阶段的Rust练习巩固了基础,我平时是写C/C++的,真正写起来的时候非常强烈的感受到Rust 的设计与C++之间的差异,Rust对安全的要求非常严格,还有就是这个编译器很强大,虽然过不了编译挺烦人的,但编译器又能教你改正错误,也算是Rust的一个魅力了

第二阶段总结

  • ch1~3

    在学习汇编语言的过程中,我深刻体会到了“切换上下文”的概念。通过阅读trap.s和switch.s的代码,我不仅学到了编程技巧,还对操作系统和计算机的深层次工作原理有了更为深刻的理解。

  • ch4

    地址空间的章节对我而言是一大挑战。尽管在理论学习中已经有所接触,但真正深入到代码层面时,我仍然感到些许迷茫。理解MapArea和MemorySet的过程颇费周折,最初我错误地将rCore视为单页表系统,导致对许多操作感到困惑。经过反复推敲和深入学习,我终于克服了这一障碍,这一部分的学习经历让我受益匪浅。

  • ch5 & ch8

    与第四章相比,第五章和第八章的编程题目难度有所降低。这两章引入了进程的概念,并为后续的并发章节做了良好的铺垫。我开始对之前觉得理所当然存在的进程和线程有了更深刻的理解。在Linux系统中,进程和线程只是共享程度不同的任务。相较于理论书籍,代码的直观性让我对这些概念有了更加清晰的认识。第八章中,我花费了一些时间来理解银行家算法,一旦掌握,编程题目便迎刃而解。

  • ch6

    这一章对我来说是整个学习阶段中难度最大的。在理论学习时,我对文件系统章节的理解不够深入,面对文档中逐步引入的抽象概念,我感到十分困惑。在反复阅读文档和代码后,我终于在微信训练营群友的帮助下完成了作业。我希望rCore在未来的讲解中能够更加细致地涵盖这一部分。

  • ch7

    很轻量的章节,为系统引入了管道,实现了进程间的通信,因为没有编程作业,就没上面的章节反复翻阅文档式的去理解各个细节

    感悟

    回顾这一阶段的学习,我感到非常充实。尽管在第六章的学习过程中遇到了不小的挑战,但这段经历对我的成长无疑是宝贵的。无论我能否在接下来的学习中继续坚持,这一阶段所学到的知识和技能都将对我产生长远的影响。

开篇想先说点废话

说实话真的挺感慨的,竟然真的顺利的做到了今天,竟然真的得到了500分。

我是一个小城市长大的孩子,虽然有幸出生于学历较高的家庭,但毕竟环境、观念等受限,我并没有像大城市的孩子一样有机会从小开始学习计算机。准确的说,我连电脑也几乎没有碰过,因为我家的电脑是对我设了密码的,而我的妈妈也比较反对我使用电子产品。

再加上年幼的我鼠目寸光,眼里只有考试成绩,小初高阶段我选择了在每一门不考试的科目,包括计算机课上,写物理数学作业。
2022年8月,我考入大学。因为性格等原因,我报的志愿全部都是工科专业。虽然我很恐惧计算机,认为自己的基础根本不配学,但作为工科专业里的热门专业,我仍然把它排在了志愿前列。

很不巧,我刚好是计算机专业的分数线,但刚好未录取。我去了其他的工科专业。

于是,我的大一,也依然保持着高中的习惯,电脑常年放在抽屉里,认为拿出来占地方。如果在学习那基本就是做数学物理题。

变化发生于我转专业进入计算机大类。其实也许也不算吧,我是网安专业的,在很多学校可能也不算计算机。选择的原因呢,一个是我学校这个专业保研率真的很高,另一个是它看起来没有计科那么需要优秀的代码编写能力。我的必修课程有408四门,有编译原理等计算机常见课程,却连java和python都没有正经学过。不过那都不重要。

转入计算机大类,我就顺理成章的进入了计算机大类的学生群。在和各种计算机类专业的优秀同学的相处中,我竟慢慢的发现我爱上了计算机。

我开始尝试自学,并想要跨专业考研。选好目标院校后,我进入考研群了解相关消息,并在群里看到了训练营的信息。

这就是我与训练营相遇的开端。

当然,那不是2024秋冬季训练营。是春夏季训练营。

2024春夏季训练营,败给了自卑与拖延

前面也提到了,我的计算机基础非常差,大二之前可以说是彻彻底底的零基础。大二刚转专业,又总抱着一种我大一学的c++比他们简单,又没学过好几门专业课的先修课,更加放纵着自己选择逃避。参加训练营时,又以自己年纪尚小、也没怎么学过(刚好是大二第二学期学,当时正在学)操作系统为由纵容自己拖延,直到时间不够为止。第一阶段内容不多,勉强完成。第二阶段,一题都没来得及做。
我的第一次挑战,就这样结束了。

2024秋冬季,我又来了

明年要开始复习考研初试,不会再有时间。我知道,这是我的最后一次机会了。说实话我自身实力并没强多少,但是没有退路的我选择了尽最大可能试一试。这一次,我希望我也可以顺利做到四阶段结束。

关于训练营本身,我的学习与解题过程

进入正题。

  • 第零章、ch1、ch2:
    主要是下载了一些东西,对二阶段有了一点初步的了解,学习了git的分支是什么【终于意识到二阶段仓库不是只有一个.md文件】

  • ch3:
    第一次在内核里写代码,说实话抵触心理强得可怕,依然是还没开始就开始暗示自己:我肯定写不出来的,我肯定看不懂的。
    感谢我没有退路,硬着头皮也得写。历时三天,终于在一个周一的早晨顺利通过。我的代码应该是有很多冗余处的,但我依然很兴奋。因为这真的是我第一次纯靠自己动脑子想、去尝试、去不断地修改bug,写出来的代码。
    以及第一次学会了git如何提交到一个分支上。

  • ch4:虚存!
    可能也不一定是五个lab里最难的一个,但却是我记忆最深的一个。虚存是我上学期操作系统学的最差的地方,多级页表的题我几乎做一道错一道,我很恐惧这里。看书,尝试,发现自己还是不理解,又看书,又尝试…草稿纸足足用了小半本,一个垃圾桶都差点没塞下hh。开始时最不能理解的是sys_get_time和sys_task_info的改写,我一点也想不明白他们哪里使用了地址。研究了好几天才意识到:ti和ts就是指向虚拟地址的指针,所以要转换成物理地址才能保存信息。
    以及,终于意识到最初提供的代码里传入的参数前加下划线是未被使用的意思,所以我不需要使用_ti等作为变量,我使用时可以直接删去下划线hhh

  • ch5、ch6、ch8:
    这几个因为本身纯底层理论的东西学的还行,逐渐也开始敢于尝试不妄自菲薄了,其实也没什么特别大的感悟。就是平均三天一章的边研读文档边尝试着写。
    闭包函数很有意思!但是我还是有点没太摸透,还需要今后再深入学习。
    ch6写sys_fstat时忘了虚存映射,一晚上都在报错time_out,睡前才突然意识到。以后写代码一定要更加注意细节。

感谢

真的非常非常非常感谢开源操作系统训练营能给我这么一次机会去参与学习一门新的语言以及内核相关知识。在这个过程中我不仅加深了对操作系统的理解,也逐渐培养起了自己解决问题,不轻言放弃的习惯。我第一次去将一个大的长期任务分隔成小任务,规划什么时候做完哪些,而不是全部拖延到截止日期再痛苦。也是第一次清晰的意识到:哇原来我也可以自己写出较长的代码!也很感谢群友们回答我的一个个过于基础导致对擅长计算机的人大概有点搞笑的问题。谢谢每一位训练营的创办者、负责人、讲师、助教、同学们。

补充

补充后的内容为2024.11.11二次提交pr时增加。为向给负责拉取pr的老师带来麻烦致歉,以及感慨这段意想不到的小插曲,增加了这一小段。感谢训练营,春夏季训练营是我第一次使用github,秋冬季训练营是我第一次提交pr。我学到了很多关于git的知识,也因为开始频繁打开github,在github上见到了很多好的项目与知识。我一直很好奇git是怎么工作的,企业中团队不同成员又是如何通过git来合作的,都在训练营使用git的过程中得到了解答。我第一次知道github的不同分支,也第一次知道了提pr是什么样的一个流程。也是第一次知道,git add . 真的不能随意使用,会将自动修改而不应该被修改的文件也修改。git很有意思也很有用,希望我也能有一天真的和一群人一起合作开发一个项目。再次感谢训练营,感谢训练营的老师们!

阶段一总结

初次认真学习rust每一个点

通过某些渠道,第一次了解到操作系统训练营,以前我也有用rust写过一些内容,但严格来说这是我的第一次正式学习rust。学习了很多的内容,了解到了
闭包,函数式编程,拓展了我的知识面,我第一次见到结构如此清晰的语言。

所有权的理解

众所周知,rust很贪。所有权是其中的灵魂。我认为,其本质就是“作茧自缚”,减少了许多东西,又为方便开发与调试添加了许多东西。这些设计减少了许
多的错误。所以简单的把所有权当作单线程的脑子就行,不要给它过多的行为。

错误处理中的Option Result

  • Option 用于表达可能存在或者不存在的值,它有两种可能的状态:Some(值) 和 None。当你不确定一个值是否存在时,可以使用 Option 来处理这种情
    况。

  • Result 则用于表达可能的操作成功或失败的结果,它有两种可能的状态:Ok(值) 和 Err(错误)。当你需要处理可能出现错误的情况时,可以使用 Result 来处理这种情况。

令人耳目一新的枚举类型 match

在 Rust 中,枚举类型是一种非常强大的数据结构,它可以用来表达一组相关的值。而使用 match 关键字可以让我们更加灵活地处理枚举类型的值,使得
代码更加清晰易懂。

match 表达式可以用来匹配枚举类型的不同变体,并根据不同的情况执行相应的代码逻辑。这种模式匹配的方式让代码的逻辑结构清晰明了,同时也增强了
代码的可读性和可维护性。

我的收获

通过学习 Rust,我收获了很多。不仅仅是语言本身的特性和语法,更重要的是 Rust 给我带来的编程思维方式的转变。在学习 Rust 的过程中,我更加注
重代码的安全性和可靠性,学会了如何利用 Rust 的各种特性来编写更加健壮的程序。

另外,通过与社区的交流和分享,我还了解到了很多其他开发者的经验和见解,这也让我受益匪浅。总的来说,学习 Rust 是一次非常有意义的经历,我相
信在将来的工作和项目中,我会继续运用 Rust 的知识和思想,为我的编程生涯注入新的活力和动力。

阶段二总结

在rcore的实验课程中,最让我印象深刻的就是虚拟地址部分,由于之前接触的操作系统全部都是nommu类型,直接访问物理地址的概念非常不容易被打破,并且ch4也是一个门槛,需要非常深入的理解rcore的整体代码框架,对虚拟地址的映射,软硬件协同操作,多级页表,地址空间的概念理解了很久,在不断查找资料,不断理解的情况下,才对虚拟地址的概念有了很浅显的理解,把任务完成。

在完成任务的过程中,其实rcore的整体框架非常完善,作业的部分也就是一些扩展功能,整体还是对rcore的实现的理解,在完成任务时,也是对已有实现进行模仿,理解整体框架,之后调用已有函数或自己根据数据结构实现函数,实现功能。

以及最后两个lab难度上升有点大,并且文章 中是对功能的描述居多(很多对于实验有用的点会被淹没在其中)虽然在边做lab边反复查看资料时可以发现,但是对于没有接触过的同学可能很多api看过就没印象了,在后续做lab中也找不到,所以可以适当增加一下强调或者提示,来减少难度增加坡度。

第一阶段:rustlings
1.去入门了一下rust,使用的是Rust语言圣经(Rust Course)
2.通过学习Rust语言圣经,了解了rust的基础语法,因为之前有过C++语言基础,所以学习较为容易
3.无GC,有强大的包管理工具,强大的安全性,以及独具特色的所有权机制
4.学习了rustlings的110道题目,虽然之后大多用不到就全忘记了,但是如果将来从事相关工作,很快就能重新捡起来
5.学习完成rustlings的110道题目之后就开始了之后的第二阶段学习

第二阶段:rCore-Tutorial
1.通过阅读rCore-Tutorial-Book学习到了很多关于操作系统的知识,之前也有过操作系统的学习,只不过都是理论上的,并没有相关实践上的学习,这也是我进入此训练营的原因,想通过训练营督促自己去学习到更多的关于操作系统的知识,以及拥有一个比较独特的项目,去助力就业
2.通过rCore的学习,完成了5个lab,可以说是学习比较辛苦的了,是rCore-Tutorial-Book和rCore-Camp-Guide-2024A两个教程同时跟进,学习完成rCore-Tutorial-Book之后就在相应章节的2024A中完成lab,
(1)在lab1中,我们的系统已经能够支持多个任务分时轮流运行,引入一个新的系统调用 sys_task_info 以获取当前任务的信息。
(2)在lab2中,在引入虚存之后重写内核的 sys_get_time 和 sys_task_info 函数,以及完成mmap 和 munmap 匿名映射两个系统调用函数。
(3)在lab3中,进程创建过程中,fork+execl两个函数高频率连续使用,感觉十分繁琐,我们引入一个spawn函数直接完成两个函数调用的结果,新建子进程,使其执行目标程序。还完成了stride 调度算法的实现,通过修改优先级,使步长不同,导致选取的优先级发生变化。
(4)在lab4中,引入硬链接的概念,让我们完成linkat和unlinkat和fstat三个系统调用,写这个的时候给我写破防了,当时看的代码抑郁了,但是其实没有那么难,很多代码其实和解决问题没有任何关联,这一个lab只能是非常难写,需要对源码有很深的理解,以及需要想到在文件存入fd_table的时候,想办法把文件名字也放入PCB中
(5)在lab5中,完成了死锁检测,这个我的完成过程也是比较抽象,写的时候很痛苦,一直往银行家算法上面想,后面发现need根本不知道啊,经过讨论之后才知道,原来只需要检测死锁就行,比较精妙的一点就是在lock阻塞或睡眠的过程中,就需要更新need数组,而且在死锁检测时候,需要让need+1而不是allocation,比较有意思吧。
3.其实完成了这个比较toy的玩具项目,感觉最后很多东西没有联系起来,如果要是最后把所有lab整合在一起,组合成一个可以展现自己从开始到现在的成果的话会更好一些,不过也是很感谢rCore这个教学,学到了很多操作系统的知识。