写在开头:
2022年10月份的时候和某d商量着明年玩一玩操作系统功能赛拿个一等奖,兜兜转转终于到了今年三月份,忙活了几天选题之后,终于决定选择基于CFS的用户态调度框架,我们当时一致认为这是可以让我们立于不败之地的一个题目–有2021年google的sosp期刊支撑、可以接触linux内核、需要用到eBPF技术…
虽然说,刚开始的时候指导老师隐隐约约坑了我们一下,但是随着比赛的逐步深入,最后还是找对了方向,终于是拿下了一等奖。
先放个我们队伍的仓库链接吧,如果有朋友想要了解有关用户态框架之类的知识,可以直接看链接了:https://gitlab.eduxiji.net/202318123111334/proj134-cfs-based-userspace-scheduler

关于我们的题目:Cos
Cos这个名字其实是我想的,全称是corner of the stage,意为大幕的一角。百年前爱因斯坦在评价德布罗意时说到:“他揭开了大幕的一角。”没错,我们也想要揭开操作系统这个大舞台的一角。虽然到后面cos的含义变了……

关于选题和选队友:
我认为打操作系统的功能赛,选题真的非常重要,一个好的题目甚至可以直接决定了最终能否拿到一等奖。那么一个好的题目,应该包含以下几个方面:

  1. 先进性和创新性:一个题目的先进性最直接的可以体现在最近两三年有相关领域有没有什么头部厂商或者顶级院校发表了高质量论文,或者有很多人在做这个事情
  2. 通俗易懂:决赛答辩的时候评委会比较关注参赛者能否用一句话概括题目以及所取得的成果,所以简洁的题目也相当重要
  3. 涉及的技术栈是否主流且具有难度:如果一个题目又要调研高质量论文或者几千几万行代码,又或者需要直接修改Linux内核这种巨物,又或者涉及到了比如说虚拟化、eBPF等高级知识,那么这个题目至少在技术层面来说值得去挑战也更加容易受到评委的青睐

我们队伍选择的题目就是一个典型的包含了以上三个特点的题目:需要读2021年的ghOSt(sosp)、一句话可以概括、需要修改Linux内核以及研读Google的ghOSt源码和Meta的EXT源码。

至于选队友吧,最好选择能够一直从初赛坚持到决赛的队友吧,笔者同校的其他队伍就有的人心里承受能力太弱,被指导老师喷走了和因为实习中途直接连队友都不理了的情况。如果打着打着,队里有人想当逃兵,我估计最难受的应该是队长了,愿天下没有逃兵。。。
我直到五月份之前都在互联网公司实习,我们队长也是七月二十几号之前都在字节实习,最终还是坚持下来了。所以,天下无难事,只怕有心人。

关于比赛当中遇到的困难:
一开始我们团队对于这个题目并没有一个明确的方向,校内指导老师(某李)丢给我们一篇ghOSt论文之后就不了了之,他的意思其实是想让我们优化ghOSt,当时也是天不怕地不怕的样子,觉得自己很能,以至于我们前一个月都一直在读ghOSt论文和分析ghOSt源码。大概到了四月中旬,团队里的人开始觉得再这么下去,一行代码都不写,估计初赛就死翘翘了,于是又跟某李沟通,某李让我们着手于Shinjuku的优化,Shinjuku是应用在ghOSt里的一个调度算法,于2019年发表于网络顶刊Nsdi。当时吧,印象里团队并没有一个团结一致的目标,虽然每天都坚持三个人晚上八点钟到教室一起自习研究题目,但是实际上都是去教室吹水摸鱼,到了十点十一点就溜溜球了。到了五一之后,这里说来惭愧,看了一个多月ghOSt,我们三个人除了队长,其他两个人因为环境的问题还没把ghOSt内核跑起来,原因是不想用繁重的虚拟机,这会占据大量的电脑机身内存,所以一直在研究用wsl2跑ghOSt内核,结果是虽然wsl2可以起内核,但是由于并不具备vmvare这类虚拟机的底层特性诸如NUMA节点等必备底层依赖并不好配置。于是,在五一当天三个人一起统一用vmvare把环境都跑起来了,而且配这个环境花了整整一个晚上……之后的几天由于还是不具备一个明确的目标,团队人心涣散,一度爆发出“放弃吧”之类的声音。

山重水复疑无路,柳暗花明又一村
整个五一假期本来干劲满满,后来由于缺乏直接的目标我们团队跟泄了气的气球似的,很瘪。但是过了几天之后,某李终于给我们指亮了前方的道路!我们经过了五一的调研发现,优化ghOSt或者优化Shinjuku这条路根本就行不通,如果可以优化那我们直接可以去发sosp或者nsdi了,但就凭三个本科生,真的很难,毕竟人家宇宙厂一个大团队干了几个月才干出来的工业级产品。于是,某李丢给了我们Meta的Ext,Ext和ghOSt一样也是一个用户态框架,只不过是基于eBPF技术,Ext具有一些基本的框架其本身并不完善,比如不具备基本的fifo调度算法。于是,我们研究了Ext并且最终确定了方向:向Ext的userland模型里增加sjf、mfq、cfs、Shinjuku等调度算法,把这个调度框架用起来,然后说成是我们的。

沿着这个方向,最终我们的Ext调度框架成型了,这个时候我们情绪非常激昂,觉得未来一片光明,截止初赛结束写了一百二十多页的文档,代码量快接近五千行(我承认有水代码的成分)。但是,初赛截止前最后一个周会却被夏老师痛批了一顿,我记得非常清楚,夏老师最后问了队长一个问题:“你就说你们这个东西,是能调度得更快吗?还是性能更高了?”当时啊,是直接把队长问得懵逼了哈哈,因为我们初赛定的目标就是把工作量堆上去,至于性能和测试报告这些等到决赛再仔细考虑。不过,有惊无险,终于最后以初赛全国第三名的好成绩进入了决赛。

乘胜追击:
整个决赛的过程就比较顺理成章了。
我们先是讨论了到底是继续优化Ext还是自己写一个小ghOSt,到最终确定两条路线并行前进,再到发现Ext shit的本质,最后到加班加点开发Cos(小ghOSt)。不过,我由于个人原因中途回家了十天,回来之后队友已经基本开发结束了……
开发Cos的过程也是相当有趣,因为是直接玩Linux内核,每一步都要很小心,本来每次编译调试的时间就要十几二十分钟,如果再因为随意编写代码导致错漏频出,那效率就太低了。这里应该要非常致谢我们队长,没有他我们真的没办法写出这么优美的内核代码。
Linux内核代码开发真的是一件很难的事情,不过开发的过程可以学习到很多东西,比如api(开玩笑),比如自建新文件类型,重写mmap钩子函数,linux内核裁剪(如果不裁剪内核而是编译一个完整的内核那平均编译调试时间得按小时计算,但是怎么裁剪又非常讲究)等等。决定以后有时间还是继续把linux各个模块总结出一些关键点,因为linux的设计真的很牛。

决赛现场:
到这其实就没什么好说的了哈哈,除了一些闻所未闻见所未见恬不知耻没有自知之明的趣事哈哈。决赛现场夏老师就是评委,我记得进教室答辩的时候夏老师和我们相视一笑,那种感觉谁懂啊哈哈哈。
今年功能赛多了一个现场查代码的环节,当时来了两个老登查我们的代码,那两个老登一边查,前面两个华科的同学还一直问我我们的项目是什么原理,哈哈还挺放松的。
虽然最后确实实现了保一争特的目标,但是没有想到特等奖是北京工商大学做的rust语言调试器,当是听到这个消息我和队长都是非常震撼而且懊恼,觉得没有理由如果发特等奖但不发给我们队伍。最后聊了一下又觉得,北京工商大学的rust debuger有可能可以直接使用了,以后打内核赛的同学都可以用那种程度,而且人家主页也说了修改内核,估计工作量也挺足,就是创新点我们不怎么服。行吧,无所谓了。

趣事:
五百行居然拿了一等奖……虽然没有嘲讽他们的意思,但是,毕竟,这。。好吧,其实五百行是我们团队对另一个队伍的戏称,只是单纯的调侃,没有瞧不起的意思,毕竟人家队伍都是保研✌
某d在校内第一次决赛答辩演练时在结尾说rcore是玩具操作系统,夏老师直接气急攻心差点当场暴毙,真的笑死我了md
某d在阐释Cos的全称(Center-Of-Os)时情绪非常激动,夏老师听了之后说:“你在解释这个cos的时候,谦卑一些,不然到时候评委老师觉得,这个小伙子怎么那么飘呢,感觉像喝了一点小酒(此处哄堂大笑)一样。”

感想:
我终于完整参加一次比赛了雷姆,以后大学毕业了也不至于说回顾四年像是啥也没干一样。长期坚持一件事的感觉太棒了,有点回到当时刚接触篮球那种坚持奋斗的感觉了吼吼。
总而言之这次比赛也算是对自己的一次磨练吧,比赛打完,该回来面对现实了……我恨秋招……

ps:在酒店双人房睡觉和某d聊天到深夜,又回到高中宿舍了hh