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 状态,当任务在下一个周期被释
   93   94   95   96   97   98   99   100   101   102   103