python实现的最低松弛度优先(LLF)算法
Posted gebicungaha
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python实现的最低松弛度优先(LLF)算法相关的知识,希望对你有一定的参考价值。
1 #!/user/bin/env python 2 # -*- coding:utf-8 -*- 3 4 import sys 5 6 7 class TaskControlBlock: 8 CURRENT_TIME = 0 9 10 def __init__(self, dictionary, 11 name_list, 12 period_time, 13 central_processing_unit_time, 14 remain_time, 15 current_period, 16 laxity_time): 17 for key in dictionary.keys(): 18 name_list.append(key) 19 period_time.append(dictionary.get(key)[1]) 20 central_processing_unit_time.append(dictionary.get(key)[0]) 21 remain_time.append(dictionary.get(key)[0]) 22 current_period.append(1) 23 laxity_time.append(dictionary.get(key)[1] - dictionary.get(key)[0] - self.CURRENT_TIME) 24 25 @staticmethod 26 def get_index_of_min(least_laxity_task_list, minimum): 27 return least_laxity_task_list.index(minimum) 28 29 @staticmethod 30 def get_another_index_of_min(least_laxity_task_list, minimum): 31 least_laxity_task_list[least_laxity_task_list.index(minimum)] = sys.maxsize 32 return least_laxity_task_list.index(min(least_laxity_task_list)) 33 34 @staticmethod 35 def is_exit(temp_list): 36 for element in temp_list: 37 if element != sys.maxsize: 38 return False 39 return True 40 41 def scheduling(self, name_list, 42 period_time, 43 central_processing_unit_time, 44 remain_time, 45 current_period, 46 laxity_time): 47 least_laxity_task = laxity_time.index(min(laxity_time)) 48 temp_list = [] 49 for i in laxity_time: 50 temp_list.append(i) 51 if self.CURRENT_TIME < period_time[least_laxity_task] * (current_period[least_laxity_task] - 1): 52 while self.CURRENT_TIME < period_time[least_laxity_task] * 53 (current_period[least_laxity_task] - 1): 54 least_laxity_task = self.get_another_index_of_min(temp_list, min(temp_list)) 55 if self.is_exit(temp_list=temp_list): 56 exit(0) 57 another_task = self.get_another_index_of_min(temp_list, min(temp_list)) 58 if remain_time[least_laxity_task] 59 <= laxity_time[another_task]: 60 running_time = remain_time[least_laxity_task] 61 else: 62 running_time = laxity_time[another_task] 63 remain_time[least_laxity_task] -= running_time 64 print(name_list[least_laxity_task], self.CURRENT_TIME, running_time) 65 self.CURRENT_TIME += running_time 66 if remain_time[least_laxity_task] == 0: 67 current_period[least_laxity_task] += 1 68 remain_time[least_laxity_task] = central_processing_unit_time[least_laxity_task] 69 i = 0 70 while i < laxity_time.__len__(): 71 laxity_time[i] = current_period[i] * period_time[i] - 72 remain_time[i] - self.CURRENT_TIME 73 i += 1 74 print(laxity_time) 75 else: 76 another_task = self.get_another_index_of_min(temp_list, min(temp_list)) 77 if remain_time[least_laxity_task] 78 <= temp_list[another_task]: 79 running_time = remain_time[least_laxity_task] 80 else: 81 running_time = laxity_time[another_task] 82 remain_time[least_laxity_task] -= running_time 83 print(name_list[least_laxity_task], self.CURRENT_TIME, running_time) 84 self.CURRENT_TIME += running_time 85 if remain_time[least_laxity_task] == 0: 86 current_period[least_laxity_task] += 1 87 remain_time[least_laxity_task] = central_processing_unit_time[least_laxity_task] 88 i = 0 89 while i < laxity_time.__len__(): 90 laxity_time[i] = current_period[i] * period_time[i] - 91 remain_time[i] - self.CURRENT_TIME 92 i += 1 93 print(laxity_time) 94 95 96 if __name__ == "__main__": 97 task_dictionary = {"A": [10, 30], 98 "B": [25, 75], 99 "C": [30, 90],} 100 current_time = 0 101 name_list = [] 102 period_time = [] 103 central_processing_unit_time = [] 104 remain_time = [] 105 current_period = [] 106 laxity_time = [] 107 tcb = TaskControlBlock(task_dictionary, 108 name_list, 109 period_time, 110 central_processing_unit_time, 111 remain_time, 112 current_period, 113 laxity_time)
1 #!/user/bin/env python 2 # -*- coding:utf-8 -*- 3 4 import sys 5 import EarliestDeadlineFirst 6 import LeastLaxityFirst 7 8 9 class GetCloseTime: 10 """ design the close time by itself """ 11 def __init__(self, dictionary): 12 self.dictionary = dictionary 13 14 def greatest_common_divisor(self, _left, _right): 15 return _left if _right == 0 else self.greatest_common_divisor(_right, _left % _right) 16 17 def lowest_common_multiple(self): 18 temp_result = 1 19 for value in self.dictionary.values(): 20 temp_result = value[1] * temp_result / self.greatest_common_divisor(value[1], temp_result) 21 return temp_result 22 23 24 class TimeError(Exception): 25 """ 26 Self-defined Exception : 27 Judging whether the processing time and cycle of real-time tasks satisfy the conditions 28 """ 29 def __init__(self, message): 30 self.message = message 31 32 def is_execute(dictionary): 33 sum = 0 34 for value in dictionary.values(): 35 sum += value[0] / value[1] 36 return sum 37 38 if __name__ == "__main__": 39 task_dictionary = {"A": [10, 30], 40 "B": [20, 60], 41 "C": [30, 90]} 42 if is_execute(task_dictionary) > 1: 43 raise TimeError("error, scheduling finish!") 44 user_choose = input("Please enter your choice" 45 "(1 : EarlistDeadlineFirist) or (2 : LeastLaxityFirst) : ") 46 close_time_object = GetCloseTime(task_dictionary) 47 close_time = close_time_object.lowest_common_multiple() 48 if int(user_choose) == 1: 49 current_time = 0 50 name_list = [] 51 period_time = [] 52 central_processing_unit_time = [] 53 remain_time = [] 54 current_period = [] 55 tcb = EarliestDeadlineFirst.TaskControlBlock(task_dictionary, 56 name_list, 57 period_time, 58 central_processing_unit_time, 59 remain_time, 60 current_period) 61 62 63 while tcb.CURRENT_TIME < close_time: 64 tcb.scheduling(name_list, 65 period_time, 66 central_processing_unit_time, 67 remain_time, 68 current_period) 69 else: 70 current_time = 0 71 name_list = [] 72 period_time = [] 73 central_processing_unit_time = [] 74 remain_time = [] 75 current_period = [] 76 laxity_time = [] 77 tcb = LeastLaxityFirst.TaskControlBlock(task_dictionary, 78 name_list, 79 period_time, 80 central_processing_unit_time, 81 remain_time, 82 current_period, 83 laxity_time) 84 while tcb.CURRENT_TIME < close_time: 85 tcb.scheduling(name_list, 86 period_time, 87 central_processing_unit_time, 88 remain_time, 89 current_period, 90 laxity_time)
以上是关于python实现的最低松弛度优先(LLF)算法的主要内容,如果未能解决你的问题,请参考以下文章
操作系统| 处理机调度(各种作业调度算法银行家算法三级调度死锁产生原因和必要条件处理死锁的方法死锁定理的作用实时调度算法)