动态高优先权
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
动态高优先权实验报告
一、实验目的
通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解.提高自己的动手能力主要是通过自己去思考并自己的编码更进一步及更贴切的去理解弄明白动态优先权算法的模拟加深对进程概念和进程调度过程的工作流程及其原理!
二、实验要求
用C语言来实现对N个进程采用动态优先权优先算法的进程调度。
三、实验内容
每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段:
1.进程标识数ID
2.进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。
3.进程已占用的CPU时间CPUTIME。
4.进程还需占用的CPU时间ALLTIME。
当进程运行完毕时,ALLTIME变为0。
5.进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进入阻塞状态。
6.进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。
7.进程状态STATE。
8.队列指针NEXT,用来将PCB排成队列。
四、实验结果
五、实验小结
其实每次实验,老师都建议大家自己开始写程序,网上的代码可以自己选择性的参考,但绝对不能纯粹性的抄袭,但由于自己的C++基础实在是不怎么好,如果自己编的话会摸不着头脑,不知从哪里开始,就还是从网上下载了一些代码,在同学们的帮助下,理解编着的思路,明白各个模块的调度,也明白了动态高优先权的具体内容。
虽然中间碰见了不少问题,但经过多次调试,还是有了比较满意的结果。
然而这些调试是需要花费时间的,课堂的时间不够,只能课下去完成。
正所谓皇天不负有心人,努力就会有收获,经过这次试验也算是有所提高吧。
动态优先权是指在创建进程时所赋予的优先权,可以随进程的推进或随其等待时间的增加而改变的,以便获得更好的调度性能.
例如,我们可以规定,在就绪队列中的进程,随其等待时间的增长,其优先权以速率a 提高.若所有的进程都具有相同的优先权初值,则显然是最先进入就绪队列的进程,将因其动态优先权变得最高而优先获得处理机,此即FCFS算法.
优先权的变化规律可描述为:由于等待时间与服务时间之和,就是系统对该作业的响应时间,故该优先权又相当于响应比RP
此次实验让我明白了许多,不仅是知识上的,还有认识上的,我明白任何时候都是自己动手丰衣足食,学问是自己的,是无止境的,为了以后我们只能努力的补充自己···
附录
#include "stdio.h"
#include <stdlib.h>
#include <conio.h>
#define getpch(type) (type*)malloc(sizeof(type))
#define NULL 0
struct pcb { /* 定义进程控制块PCB */
char name[10]; /*定义进程名称*/
char state; /*进程状态*/
int super; /*优先数*/
int ntime; /*需要运行的时间*/
int rtime; /*已占用的CPU时间*/
struct pcb* link;
}*ready=NULL,*p;
typedef struct pcb PCB; /*pcb表*/
void sort() /* 建立对进程进行优先级排列函数*/
{ PCB *first, *second;
int insert=0;
if((ready==NULL)||((p->super)>(ready->super))) /*优先级最大者, 插入队首*/
{ p->link=ready;
ready=p;
}
else /* 进程比较优先级,插入适当的位置中*/
{ first=ready;
second=first->link;
while(second!=NULL)
{ if((p->super)>(second->super)) /*若插入进程比当
前进程优先数大,*/
{ /*插入到当前进程前面*/
p->link=second;
first->link=p;
second=NULL;
insert=1;
}
else /* 插入进程优先数最低,则插入到队尾*/
{ first=first->link;
second=second->link;
}
}
if(insert==0) first->link=p;
}
}
void input() /* 建立进程控制块函数*/ { int i,num;
system("cls"); /*清屏*/
printf("\n 请输入进程号?");
scanf("%d",&num);
for(i=0;i<num;i++)
{ printf("\n 进程号No.%d:\n",i);
p=getpch(PCB);
printf("\n 输入进程名:");
scanf("%s",p->name);
printf("\n 输入进程优先数:");
scanf("%d",&p->super);
printf("\n 输入进程运行时间:");
scanf("%d",&p->ntime);
printf("\n");
p->rtime=0;p->state='w';
p->link=NULL;
sort(); /* 调用sort函数*/
}
}
int space()
{ int l=0; PCB* pr=ready;
while(pr!=NULL)
{ l++;
pr=pr->link;
}
return(l);
}
void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/
{ printf("\n qname \t state \t super \t ndtime \t runtime \n");
printf("|%s\t",pr->name);
printf("|%c\t",pr->state);
printf("|%d\t",pr->super);
printf("|%d\t",pr->ntime);
printf("|%d\t",pr->rtime);
printf("\n");
}
void check() /* 建立进程查看函数,检查等待队列的进程是否进入就绪队列*/
{ PCB* pr;
printf("\n **** 当前正在运行的进程是:%s",p->name); /*显示当前
运行进程*/
disp(p);
pr=ready;
printf("\n ****当前就绪队列状态为:\n"); /*显示就绪队列状态*/
while(pr!=NULL)
{ disp(pr);
pr=pr->link;
}
}
void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/
{ printf("\n 进程[%s] 已完成.\n",p->name);
free(p);
}
void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/ { (p->rtime)++;
if(p->rtime==p->ntime)
destroy(); /* 调用destroy函数*/
else
{ (p->super)--;
p->state='w';
sort(); /*调用sort函数*/
}
}
void main() /*主函数*/
{ int len, h=0;
char ch;
input();
len=space();
while((len!=0)&&(ready!=NULL))
{ ch=getchar();
h++;
printf("\n The execute number:%d \n",h); p=ready;
ready=p->link;
p->link=NULL;
p->state='R';
check();
running();
printf("\n 按任一键继续......");
ch=getchar();
}
printf("\n\n 进程已经完成.\n");
ch=getchar();
}。