diff --git a/lab_scheduling_policies/sched_simulator.py b/lab_scheduling_policies/sched_simulator.py index 05a8345..8f6a38b 100644 --- a/lab_scheduling_policies/sched_simulator.py +++ b/lab_scheduling_policies/sched_simulator.py @@ -44,7 +44,7 @@ def __init__(self): def take_cpu(self): taken = self.running_proc if taken: - assert taken.get_state() == Process.RUNNING + assert taken.get_state() == Process.RUNNING taken.set_state(Process.RUNNABLE) self.running_proc = None return taken @@ -74,6 +74,7 @@ def process_is_done(proc): previous_t = Clock.current_time Clock.current_time = event.get_timestamp() + schedule_timestamp = Clock.now() + SLICE_DURATION if (event.get_type() == event_types.SCHEDULE): @@ -88,14 +89,21 @@ def process_is_done(proc): #choose the next proc to enter cpu in_proc = scheduler.schedule(out_pid, Clock.now() - previous_t) - + #enter cpu and schedule an exit event, if necessary if (in_proc): cpu.enter_cpu(in_proc) remaining_t = in_proc.get_service_t() - in_proc.get_usage_t() - if (remaining_t < SLICE_DURATION and remaining_t > 0): - exit_timestamp = Clock.now() + remaining_t - event_stream.add(Event(event_types.EXIT_PROC, exit_timestamp, in_proc)) + if (remaining_t < SLICE_DURATION and remaining_t >= 0): + exit_timestamp = Clock.now() + remaining_t + if (remaining_t == 0): + exit_timestamp += 1 + event_stream.add(Event(event_types.EXIT_PROC, exit_timestamp, in_proc)) + else: + event_stream.add(Event(event_types.SCHEDULE, schedule_timestamp, None)) + elif (p_table.size() > 0): + event_stream.add(Event(event_types.SCHEDULE, schedule_timestamp, None)) + elif (event.get_type() == event_types.ALLOC_PROC): @@ -107,6 +115,9 @@ def process_is_done(proc): p_table.add(new_proc) scheduler.alloc_proc(new_proc, Clock.now() - previous_t) procs.append(new_proc) + + if (p_table.size() == 1): + event_stream.add(Event(event_types.SCHEDULE, schedule_timestamp, None)) elif (event.get_type() == event_types.EXIT_PROC): @@ -130,11 +141,6 @@ def process_is_done(proc): #force a new proc to enter the cpu event_stream.add(Event(event_types.SCHEDULE, Clock.now() + 1, None)) - #we were not done yet, then add a new SCHEDULE event - if (p_table.size() > 0): - schedule_timestamp = Clock.now() + SLICE_DURATION - event_stream.add(Event(event_types.SCHEDULE, schedule_timestamp, None)) - return procs def enum(**enums):