基本信息
竞赛简介
全国大学生计算机系统能力大赛可以说是计算机专业除了ACM以外专业性最高的比赛之一了。内分多个赛道,如CPU设计(“龙芯杯”)、编译器设计(“毕昇杯”)、数据库设计以及操作系统设计。其中操作系统设计赛又分为内核实现和功能挑战两个赛道,我这一次参加的是功能赛道。
功能赛道的主要任务就是,从给定的265个赛题中选出一个赛题,并围绕此赛题做项目。项目周期为半年左右(其中3.28~6.07为初赛阶段,6.10~8.15为决赛阶段),并在最后有线下答辩以及代码现场检查验收。
团队
这是我在大二时参加的比赛。我作为队员,与两位高年级成员一起参加比赛,并且在最后取得了全国一等奖的成绩。(详情可见官网公示)
项目简介
详见我们的项目首页。我们的代码分别托管在多个仓库,仓库链接放在了首页的最后一部分。
简单来讲,我们的项目就是实现一个 “将线程调度的权限从内核暴露给用户态,从而使得用户态可以实现各种各样的调度算法并做出调度决策” 的用户态调度框架。
EXT的用户态部分是我们初赛成果,COS的内核态+用户态是我们决赛成果。
我的工作
大致可以分为调研—代码—展示这三个方面的工作。
调研
由于当时两位学长都在实习,我是三个人中时间最充足的一个,所以我负责的调研工作应该是三个人中最多的。
我们项目主要调研了Google的ghOSt和Meta的EXT这两个开源的用户态调度框架。以下是我调研过程中的相关笔记:
ghOSt-userspace 梳理调度流程、进程通信等
ghOSt-kernel 主要是探究了各类消息的发送时机,特别是抢占消息
EXT-userland 主要研究了下eBPF程序以及userland示例
EXT-kernel 记录了我对EXT内核的所有探究,如消息发送、任务调度、eBPF实现等,以及各种debug过程
代码
EXT的用户态部分是我们初赛成果,COS的内核态+用户态是我们决赛成果。
初赛
EXT在内核中新增一个调度类,就类似常用的CFS调度类。该调度类定义了一系列最终由用户在用户态实现的eBPF钩子,并且将其挂载到Linux内核调度策略起作用的关键节点,从而达到用户态调度策略动态注入的效果。初赛阶段我们基于Meta的EXT内核开发了一个用户态调度框架。
初赛的时候有点找不到比赛方向,差点万策尽了,最后队长通过userland得到了方向灵感,但无奈还是只能在应用层中游泳,所以是在堆代码量刷KPI的阶段()
其中SJF、Shinjuku以及测试程序都由我负责,故而统共刷了约3000行KPI。
决赛
决赛我们发展了两个方向,一个是继续初赛的成果优化EXT内核,另一个是自己从零开发一个新的用户态调度框架COS。我与队友负责第一个方向,队长负责第二个方向。
决赛的前期我在痛苦地调优初赛的石山Shinjuku最后还没优化出什么,然后跟另一个队友一起完成了决赛的Shinjuku-eBPF(最后效果还是shit),所以到了中期我就转而去跟队长一起开发COS了。
不过这时候COS开发也大概进入了成熟阶段,所以对于COS内核,我并没有做什么代码工作,主要做的就是跟队长一起完成了消息的开发(我更多负责调研)以及一起debug。COS的用户态也由我跟队长共同开发,COS用户态代码量各写了一半。
测试
测试部分差不多初赛和决赛都算是我全权负责。
我们最主要的负载还是参考ghOSt实现的I/O密集型场景RocksDB。我们的四个比较对象(CFS、COS、EXT、ghOSt)都使用了这个统一的负载进行测试。RocksDB负载大约有一千多行代码量,将它重写到COS和EXT也花了我不少时间。
展示
大概分为文档、PPT、演示视频、性能测试、开发记录这几个部分。我主要负责的是后三个部分。
文档
项目文档的文字部分由队长负责,图片部分由我负责。
环境配置教程和性能测试教程是我完成的。
PPT(链接非最终版)
PPT文案大多由队长负责,我仅对背景介绍以及PPT模板做了调整。
演示视频(链接非最终版)
录制和剪辑都由我完成。
性能测试
数据处理和图片都由我完成。
-
由我完成。