成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片.时间片的大小从几ms到几百ms.当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片.这样就可以保证就绪队列中的所有进程,在一给定的时间内,均能获得一时间片的处理机执行时间.
3.2优先数调度算法
优先数调度算法常用于批处理系统中。在进程调度中,每次调度时,系统把处理机分配给就绪队列中优先数最高的进程。它又分为两种:非抢占式优先数算法和抢占式优先数算法。
在非抢占式优先数算法下,系统一旦把处理机分配给就绪队列中优先数最高的进程后,这个进程就会一直运行,直到完成或发生某事件使它放弃处理机,这时系统才能重新将处理机分配给就绪队列中的另一个优先数最高的进程。 在抢占式优先数算法下,系统先将处理机分配给就绪队列中优先数最高的进程度让它运行,但在运行的过程中,如果出现另一个优先数比它高的进程,它就要立即停止,并将处理机分配给新的高优先数进程。
四.设计步骤
4.1 任务分析
(1)PCB结构通常包括以下信息:进程名,进程优先数,轮转时间片,进程已占用的CPU时间,进程还需要的CPU时间,进程的状态,当前队列指针等。可根据实验的不同,PCB结构的内容可以作适当的增删
(2)本程序用两种算法对五个进程进行调度,每个进程可有三个状态:就绪、执行、完成。并假设初始状态为就绪状态。
(3)为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的优先数或轮转时间数以及进程需运行的时间片数的初始值均由用户给定。 (4)在优先数算法中,优先数可以先取值为一个常数减去进程所需要的时间片数目,进程每执行一次,优先数减3,CPU时间片数加1,进程还需要的时间片
数减1。在轮转算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了2个单位),这时,CPU时间片数加2,进程还需要的时间片数减2,并排列到就绪队列的尾上。
(5)对于遇到优先数一致的情况,采用FIFO策略解决。
4.2 概要设计
1.本程序用两种算法对五个进程进行调度,每个进程可有三个状态,并假设初始状态为就绪状态。
2.为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的优先数或轮转时间数以及进程需运行的时间片数的初始值均由用户给定。 3.在优先数算法中,优先数的值为50与运行时间的差值,即P_TIME-process->needtime。进程每执行一次,优先数减3,CPU时间片数加1,进程还需要的时间片数减1。在轮转算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了2个单位),这时,CPU时间片数加2,进程还需要的时间片数减2,并排列到就绪队列的尾上。 4.对于遇到优先数一致的情况,采用FIFO策略解决。
4.3 详细设计
1.struct pcb() // 定义pcb块 2.Void display() //显示结果信息函数 3.int process_finished(pcb *q) //进程完成标示
4.void display_round() //显示循环轮转调度算法运行结果 5.priority_call() //优先数调度算法 6.void cpu_round()//处理器的工作状态
4.4 流程图
开始 生成并按生成次序排列进程控制块链 链首进程运行 时间片到,进程时间片-1,优先级-3 时间片=0? 优先级>队列中优先级最高的进程? 撤销该进程 运行进程退出,取 链首进程运行 进程队列=null? 结束
4.5 源程序
源程序过程如下: #include
#define P_TIME 50 enum state{ ready, execute, block, finish }; struct pcb{
// 定义pcb块
char name[4]; …
pcb * next; };
pcb * get_process(); pcb * get_process(){ pcb *q; pcb *t; pcb *p; … } i++; } //while return p; }
void display(pcb *p){ //显示结果信息函数
cout<<\ \ cout<<\ \ … } }
int process_finish(pcb *q){ //进程完成标示 int bl=1;
\
while(bl&&q){
bl=bl&&q->needtime==0; q=q->next; } return bl; }
void cpuexe(pcb *q){ pcb *t=q; int tp=0; …
t->cputime++; } }
void priority_call(){ pcb * p; p=get_process(); int cpu=0; … \
getch(); }
void display_menu(){
//显示菜单
//优先数调度算法
cout<<\ cout<<\ cout<<\ cout<<\}
pcb * get_process_round(){ //显示循环轮转调度算法运行结果 pcb *q; pcb *t; pcb *p;