zoukankan      html  css  js  c++  java
  • python实现的EDF(earliest deadline first)算法

    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)
    EDF算法
  • 相关阅读:
    JSP学习笔记
    Java之String、StringBuffer、StringBuilder的区别
    Android开发笔记——Handler总结
    深搜_八皇后(HDU_2553)
    广搜_优先队列和记录搜索路径(HDU_1026)
    深搜_素数环(HDU_1016)
    深搜_奇偶减枝(HDU_1010)
    转载 ASP.NET MVC学习之(5):Html.ActionLink
    启动万维网发布服务(W3SVC)
    What is POID
  • 原文地址:https://www.cnblogs.com/gebicungaha/p/9994214.html
Copyright © 2011-2022 走看看