
背景调研以往的优秀作品中,大部分的任务调度队列使用的是全局队列,即将所有任务都放在一个fifo队列中,这样可以简化调度策略,方便代码设计。但是这样设计的缺陷也是显而易见,在多核情况下,每个核add、fetch任务都需要对全局队列进行加锁,这样会造成大量的锁竞争和等待,降低cpu利用率。
为了提高性能减少锁竞争,我们在xv6 lab8:lock的提示下想到可以将全局队列拆分给每个核的单独队列,同时保留一个全局优先队列。
设计思路基于工作窃取机制,每个核会先从全局优先队列中fetch任务,这里面放的是被信号唤醒的任务;如果没有优先任务,那么再从自己的队列中取任务执行;这样极大地减少了锁竞争的出现。但是这里又会出现一个极端情况,当存在大量的优先任务时,普通任务会出现饥饿现象,同时这样的设计也会退化到最初版本。所以需要为工作窃取机制找到合适的工作场景才能最大化提高性能。
暂时的实现:
#![no_std]extern crate alloc;use alloc::collections::VecDeque;use core::future::Future;use core::sync::ato ...