本文介绍了利用C语言模拟实现动态优先权的进程调度算法的方法,并给出相应的核心代码程序。在设计中,充分考虑了进程在执行过程中可能发生的多种情况,更好的体现了进程的就绪态、执行态、阻塞态三者之间的关系以及相互的转换。程序的运行过程清晰的体现了动态优先权的调度算法的执行过程,有利于加深对算法的理解和掌握。
科技信息○本刊重稿○SCIENCE&TECHNOLOGYINFORMATION2008年第25期
基于动态优先权的进程调度算法的模拟实现
马宏琳
(河南工业大学
【摘
阎磊郑州
河南450001)
要】本文介绍了利用C语言模拟实现动态优先权的进程调度算法的方法,并给出相应的核心代码程序。在设计中,充分考虑了进程
在执行过程中可能发生的多种情况,更好的体现了进程的就绪态、执行态、阻塞态三者之间的关系以及相互的转换。程序的运行过程清晰的体现了动态优先权的调度算法的执行过程,有利于加深对算法的理解和掌握。
关键词】动态优先权;进程调度;模拟【
SimulationandImplementationBasedonDynamicPrioritySchedulingAlgorithms
Ma-HongLinYanLei
(HenanUniversityofTechnology
HenanZhengzhou450001)
【Abstract】ThethesisdescribesthemethedofsimulationandimplementationbasedondynamicpriorityschedulingalgorithmsbyC-language,andgivesthekenalprograms.Inthedesign,givingmayoccurinavarietyofconditionsfortheprocessimplementation,whichisbetterreflectedtherelationshipbetweenreadystate,implementationstate,andblockingstate,andtheirmutualconversions.Proceduresfortheoperationoftheprocessclearlyreflectsdynamicpriorityschedulingalgorithms,whichcandeepeningtheunderstandingandgraspofthealgorithm.
【Keywords】dynamicpriorityscheduling;proessscheduling;simulation
在多道程序环境下,进程的数目往往多于处理机数目。这就要求系统能按照某种算法,动态的把处理机分配给就绪队列中的进程,使之执行。因此,处理机调度是操作系统设计的中心问题之一。进程调度问题的核心就是采用什么样的算法把处理机分配给进程。进程调度算法也是在任何操作系统中必须配置的一级调度。好的进程调度算法将有效的提高系统中各种资源利用率,减少处理机的空闲时间,避免部分作业长期得不到处理机响应等情况的发生。
间STARTBLOCK进入阻塞队列尾。
②就绪队列中仍有进程存在,则按优先权原则选择进程执行。否
则CPU处于等待状态。
③根据进程被阻塞的时间BLOCKTIME,考虑阻塞队列中的进程是否移入就绪队列中,或者仍然在阻塞队列中等待下一个时间片。
3.程序设计过程
(1)设计PCB结构体structprocess{intid;intpy;intct;intat;intsb;intbt;intst;};
(2)设计两个数组ready_q、block_q表示就绪队列和阻塞队列。根据各进程的初始条件初始化就绪队列。利用ready_q[0]表示就绪队列中进程总数,block_q[0]表示阻塞队列中进程总数。代码如下:
for(i=1;i<=n;i++)
{P[i].st=1;ready_q[i]=i;}ready_q[0]=n;
(3)设计核心调度过程
利用do-while循环进行进程调度的模拟。用timeslice变量记录各进程执行的时间片。循环的结束条件为:当就绪队列和阻塞队列全为空。循环体内的核心算法如下:
①执行进程的选取。
max_pt变量记录优先级最高进程的优先权,ready_q数组记录就绪队列的顺序,priority变量记录优先级最高进程的ID。从就绪队列中选出优先权最大的进程作为当前时间片的执行进程,并使ready_q数组排序。代码如下:
for(i=1,max_pt=-1;i<=ready_q[0];i++)if(P[ready_q[i]].py>max_pt){max_pt=P[ready_q[i]].py;j=i;
priority=ready_q[i];}
for(i=j;i
ready_q[0]--;
②按算法规定的原则操作各进程。实质是按原则改变数组各值。即:执行进程的优先数减3、ct加1、
/*priority*/
/*cputime*//*alltime*//*startblock*/
/*blocktime*/
/*state:1ready;-1block;0finish*/
1.动态优先权调度算法介绍
动态优先权调度算法,以就绪队列中各个进程的优先权作为进程调度的依据。各个进程的优先权在创建进程时所赋予,随着进程的推进或其等待时间的增加而改变。进程的优先权利用某一范围内的整数来表示。有的系统数值越小优先权越高,如Unix系统,有的系统则反之。采用该算法时,每次总是在就绪队列中选择一个优先权最高的进程进行调度,并将处理机分配给该进程。动态优先权调度算法又分为抢占式和非抢占式两种。本文采用C语言对非抢占式动态优先权调度算法进行了设计和实现。
2.算法的设计思路
(1)在算法的设计中各项原则。
首先规定优先数改变的原则:
●进程在就绪队列中呆一个时间片,优先数增加1。
●进程每运行一个时间片,优先数减3。
其次,算法的数据结构及操作采用数组方式,将输入的N个进程的PCB信息保存到一个数组中。用PCB数组的插入和删除动态地模拟进程调度过程。
(2)系统初始条件。
系统中设有5个进程,每个进程产生时间,优先级各不相同。利用进程控制块PCB来
描述各个进程。进程控制块PCB包括以下字段:●进程标识数ID;
●进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高;
●进程已占用的CPU时间CPUTIME;
●进程还需占用的CPU时间ALLTIME。当进程运行完毕时,ALLTIME变为0;
●进程的阻塞时间STARTBLOCK,
表示当进程再运行
STARTBLOCK个时间片后,进程将进入阻塞状态;
●进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,进程将转换成就绪状态;
阻塞态、完成态;●进程状态STATE,包括三种状态,就绪态、CPU处理进程是从就绪队列中选择当前各进程中优先权最大的
进程开始的。由于采用的是非抢占式调度算法,则当前进程执行完一个时间片之后有以下几种情况:
①当前进程结束则退出系统,否则排到就绪队列尾或根据阻塞时
5