|
|
@ -10,6 +10,12 @@ pub trait Scheduler {
|
|
|
|
fn tick(&mut self, current: Pid) -> bool; // need reschedule?
|
|
|
|
fn tick(&mut self, current: Pid) -> bool; // need reschedule?
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pub use self::rr::RRScheduler;
|
|
|
|
|
|
|
|
pub use self::stride::StrideScheduler;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mod rr {
|
|
|
|
|
|
|
|
use super::*;
|
|
|
|
|
|
|
|
|
|
|
|
pub struct RRScheduler {
|
|
|
|
pub struct RRScheduler {
|
|
|
|
max_time_slice: usize,
|
|
|
|
max_time_slice: usize,
|
|
|
|
infos: [RRProcInfo; MAX_PROCESS_NUM],
|
|
|
|
infos: [RRProcInfo; MAX_PROCESS_NUM],
|
|
|
@ -35,7 +41,7 @@ impl Scheduler for RRScheduler {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
self._list_add_before(pid, 0);
|
|
|
|
self._list_add_before(pid, 0);
|
|
|
|
debug!("RRScheduler: insert {}", pid - 1);
|
|
|
|
debug!("insert {}", pid - 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn remove(&mut self, pid: Pid) {
|
|
|
|
fn remove(&mut self, pid: Pid) {
|
|
|
@ -43,7 +49,7 @@ impl Scheduler for RRScheduler {
|
|
|
|
assert!(self.infos[pid].present);
|
|
|
|
assert!(self.infos[pid].present);
|
|
|
|
self.infos[pid].present = false;
|
|
|
|
self.infos[pid].present = false;
|
|
|
|
self._list_remove(pid);
|
|
|
|
self._list_remove(pid);
|
|
|
|
debug!("RRScheduler: remove {}", pid - 1);
|
|
|
|
debug!("remove {}", pid - 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn select(&mut self) -> Option<Pid> {
|
|
|
|
fn select(&mut self) -> Option<Pid> {
|
|
|
@ -51,7 +57,7 @@ impl Scheduler for RRScheduler {
|
|
|
|
0 => None,
|
|
|
|
0 => None,
|
|
|
|
i => Some(i - 1),
|
|
|
|
i => Some(i - 1),
|
|
|
|
};
|
|
|
|
};
|
|
|
|
debug!("RRScheduler: select {:?}", ret);
|
|
|
|
debug!("select {:?}", ret);
|
|
|
|
ret
|
|
|
|
ret
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -92,7 +98,10 @@ impl RRScheduler {
|
|
|
|
self.infos[i].prev = 0;
|
|
|
|
self.infos[i].prev = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mod stride {
|
|
|
|
|
|
|
|
use super::*;
|
|
|
|
|
|
|
|
|
|
|
|
pub struct StrideScheduler {
|
|
|
|
pub struct StrideScheduler {
|
|
|
|
max_time_slice: usize,
|
|
|
|
max_time_slice: usize,
|
|
|
@ -133,7 +142,7 @@ impl Scheduler for StrideScheduler {
|
|
|
|
info.rest_slice = self.max_time_slice;
|
|
|
|
info.rest_slice = self.max_time_slice;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
self.queue.push((-info.stride, pid));
|
|
|
|
self.queue.push((-info.stride, pid));
|
|
|
|
debug!("StrideScheduler: insert {}", pid);
|
|
|
|
debug!("insert {}", pid);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn remove(&mut self, pid: Pid) {
|
|
|
|
fn remove(&mut self, pid: Pid) {
|
|
|
@ -142,7 +151,7 @@ impl Scheduler for StrideScheduler {
|
|
|
|
info.present = false;
|
|
|
|
info.present = false;
|
|
|
|
// FIXME: Support removing any element
|
|
|
|
// FIXME: Support removing any element
|
|
|
|
assert_eq!(self.queue.pop().unwrap().1, pid, "Can only remove the top");
|
|
|
|
assert_eq!(self.queue.pop().unwrap().1, pid, "Can only remove the top");
|
|
|
|
debug!("StrideScheduler: remove {}", pid);
|
|
|
|
debug!("remove {}", pid);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn select(&mut self) -> Option<Pid> {
|
|
|
|
fn select(&mut self) -> Option<Pid> {
|
|
|
@ -151,9 +160,9 @@ impl Scheduler for StrideScheduler {
|
|
|
|
let old_stride = self.infos[pid].stride;
|
|
|
|
let old_stride = self.infos[pid].stride;
|
|
|
|
self.infos[pid].pass();
|
|
|
|
self.infos[pid].pass();
|
|
|
|
let stride = self.infos[pid].stride;
|
|
|
|
let stride = self.infos[pid].stride;
|
|
|
|
debug!("StrideScheduler: {} stride {:#x} -> {:#x}", pid, old_stride, stride);
|
|
|
|
debug!("{} stride {:#x} -> {:#x}", pid, old_stride, stride);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
debug!("StrideScheduler: select {:?}", ret);
|
|
|
|
debug!("select {:?}", ret);
|
|
|
|
ret
|
|
|
|
ret
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -180,6 +189,7 @@ impl StrideScheduler {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
pub fn set_priority(&mut self, pid: Pid, priority: u8) {
|
|
|
|
pub fn set_priority(&mut self, pid: Pid, priority: u8) {
|
|
|
|
self.infos[pid].priority = priority;
|
|
|
|
self.infos[pid].priority = priority;
|
|
|
|
debug!("StrideScheduler: {} priority = {}", pid, priority);
|
|
|
|
debug!("{} priority = {}", pid, priority);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|