#[derive(Debug, Clone, Copy, PartialEq, Eq)]
enum ProcessState {
Ready,
Running,
Waiting,
Terminated,
}
#[derive(Debug)]
struct Process {
pid: usize,
state: ProcessState,
}
struct Scheduler {
processes: Vec<Process>,
current_index: usize,
}
impl Scheduler {
fn new(processes: Vec<Process>) -> Self {
Scheduler {
processes,
current_index: 0,
}
}
fn schedule(&mut self) -> Option<&Process> {
if self.processes.is_empty() {
return None;
}
let len = self.processes.len();
for _ in 0..len {
self.current_index = (self.current_index + 1) % len;
let proc = &mut self.processes[self.current_index];
if proc.state == ProcessState::Ready {
proc.state = ProcessState::Running;
return Some(proc);
}
}
None
}
fn update_state(&mut self, pid: usize, new_state: ProcessState) {
if let Some(proc) = self.processes.iter_mut().find(|p| p.pid == pid) {
proc.state = new_state;
}
}
}
fn main(){
let mut scheduler = Scheduler::new(vec![
Process { pid: 1, state: ProcessState::Ready},
Process { pid: 2, state: ProcessState::Ready},
Process { pid: 3, state: ProcessState::Waiting},
]);
for _ in 0..5 {
if let Some(proc) = scheduler.schedule() {
println!("Running process: {:?}", proc.pid);
scheduler.update_state(proc.pid, ProcessState::Ready);
} else {
println!("No Runnable processes.");
break;
}
}
}