当前位置:文档之家› 实验二 处理机调度

实验二 处理机调度

实验二处理机调度一、实验目的多道程序设计中,经常是若干个进程同时处于就绪状态,为了使系统中的各进程有条不紊地运行,必须选择某种调度策略,以选择一个进程占用处理机。

本次实验设计一个模拟单处理机调度的算法,以加深处理机调度的算法的理解。

二、实验要求1.按照轮转(时间片)算法设计模拟调度程序。

2.输出进程的调度过程。

三、思路分析由于本实验是按照处理机调度算法模拟实现处理机的调度,与真正的处理机调度过程不完全相同,如没有实现中断,进程的运行也不是真正的运行,而是在屏幕上打印其运行时间等。

以下是实验的大致思路:(1)建立三个队列:PCB队列,就绪队列,完成队列。

PCB队列:保存将进入系统的进程。

(由于没有实现中断,所以将进入系统运行的进程必须在程序运行前给出)。

就绪队列:到达进程进入系统的时间,将该进程放入就绪队列,等待调度。

完成队列:将“运行”完的进程放入完成队列。

(2)进程运行过程是在屏幕上打印相关信息。

使用轮转算法调度的进程应打印的信息包括:进程占用处理机序列,该进程每次占用处理机的开始时间与结束时间。

可参考下图:(3)统计出进程的周转时间T和带权周转时间W。

四、流程图五、实验内容编写程序实现轮转算法的模拟调度程序。

(可参考FCFS算法的模拟调度程序。

//************************************************************************ ******////* 实验二处理机调度*////************************************************************************ ******//#include<stdio.h>#include<string.h>#include<iostream.h>#include<malloc.h>#define slice_time 10 //定义时间片的长度为10//定义进程控制块PCBstruct pcb{int id; //进程号int status; //进程状态0-Ready, 1-Run, 2-Finish int arrive_time; //进程到达时间int time; //估计运行时间int run_time; //已运行时间int wait_time; //等待时间int priority; //优先级struct pcb* next; //链接指针};#define length sizeof(struct pcb)int cur_time=0; //系统当前运行时间int num=0; //进程的个数struct pcb *ready_head=NULL;struct pcb *pcb_head=NULL;struct pcb *finish_head=NULL;/*读文件数据,将文件中给出的进程放入PCB队列,以便后续使用返回值:0-失败1-成功*/int readData(){FILE *fp;char fname[20];cout<<"注意:文件中应包含以下信息:\n";cout<<"进程ID 到达时间估计运行时间优先级\n";cout<<"并且应按到达时间顺序排列!\n\n";cout<<"请输入进程流文件名:";cin>>fname;if((fp=fopen(fname,"r"))==NULL)cout<<"错误,文件打不开,请检查文件名"<<endl;return 0;}else{//建立PCB链表struct pcb *p1, *p2;pcb_head=NULL;p1=p2=(struct pcb*)malloc(length);fscanf(fp,"%d %d %d %d",&p1->id,&p1->arrive_time,&p1->time,&p1->priority);p1->status=0; p1->run_time=0; p1->wait_time=0; //初始化while(!feof(fp)){num++;if(num==1){pcb_head=p1;p1->next=NULL;}elsep2->next=p1;p2=p1;p1=(struct pcb*)malloc(length);fscanf(fp,"%d %d %d %d",&p1->id,&p1->arrive_time,&p1->time,&p1->priority);p1->status=0; p1->run_time=0; p1->wait_time=0;}p2->next=NULL;free(p1);fclose(fp);return 1;}}//建立就绪队列(前提:PCB队列是按到达时间排序的)//返回值:0-就绪队列空1-就绪队列不空int readyProcess(){struct pcb *p1, *pready;p1=pcb_head;pready=ready_head;//将pready指向就绪队列最后一个结点if(pready){while(pready->next){pready=pready->next;}}/*将新到达进程插入就绪队列末尾*/while(p1){if(p1->arrive_time<=cur_time){if(pready){pready->next=p1;}if(ready_head==NULL){ready_head=p1;}pready=p1;p1=p1->next;pready->next=NULL;}else{pcb_head=p1; //确定新的PCB队列头if(ready_head){return 1; //就绪队列中有元素}else{return 0;}}}if(p1==NULL) //已经处理完PCB队列中的结点,将pcb队列头赋NULL {pcb_head=NULL;}if(ready_head){return 1; //就绪队列中有元素}else{return 0;}}/*轮转算法中时间片用完的进程插入就绪队列的末尾*///参数:p-插入的进程void insertReadyQueueByRR(struct pcb* p){struct pcb *pready;readyProcess(); //若有新进程进入系统,先将其放入就绪队列if(ready_head==NULL){ready_head=p;return;}pready=ready_head;//将pready指向就绪队列最后一个结点while(pready->next)pready=pready->next;pready->next=p;p->next=NULL;}//按先进先出的方法从就绪队列中取出一个就绪进程//返回值p-从队列中取出的进程0-就绪队列空,无进程取出pcb* getReadyProcessByFIFO(){struct pcb * p;if(ready_head){p=ready_head;ready_head=ready_head->next;return p;}elsereturn 0;}//按先来先服务算法模拟调度过程void runProcessByFCFS(){struct pcb *p, *pFinish=NULL;int t=0,t_sum=0;float w=0.0, w_sum=0.0;//输出FIFO算法执行流cout<<endl<<"*****************************************************"<<en dl;cout<<"FIFO算法执行流:"<<endl; cout<<"进程名等待时间周转时间带权周转时间"<<endl;ready_head=NULL;while(pcb_head||ready_head) //当系统中还有未“运行”完的进程,则循环{while(1) //一直循环,直到有进程进入系统,能从就绪队列中取出进程{if(readyProcess()){p=getReadyProcessByFIFO();break;}elsecur_time++;}p->status=1;cout<<p->id<<"\t\t"<<cur_time-p->arrive_time<<"\t\t"; //“运行”cur_time+=p->time; //修改系统当前“运行”时间//统计数据t=cur_time-p->arrive_time;t_sum+=t;cout<<t<<"\t\t";w=(float)t/p->time;w_sum+=w;cout<<w<<endl;p->status=2; //“运行”完if(finish_head==NULL) //“运行”完的进程加入完成队列finish_head=pFinish=p;elsepFinish->next=p;}p->next=NULL;cout<<"平均周转时间为:"<<(float)t_sum/num<<"\t"<<"平均带权周转时间为:"<<(float)w_sum/num<<endl;}//时间片轮转算法void runProcessByRR(){struct pcb *p, *pFinish=NULL;int t=0,t_sum=0;float w=0.0, w_sum=0.0;//输出RR算法执行流cout<<endl<<"*****************************************************"<<en dl;cout<<"RR算法执行流:"<<endl; cout<<"进程名本次开始时间本次结束时间周转时间带权周转时间"<<endl;ready_head=NULL;while(pcb_head||ready_head){while(1){if(readyProcess()){p=getReadyProcessByFIFO();break;}elsecur_time++;}p->status=1;cout<<p->id<<"\t\t"<<cur_time<<"\t\t";if(p->time-p->run_time>slice_time) //判断本次时间片用完,该进程是否能“运行”完{ //未“运行”完,插入就绪队列cur_time+=slice_time;p->run_time+=slice_time;cout<<cur_time<<endl;p->status=0;insertReadyQueueByRR(p);}else{ //“运行”完,插入完成队列cur_time=cur_time+p->time-p->run_time;cout<<cur_time<<"\t";//统计数据t=cur_time-p->arrive_time;t_sum+=t;cout<<t<<"\t\t";w=(float)t/p->time;w_sum+=w;cout<<w<<endl;p->status=2;if(finish_head==NULL)finish_head=pFinish=p;elsepFinish->next=p;p->next=NULL;}}cout<<"平均周转时间为:"<<(float)t_sum/num<<"\t"<<"平均带权周转时间为:"<<(float)w_sum/num<<endl;}void main(){if(readData())//runProcessByFCFS();runProcessByRR();}。

相关主题