1. 最早截止時間優先EDF(Earliest DeadlineFirst)算法是非常著名的實時調度算法之一。在每一個新的就緒狀態,調度器都是從那些已就緒但還沒有完全處理完畢的任務中選擇最早截止時間的任務,並將執行該任務所需的資源分配給它。在有新任務到來時,調度器必須立即計算EDF,排出新的定序,即正在運行的任務被剝奪,並且按照新任務的截止時間決定是否調度該新任務。如果新任務的最后期限早於被中斷的當前任務,就立即處理新任務。按照EDF算法,被中斷任務的處理將在稍后繼續進行。
2. 該算法的思想是從兩個任務中選擇截至時間最早的任務,把它暫作為當前處理任務,再判斷該任務是否在當前周期內,若不在當前周期內,就讓另一任務暫作當前處理任務,若該任務也不在當前周期內,就讓CPU空跑到最靠近的下一個截至時間的開始,若有任務在該周期內,就判斷該任務的剩余時間是否小於當前截至時間與當前時間的差,若小於,則讓該任務運行到結束.否則,就讓該任務運行到該周期的截止時間,就立即搶回處理器,再判斷緊接着的最早截至時間,並把處理器給它,做法同上,如此反復執行.

1 #!/user/bin/env python 2 # -*- coding:utf-8 -*- 3 4 5 class GetCloseTime: 6 def __init__(self, dictionary): 7 self.dictionary = dictionary 8 9 def greatest_common_divisor(self, _left, _right): 10 return _left if _right == 0 else self.greatest_common_divisor(_right, _left % _right) 11 12 def lowest_common_multiple(self): 13 temp_result = 1 14 for value in self.dictionary.values(): 15 temp_result = value[1] * temp_result / self.greatest_common_divisor(value[1], temp_result) 16 return temp_result 17 18 19 class TaskControlBlock: 20 CURRENT_TIME = 0 21 22 def __init__(self, dictionary, 23 name_list, 24 period_time, 25 central_processing_unit_time, 26 remain_time, 27 current_period): 28 for key in dictionary.keys(): 29 name_list.append(key) 30 period_time.append(dictionary.get(key)[1]) 31 central_processing_unit_time.append(dictionary.get(key)[0]) 32 remain_time.append(dictionary.get(key)[0]) 33 current_period.append(1) 34 35 def get_index_of_min(self, earliest_deadline_task_list, minimum): 36 return earliest_deadline_task_list.index(minimum) 37 38 def get_another_index_of_min(self, earliest_deadline_task_list, minimum): 39 earliest_deadline_task_list[earliest_deadline_task_list.index(minimum)] = 100000 40 return earliest_deadline_task_list.index(min(earliest_deadline_task_list)) 41 42 def is_execute(self, central_processing_unit_time, period_time): 43 temp_list = [a / b for a, b in zip(central_processing_unit_time, period_time)] 44 return sum(temp_list) 45 46 def scheduling(self, name_list, 47 period_time, 48 central_processing_unit_time, 49 remain_time, 50 current_period): 51 if self.is_execute(central_processing_unit_time, period_time) > 1: 52 print("error, scheduling finish!") 53 exit(0) 54 earliest_deadline_task = self.get_index_of_min( 55 [a * b for a, b in zip(period_time, current_period)], 56 min(a * b for a, b in zip(period_time, current_period))) 57 58 if self.CURRENT_TIME < period_time[earliest_deadline_task] * (current_period[earliest_deadline_task] - 1): 59 current_period_p = period_time[earliest_deadline_task] * (current_period[earliest_deadline_task] - 1) 60 temp_list = [a * b for a, b in zip(period_time, current_period)] 61 while self.CURRENT_TIME < period_time[earliest_deadline_task] * \ 62 (current_period[earliest_deadline_task] - 1): 63 earliest_deadline_task = self.get_another_index_of_min(temp_list, min(temp_list)) 64 65 if remain_time[earliest_deadline_task] <= current_period_p - self.CURRENT_TIME: 66 running_time = remain_time[earliest_deadline_task] 67 else: 68 running_time = current_period_p - self.CURRENT_TIME 69 # current_period_p = period_time[earliest_deadline_task] * current_period[earliest_deadline_task] 70 remain_time[earliest_deadline_task] -= running_time 71 print(name_list[earliest_deadline_task], self.CURRENT_TIME, running_time) 72 self.CURRENT_TIME += running_time 73 if remain_time[earliest_deadline_task] == 0: 74 current_period[earliest_deadline_task] += 1 75 remain_time[earliest_deadline_task] = central_processing_unit_time[earliest_deadline_task] 76 else: 77 current_period_p = period_time[earliest_deadline_task] * current_period[earliest_deadline_task] 78 if remain_time[earliest_deadline_task] <= current_period_p - self.CURRENT_TIME: 79 running_time = remain_time[earliest_deadline_task] 80 else: 81 running_time = current_period_p - self.CURRENT_TIME 82 remain_time[earliest_deadline_task] -= running_time 83 print(name_list[earliest_deadline_task], self.CURRENT_TIME, running_time) 84 self.CURRENT_TIME += running_time 85 if remain_time[earliest_deadline_task] == 0: 86 current_period[earliest_deadline_task] += 1 87 remain_time[earliest_deadline_task] = central_processing_unit_time[earliest_deadline_task] 88 89 90 if __name__ == "__main__": 91 task_dictionary = {"A": [10, 30], 92 "B": [20, 60], 93 "C": [30, 90]} 94 close_time_object = GetCloseTime(task_dictionary) 95 close_time = close_time_object.lowest_common_multiple() 96 97 current_time = 0 98 name_list = [] 99 period_time = [] 100 central_processing_unit_time = [] 101 remain_time = [] 102 current_period = [] 103 tcb = TaskControlBlock(task_dictionary, 104 name_list, 105 period_time, 106 central_processing_unit_time, 107 remain_time, 108 current_period) 109 110 while tcb.CURRENT_TIME < close_time: 111 tcb.scheduling(name_list, 112 period_time, 113 central_processing_unit_time, 114 remain_time, 115 current_period)