0%

2023开源操作系统训练营第二阶段总结报告-weedien

本次训练营对我最大的帮助在于,让我深入了解了操作系统底层的工作原理,通过教程的辅助和源码的阅读,我了解到了操作系统在进程线程管理、任务调度、内存分配、文件系统管理等方面的知识,对其实现的机制有了初步的认识。

从操作系统环境的搭建开始,我不断的给系统增加功能,引入进程、页表、地址空间、文件系统、同步机制,让操作系统能够运行一个个进程与线程,处理并发场景的任务,这是一场具有挑战却又精彩的旅程。

从进程或线程的创建和调度角度来说,我了解到了操作系统如何把一个elf格式的文件转换为一个进程,为它分配地址空间、栈空间等,以及如何在进程中执行任务,以及创建新的线程。

elf文件中定义了程序的内存布局,而操作系统将为它创建地址空间,给它分配进程号并将各个逻辑段存放在合适的位置,之后将进程添加到调度队列中,由CPU执行。其中很重要的数据结构为TrapContext,它记录了进程或者线程的上下文信息,在切换任务时发挥着巨大的作用。而其中又涉及到了内存的分配,当进程需要分配内存时,由页表完成从虚拟地址到物理地址的映射,整个映射的过程也是我学习过程的一个重难点,从分配物理页号到创建多级页表进行映射,以及如何使用虚拟地址向物理内存中写入数据,通过思考、绘图去展示整个过程,我慢慢的理解了其中的所以然,感受到了虚拟内存系统的精妙的哲思。

文件系统部分,我学习到了一个简易文件系统的实现,对于文件系统如何管理磁盘文件、以及如何在内核中使用文件有了一个新的认识。首先最令我费解的是描述文件的一系列数据结构,难点在于DiskINode和INode的关系和作用。经过一遍遍理解和梳理,我认识磁盘上的第一个分块将会用于存储整个磁盘的元信息,包括各类块的数量,之后的块分别记录索引位图、索引、数据位图和数据。索引中记录了一个文件的类型、大小以及在磁盘上的块号,通过索引可以找到文件所在的位置,对文件进行读写,这个索引即是DiskINode,而INode用于记录DiskINode的位置,该数据结构将暴露给内核,方便在内核中对文件进行操作。

在并发的学习过程中,我对锁的实现机制有了更多的了解。当某个线程去访问被上锁的临界区时,线程将会从任务调度队列中移入到等待队列,由此陷入等待(休眠),在锁释放的时候再从等待队列中唤醒线程,以达到同步的效果,从而避免数据不一致问题。也试着去实现了一个简单的死锁检测机制,但对该机制的原理理解的还不够,无法证明为何该算法能够实现死锁检测。

教程和练习引导着我的学习与进步,让我对操作系统有了更多的理解,但它们无法为我解释所有的问题,也无法让我看懂所有的代码。当前的学习虽说已告一段落,但整个项目中还有很多细节值得我去细细品味。那些我未阅读或未理解的源码,以及关于os的设计原理–为什么要这样设计,是否有更加合适的设计方式,这对于我来说都是未完成的任务,也是将来需要探索的。

最后,我想感谢训练营,能提供这么好的机会和资料来帮助我学习os,今后我也希望能有更多的机会去深入理解系统级别的设计与开发,加油!