#[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; } } }

