实验三进程调度蔡凤武
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三进程调度
实验目的
1、理解有关进程控制块、进程队列的概念。
2、掌握进程优先权调度算法和时间片轮转调度算法的处理逻辑。
实验内容与基本要求
1、设计进程控制块PCB的结构,分别适用于优先权调度算法和时间片轮转
调度算法。
2、建立进程就绪队列。
3、编制两种进程调度算法:优先权调度算法和时间片轮转调度算法。
实验报告内容
一.优先权调度算法和时间片轮转调度算法原理。
对于优先权调度算法,其关键是在于是采用静态优先权还是动态优先权,以及如何确定进程的优先权。静态优先权是在创建进程是确定的,并且规定它在进程的整个运行期间保持不变。动态优先权要配合抢占调度方式使用,它是指在创建进程时所赋予的优先权,可以随着进程的推进而发生改变,以便获得更好的调度性能。在就绪队列中等待调度的进程,可以随着等待时间的增加,其优先权也以某个速率增加。因此,对于优先权初值很低的进程,在等待足够时间后,其优先权也可能升为最高,从而获得调度,占用处理器并执行。对已时间片轮转调度算法,系统将所有的就绪进程按进路就绪队列的先后次序排列。每次调度时把CPU分配给队首进程,让其执行一个时间片,当时间片用完,由计时器发出时钟中断,调度程序则暂停改程序的执行,使其退出处理器,并将它送人就绪队的末尾,等待下一轮调度执行。然后,把cpu 分配给就绪队列中新的队首进程,同时让它执行一个时间片。
二.程序流程图。
三.程序及注释。
#include
#include
#include
#include
#include
#include
#define P_NUM 5
#define P_TIME 50
enum st {
ready,
execute,
block,
finish};//状态定义进程//
struct pcb{
char name[4];//进程名字//
int priority;//进程优先权//
int cputime;//CPU运行时间//
int needtime;//进程运行需要的时间//
int count;//进程执行次数//
int round;//时间片轮转轮次//
st process;//进程状态//
pcb *next;};//定义进程//
pcb *get_process()
{ pcb *q;
pcb *t;
pcb *p;
int i=0;
cout<<"input name and time"< while(i { q=(struct pcb*)malloc(sizeof(pcb)); cin>>q->name; cin>>q->needtime; q->cputime=0; q->priority=P_TIME-q->needtime; q->process=ready; q->next=NULL; if(i==0) { p=q; t=q; } else { t->next=q; t=q;} i++; } return p;//输入模拟测试的进程名和执行所需的时间,初始设置可模拟5个进程的调度// } void display (pcb *p) { cout<<"name"<<" "<<"cputime"<<" "<<"needtime"<<" "<<"priority"<<" "<<"st"< while(p) { cout< cout<<" "; cout< cout<<" "; cout< cout<<" "; cout< cout<<" "; switch(p->process) { case ready:cout<<"ready"< case execute:cout<<"execute"< case block:cout<<"block"< case finish:cout<<"finish"< } p=p->next; } }//显示模拟结果,包含进程名,cpu的时间。运行所需时间以及优先级// 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; while(q) { if(q->process!=finish) { q->process=ready; if(q->needtime==0) q->process=finish; } if(tp { tp=q->priority; t=q; } q=q->next; } if(t->needtime!=0) { t->priority-=3;