package schedularSimulator; import java.util.PriorityQueue; public class RateMonotonicEvent extends Event implements EventInterface { RateMonotonicEvent(int time_,PriorityQueue<Task> task_list_) { task_list = task_list_; time = time_; } public void exec(PriorityQueue<Event>event_list,int quantum) { // task が優先度順に並んでいるとする // 再投入を先にチェックして、一番短いquantumを見つける for(Task q: task_list) { if (q.type!='p') continue; // もし、再投入時間ならば再投入する if (q.next_time==PeriodicalRun.task_clock) { q.next_time=PeriodicalRun.task_clock+q.period; // 次の再投入イベントをスケジューリングする event_list.add(new RateMonotonicEvent(q.next_time,task_list)); if (quantum==0 || quantum > q.period) quantum = q.period; if (q.length>0) { // length が残っていると言うことは、 // まだ、実行されてなかったということ q.report_dead_line_miss(); } q.length = q.task_length; // タスクの再投入 } } for(Task q: task_list) { if (q.type!='p') continue; if (q.length>0) { // まだ、実行されてないtaskで、 // 一番優先順位が高いものを実行する // task queue からは、取り除かない quantum -= q.exec_task(quantum,task_list); if (quantum <= 0) return; } } } }