引言
我是在某 912 考研群里看到群友发了这次操作系统训练营的宣传图才进来的,事实证明,这是一次非常正确的决定,因为确实挺有趣的,一方面有了个在专业指导下实际上手折腾操作系统的机会,另一方面也确实见识到了挺多东西。
顺便,我还拉了几个朋友进来一起,可惜他们都比较忙,只是堪堪过了一阶段,在二阶段时正好与他们的考试周和大作业冲突了,于是在二阶段折戟沉沙,只能等下一次训练营时继承这次的存档继续打了(
感悟(正文)
操作系统训练营,那自然是以深入了解操作系统为目的的,若是要展示自己在这方面的感悟,那么我想,我可以通过使用伪代码来描述一个简单操作系统所做的事情,以此来反映我在这次训练营中所学到的。
1 | struct SimpleSYSTEM{ |
如上,这就是在我脑海中操作系统所做的事情,当然,这只是个泛泛而谈的框架,其中每个分支中所进行的操作都包含着值得深入学习的问题,比如 MANAGE_MEMORY 的情况下,我们可能需要进行进程资源的检查,以发现死锁/僵尸进程的情况等,学习这些内容就是参加训练营的目的;
日程
第一阶段:rust 入门 & rustling: https://github.com/LearningOS/rust-rustlings-2023-autumn-dbydd
由于我在此之前就自学过 rust,因此第一阶段对于我来说比较轻松,每天抽点时间刷一下 rustling 就能愉快的完成任务了,事实上我在第三天时就已经把 rustlings 刷完了。因此这个阶段实在是没什么好说的…
第二阶段:rcore 实操训练:https://github.com/LearningOS/2023a-rcore-dbydd
在我的印象中,rcore 是 ucore 的后辈,两个操作系统都是由清华大学的师生开发出来作为操作系统课的教学工具的;这不正巧,由于下定决心明年要冲 912,我在暑假的时候就先刷了一遍清华的网课,其中就包括了陈老师的操作系统课程,刷完后也瞄了两眼 ucore 的实验部分,由于脑中的知识很新,因此对于实验到还算是得心应手,反而大部分时间都是在与 rust 的语法做斗争.但是不巧的是也遇到了考试周,此外还要准备校内计算机社团的讲课工作与数学建模的备赛,就算是我也感到了分身乏术,进度也就这样被拖慢了下来,直到我写下这段文字时(11.1),也只是将实验推进到了 ch6,好在后续又有通知,这次的二阶段只要完成前三个实验就能进入三阶段,剩下的两个实验在三阶段补齐就行.这样一来或许我也有机会一命通关?整挺好.
- 二阶段开始-2023.10.25 做完了 ch3
由于是第一个实验,难度并不是很高,只需要给进程附加上一些信息记录,修改很少的代码就能完成。全过程思路如下:首先是要对进程做操作,因此应当去进程相关的代码下做修改。TaskInner 记录的是进程的运行时的程序部分,在这里添加自己的信息不是很合适,于是只剩下了一个可选项:在 TaskControlBlock 中塞东西。
- 2023.10.25-2023.10.31,做完了 ch4
ch4 主要是关于内存的管理,这部分可以说是一个操作系统的 1/2 个核心部分,在我看来最精简的操作系统,其实就是一个工作在内存上的输入输出机:输入当前的内存,输出特定长度的操作序列至某一片连续内存,并将当前 cpu 的 pc 指向哪个内存的首地址。当那一片连续内存执行完后就回到内核态(也就是继续由操作系统进行一次输出),如此反复…
总之,我们只要实现一个虚拟内存的申请和释放就可以了,这部分主要的难点就是可能会一次申请/释放一大片内存,从而需要在多个页表项上进行操作,不过实际实现起来只需要稍加思索就能写出很自然的代码。
- 2023.10.31-2023.11.1 做完了 ch5
ch5 主要是对进程的管理,自很久以前时分复用的概念被提出开始,任何操作系统都会支持多进程的操作,这甚至不是一件需要特意提及的事情。问题在于:我们要如何设计一个合理的进程系统,并不出差错且用得顺手?
实验部分有两个,一个是实现 spawn 方法,实验指导文档上给出了标准的 posix_spawn 方法的参考链接。一言以概括之:spawn 方法就是创建子进程用的,那么既然知道了要做什么,怎么做也就非常的显而易见了。
另一个任务是实现一个简单的进程调度算法:stride 算法,这个算法的想法很自然:给进程加上动态变化的权值,如果一个进程刚刚被执行过,那么它应当不会在短期内被连续执行,除非他的优先值很高,能让他进行连续的执行。
*未完待续