实验三 进程调度模拟程序
一、实验目的
用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解。
二、实验内容及要求
要求:设计一个有 N(N不小于5)个进程并发执行的进程调度模拟程序。
进程调度算法:“时间片轮转法”调度算法对N个进程进行调度。
内容:完成两个算法(简单时间片轮转法、多级反馈队列调度算法)的设计、编码和调试工作,完成实验报告。
1) 每个进程有一个进程控制块(PCB)表示。进程控制块包含如下信息:进程名、优先级、到达时间、需要运行时间、已用CPU时间、进程状态等等。
2) 每个进程的状态可以是就绪 r(ready)、运行R(Running)、或完成F(Finished)三种状态之一。
3) 就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。
4) 如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,应把它插入就绪队列等待下一次调度。
5) 每进行一次调度,程序都打印一次运行进程、就绪队列中各个进程的 PCB,以便进行检查。
6) 重复以上过程,直到所要进程都完成为止。
三、实验方法、步骤及结果测试
1、源程序
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream.h> typedef struct node { char name[10]; int prio; int round; int cputime; int needtime; int count; char state; struct node *next; }PCB; PCB *finish,*ready,*tail,*run; //队列指针 int N; //进程数 void firstin() { run=ready; //就绪队列头指针赋值给运行头指针 run->state='R'; //进程状态变为运行态] ready=ready->next; //就绪队列头指针后移到下一进程 } //输出标题函数 void prt1(char a) { if(toupper(a)=='P') //优先级法 cout<<" "<<endl; cout<<"进程名 占用CPU时间 到完成还要的时间 轮转时间片 状态"<<endl; } //进程PCB输出 void prt2(char a,PCB *q) { if(toupper(a)=='P') //优先级法的输出 cout<<q->name<<" "<<q->cputime<<" "<<q->needtime<<" "<< q->round<<" "<<q->state<<endl; } //输出函数 void prt(char algo) { PCB *p; prt1(algo); //输出标题 if(run!=NULL) //如果运行指针不空 prt2(algo,run); //输出当前正在运行的PCB p=ready; //输出就绪队列PCB while(p!=NULL) { prt2(algo,p); p=p->next; } p=finish; //输出完成队列的PCB while(p!=NULL) { prt2(algo,p); p=p->next; } getchar(); //按住任意键继续 } //时间片轮转的插入算法 void insert(PCB *q) { PCB *p1,*s,*r; s=q; //待插入的PCB指针 p1=ready; //就绪队列头指针 r=p1; //*r做pl的前驱指针 while(p1!=NULL) if(p1->round<=s->round) { r=p1; p1=p1->next; } if(r!=p1) { r->next=s; s->next=p1; } else { s->next=p1; //否则插入在就绪队列的头 ready=s; } } //优先级创建初 void create(char alg) { PCB *p; int i,time; char na[10]; ready=NULL; finish=NULL; run=NULL; cout<<"输入进程名及其需要运行的时间:"<<endl; for(i=1;i<=N;i++) { p=new PCB; cin>>na; cin>>time; strcpy(p->name,na); p->cputime=0; p->needtime=time; p->state='W'; p->round=0; if(ready!=NULL) insert(p); else { p->next=ready; ready=p; } cout<<"输入进程名及其需要运行的时间:"<<endl; } prt(alg); run=ready; ready=ready->next; run->state='R'; } void timeslicecycle(char alg) { while(run!=NULL) { run->cputime=run->cputime+8; run->needtime=run->needtime-8; run->round=run->round+8; if(run->needtime<=0) { run->next=finish; finish=run; run->state='F'; run=NULL; if(ready!=NULL) firstin(); } else { run->state='W'; insert(run); firstin(); } prt(alg); } } //主函数 void main() { char algo='P'; //算法标记 cout<<"输入进程的个数:"; cin>>N; //输入进程数 create(algo); //创建进程 timeslicecycle(algo); //优先级法调度 } //main()
2.运行结果
4.结果分析
这次的实验比上次困难很多。研究了很久,参考了网上很多资料,才勉强弄懂了时间片的程序。但是多级反馈的程序还是没能弄出来,在网上也找不到能够成功实现的程序。所以不足之处还是要等日后慢慢学习才能弥补。