最近在自学 Berkerly CS162 的 OS 课程,第一份作业要求实现一个基于 Multi-level Feedback Queue 的调度器,其中一个测试用例每次运行的结果都不一样。问题是我虚拟机的配置是确定的,计算优先级的时刻(每 4 个 ticks 计算一次)和公式也是确定的,为什么调度出来的结果浮动会那么大呢?
下面是优先级的计算方法:
load_avg = (59/60) × load_avg + (1/60) × ready_threads
recent_cpu = (2 × load_avg)/(2 × load_avg + 1) × recent_cpu + nice
priority = PRI_MAX − (recent_cpu/4) − (nice × 2)
这个测试用例创建了 2 条线程,nice 值分别设为 0 和 5 后,忙等一段时间,在忙等循环中统计花费在当前线程的 ticks 数。
要求 2 条线程的 ticks 数分别为 1904 和 1096,容许的误差在±50,但我用 qemu 中得到的 tick 数每次结果都不一样,浮动范围在 200 左右,根本无法保证通过测试啊!
作业文档: https://people.eecs.berkeley.edu/~kubitron/courses/cs162-S19/sp19/static/projects/proj1.pdf (3.8 节描述了这个调度器的实现)
测试用例代码: https://github.com/Berkeley-CS162/group0/blob/master/pintos/src/tests/threads/mlfqs-fair.c (其中的 test_mlfqs_nice_2 函数)