|
|
@ -1,7 +1,6 @@
|
|
|
|
use alloc::BinaryHeap;
|
|
|
|
use alloc::{BinaryHeap, Vec};
|
|
|
|
|
|
|
|
|
|
|
|
type Pid = usize;
|
|
|
|
type Pid = usize;
|
|
|
|
const MAX_PROCESS_NUM: usize = 32;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
///
|
|
|
|
///
|
|
|
|
pub trait Scheduler {
|
|
|
|
pub trait Scheduler {
|
|
|
@ -20,7 +19,7 @@ mod rr {
|
|
|
|
|
|
|
|
|
|
|
|
pub struct RRScheduler {
|
|
|
|
pub struct RRScheduler {
|
|
|
|
max_time_slice: usize,
|
|
|
|
max_time_slice: usize,
|
|
|
|
infos: [RRProcInfo; MAX_PROCESS_NUM],
|
|
|
|
infos: Vec<RRProcInfo>,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Default, Copy, Clone)]
|
|
|
|
#[derive(Debug, Default, Copy, Clone)]
|
|
|
@ -34,6 +33,7 @@ mod rr {
|
|
|
|
impl Scheduler for RRScheduler {
|
|
|
|
impl Scheduler for RRScheduler {
|
|
|
|
fn insert(&mut self, pid: Pid) {
|
|
|
|
fn insert(&mut self, pid: Pid) {
|
|
|
|
let pid = pid + 1;
|
|
|
|
let pid = pid + 1;
|
|
|
|
|
|
|
|
expand(&mut self.infos, pid);
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let info = &mut self.infos[pid];
|
|
|
|
let info = &mut self.infos[pid];
|
|
|
|
assert!(!info.present);
|
|
|
|
assert!(!info.present);
|
|
|
@ -65,6 +65,7 @@ mod rr {
|
|
|
|
|
|
|
|
|
|
|
|
fn tick(&mut self, current: Pid) -> bool {
|
|
|
|
fn tick(&mut self, current: Pid) -> bool {
|
|
|
|
let current = current + 1;
|
|
|
|
let current = current + 1;
|
|
|
|
|
|
|
|
expand(&mut self.infos, current);
|
|
|
|
assert!(!self.infos[current].present);
|
|
|
|
assert!(!self.infos[current].present);
|
|
|
|
|
|
|
|
|
|
|
|
let rest = &mut self.infos[current].rest_slice;
|
|
|
|
let rest = &mut self.infos[current].rest_slice;
|
|
|
@ -84,7 +85,7 @@ mod rr {
|
|
|
|
pub fn new(max_time_slice: usize) -> Self {
|
|
|
|
pub fn new(max_time_slice: usize) -> Self {
|
|
|
|
RRScheduler {
|
|
|
|
RRScheduler {
|
|
|
|
max_time_slice,
|
|
|
|
max_time_slice,
|
|
|
|
infos: [RRProcInfo::default(); MAX_PROCESS_NUM],
|
|
|
|
infos: Vec::default(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
fn _list_add_before(&mut self, i: Pid, at: Pid) {
|
|
|
|
fn _list_add_before(&mut self, i: Pid, at: Pid) {
|
|
|
@ -110,7 +111,7 @@ mod stride {
|
|
|
|
|
|
|
|
|
|
|
|
pub struct StrideScheduler {
|
|
|
|
pub struct StrideScheduler {
|
|
|
|
max_time_slice: usize,
|
|
|
|
max_time_slice: usize,
|
|
|
|
infos: [StrideProcInfo; MAX_PROCESS_NUM],
|
|
|
|
infos: Vec<StrideProcInfo>,
|
|
|
|
queue: BinaryHeap<(Stride, Pid)>, // It's max heap, so pass < 0
|
|
|
|
queue: BinaryHeap<(Stride, Pid)>, // It's max heap, so pass < 0
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -140,6 +141,7 @@ mod stride {
|
|
|
|
|
|
|
|
|
|
|
|
impl Scheduler for StrideScheduler {
|
|
|
|
impl Scheduler for StrideScheduler {
|
|
|
|
fn insert(&mut self, pid: Pid) {
|
|
|
|
fn insert(&mut self, pid: Pid) {
|
|
|
|
|
|
|
|
expand(&mut self.infos, pid);
|
|
|
|
let info = &mut self.infos[pid];
|
|
|
|
let info = &mut self.infos[pid];
|
|
|
|
assert!(!info.present);
|
|
|
|
assert!(!info.present);
|
|
|
|
info.present = true;
|
|
|
|
info.present = true;
|
|
|
@ -172,6 +174,7 @@ mod stride {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn tick(&mut self, current: Pid) -> bool {
|
|
|
|
fn tick(&mut self, current: Pid) -> bool {
|
|
|
|
|
|
|
|
expand(&mut self.infos, current);
|
|
|
|
assert!(!self.infos[current].present);
|
|
|
|
assert!(!self.infos[current].present);
|
|
|
|
|
|
|
|
|
|
|
|
let rest = &mut self.infos[current].rest_slice;
|
|
|
|
let rest = &mut self.infos[current].rest_slice;
|
|
|
@ -193,9 +196,14 @@ mod stride {
|
|
|
|
pub fn new(max_time_slice: usize) -> Self {
|
|
|
|
pub fn new(max_time_slice: usize) -> Self {
|
|
|
|
StrideScheduler {
|
|
|
|
StrideScheduler {
|
|
|
|
max_time_slice,
|
|
|
|
max_time_slice,
|
|
|
|
infos: [StrideProcInfo::default(); MAX_PROCESS_NUM],
|
|
|
|
infos: Vec::default(),
|
|
|
|
queue: BinaryHeap::new(),
|
|
|
|
queue: BinaryHeap::default(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fn expand<T: Default + Clone>(vec: &mut Vec<T>, id: usize) {
|
|
|
|
|
|
|
|
let len = vec.len();
|
|
|
|
|
|
|
|
vec.resize(len.max(id + 1), T::default());
|
|
|
|
}
|
|
|
|
}
|