Page 98 - 《软件学报》2021年第6期
P. 98
1672 Journal of Software 软件学报 Vol.32, No.6, June 2021
12. if (当前任务状态为 Ready 状态)
13. {判定当前任务在一个周期内未完成执行;
14. 任务集不可调度,输出抢占序列 preemptionSequence;}
15. else
16. 将该任务状态设置为 Ready 状态;
17. endif;
18. endif;
19. 选择 ExecutionPointSet 序列的第 1 个元素 K i ;
20. if (K i 为分区断点) //K 0 ,K 1 ,…,K n 为执行断点序列 ExecutionPointSet 中的元素
21. {r=r+1;
22. 选择分区列表中的下一个分区为当前分区;}
23. endif;
24. 根据当前分区调度策略,选择优先级最高的任务 T i ;
25. 设置 T i 任务状态 state=Running;
26. LaveExecutionTime i =任务 T i 的执行时间;
27. if (Unfinished≠null) //执行断点处有任务 T j 未完成,则抢占发生
28. {添加抢占任务 T i 到抢占序列 preemptionSequence 中;
29. 记录被抢占任务 T j 的名称;
30. 记录抢占发生时的被抢占任务的周期 T j ;}
31. end if
32. time=Clock+LaveExecutionTime i ; //time 为任务 T i 预估完成时的时间,Clock 为当前时间
33. if (time<ExecutionPointSet[1])
34. {Remove(ExecutionPointSet[0]; //删除执行断点序列中的第 1 个元素
35. ExecutionPointSet[0]=time;
36. LaveExecutionTime i =0;
37. State(T i )=0;
38. CurPt←ExecutionPointSet[0];}
39. else //否则,当前任务 T i 并未完成执行
40. {将任务 T i 加入 Unfinished 集合中;
41. LaveExecutionTime i =LaveExecutionTime i −(ExecutionPointSet[1]−ExecutionPointSet[0]);
42. //更新该任务的剩余执行时间
43. Remove(ExecutionPointSet[0];
44. State(T i )=Ready;
45. CurPt←ExecutionPointSet[0];}
46. end if;
47. While (执行断点序列 ExecutionPointSet 不空)
48. print preemptionSequence //输出任务集在一个超周期内的抢占序列
在算法 2 中,如果某个任务需要获得处理器资源时,其为 Ready 状态,并处于就绪队列中;若该任务的优先级
在就绪队列中最高,则获得处理器处理时间.在任务执行断点处表示会有新的任务到来,如果新任务加入处于
Ready 状态的任务集中,此时,调度器选择任务集中优先级最高的任务执行,并将其状态改变为 Running 状态.当
执行的任务被抢占时,任务状态切换为 Ready 状态并加入就绪队列.当正在执行的任务完成执行或者发生阻塞
后,该任务进入 Awaiting 状态,因此,任务在一个周期内完成执行就进入 Awaiting 状态,当任务在下一个周期被释