《计算机操作系统原理》课外实验报告
先用随机函数初始化PCB结构体,从而模拟3个进程的特性,然后void ProInsert(PCB * p) /*优先数插入算法,将进程p按其优先级插入到就绪队列中相应位置*/、void PrintPCB(PCB *q)// 输出进程控制字信息、void PrintLine(PCB *head) /*输出以p为队首的队列中所有PCB信息*/、void PrintAll()//输出某一时刻进程队列信息、void FirstIn()/*将就绪队列中进程调入运行队列*/等函数体,实现进程调度过程中最基本的功能。在主函数中先调用void CreatePCB() /*随机产生n个进程,并对各个进程随机赋予初值*/,从而创建了就绪队列,为进程调度做好准备。而后void SP() /*静态优先级抢占式调度策略*/、void DP() /*动态优先级抢占式调度策略*/、void RR() /*时间片轮转调度策略*/等来分别实现静态优先级抢占式调度策略、动态优先级抢占式调度策略和时间片轮转调度策略三种功能。而最后的多级反馈调度策略实现因为与前三者有很大的不同,所以在同一cpp中我几乎是重新重构了所有的基本算法来帮助快速实现多级调度策略的。
首先,对于时间的复杂性,我在进程调度实验中忽略了运行队列(CPU处理器的模拟)处理程序是依据进程进入就绪队列的时间来调度的,所以1、静态优先级抢占式调度策略最基本的思想是循环将就绪队列中程序调入到运行队列中,再在运行队列中执行对进程的操作。2、动态优先级抢占式调度策略的基本思想是循环的调度就绪队列中进程程序,然后再运行队列中对进程的优先级进行动态的操作,如每
执行一次进程,它的优先级就相应的减2.,如果没有运行完,就将其重新按照优先级重新插入到就绪队列中,从而模拟出调度返回这一操作。3、时间片轮转调度策略,我预先确定时间片的长度为2,在循环从就绪队列中调度进程时,在运行队列中将其执行2个时间点,若没有执行完,则重新插入。4、而对于多级队列调度策略,则首先建立PCB *ready1,*ready2,*ready3,*ready4;//多级调度队列策略时建立的四个就绪队列,再将这些就绪队列逐渐分别(从高优先级到低优先级就绪队列)“时间片轮转法”。最后输出运行、就绪队列1、就绪队列2、就绪队列3、就绪队列4、结束队列5个队列中进程。 我将进程随进入运行队列时间的影响与进程调度分开编写程序,进程阻塞实验来模拟进程进入CPU时,遇到阻塞情况下进入到阻塞队列中,从而简化了程序的书写。 typedef struct node{ char name[10]; /*进程名*/ char ID; /*进程标识名*/ int priority; /*优先级*/ char state; /*进程状态标志*/ int in_time; /*进程进入CPU的时间*/ int all_time; /*进程需要的总时间*/ int run_time; /*进程已运行的时间*/ int block_time; /*进程被阻塞的时间点*/ int weak_time; /*进程被唤醒的时间点*/
int round; /*进程时间轮转时间片*/ struct node * next; /*下个PCB指针*/ }PCB; /*进程控制块结构字*/
PCB *run,*ready,*finish,*tail_r,*tail_f; /*队列指针,依次定义运行队列、就绪队列、结束队列*/
PCB *ready1,*ready2,*ready3,*ready4;//多级调度队列策略时建立的四个就绪队列
void SP() /*静态优先级抢占式调度策略*/ {
printf(\现在开始静态优先级抢占式调度模拟\\n\\n\ finish=NULL; while(ready!=NULL) {
FirstIn(); PrintAll(); run->run_time+=1;
if(run->all_time-run->run_time<=0) {
run->next=finish; finish=run; finish->state='F'; run=NULL;
} else
ProInsert(run); }
PrintAll(); }
void DP() /*动态优先级抢占式调度策略*/ {
printf(\现在开始动态优先级抢占式调度模拟\\n\\n\ finish=NULL; while(ready!=NULL) {
FirstIn(); PrintAll(); run->run_time+=1;
run->priority-=2; /*每运行一次优先数降低2个单位*/ if(run->all_time-run->run_time<=0) /*如所需时间为0将其插入完成队列*/ {
run->next=finish; finish=run;
run->state='F'; /*置状态为完成态*/
run=NULL; /*运行队列头指针为空*/ }
else /*没有运行完,则将其变为就绪态插入到就绪队列*/ ProInsert(run); }
PrintAll(); }
void RR() /*时间片轮转调度策略*/ {
printf(\现在开始时间片轮转调度策略\\n\\n\ int R_time=2;//时间片轮转调度法中时间为2 finish=NULL; while(ready!=NULL) {
FirstIn();
PrintAll();//就绪队列中进程进入到运行队列中后 队列的显示
for(int i=1;i<=R_time;i++) {
run->run_time+=1; run->priority-=1;