单处理器系统的进程调度的代码,
#include <iostream.h>
#include <stdio.h>
#define NULL 0
char Name[5]={'a','b','c','d','e'};
int Super[5]={3,5,7,10,6};
定义PCB
struct PCB {
char name;//PCB名字
int RunTime;//PCB已运行时间
int RequestTime;//PCB要求运行时间
int super;//PCB优先级
char status;//PCB状态
struct PCB* head;//指向上一个PCB结构体的指针变量
struct PCB* next;//指向下一个PCB结构体的指针变量
};
struct PCB pcb1,pcb2,pcb3,pcb4,pcb5,*p,*q;/定义5个PCB进程
定义PCB各参数的初值,输入各个进程的运行时间
Value()
{
///定义PCB名
pcb1.name=Name[0];
pcb2.name=Name[1];
pcb3.name=Name[2];
pcb4.name=Name[3];
pcb5.name=Name[4];
///定义PCB优先级
pcb1.super=Super[0];
pcb2.super=Super[1];
pcb3.super=Super[2];
pcb4.super=Super[3];
pcb5.super=Super[4];
///定义PCB状态,初态为'R'
pcb1.status='R';
pcb2.status='R';
pcb3.status='R';
pcb4.status='R';
pcb5.status='R';
///定义PCB运行时间,初值为0
pcb1.RunTime=0;
pcb2.RunTime=0;
pcb3.RunTime=0;
pcb4.RunTime=0;
pcb5.RunTime=0;
///给PCB的要求运行时间赋值
cout<<endl;
cout<<"***请给各个PCB的要求运行时间赋值(int):"<<endl;
cout<<"***第一个PCB "<<pcb1.name<<"要求运行的时间为:";
cin>>pcb1.RequestTime;
cout<<"***第二个PCB "<<pcb2.name<<"要求运行的时间为:";
cin>>pcb2.RequestTime;
cout<<"***第三个PCB "<<pcb3.name<<"要求运行的时间为:";
cin>>pcb3.RequestTime;
cout<<"***第四个PCB "<<pcb4.name<<"要求运行的时间为:";
cin>>pcb4.RequestTime;
cout<<"***第五个PCB "<<pcb5.name<<"要求运行的时间为:";
cin>>pcb5.RequestTime;
cout<<"------------------------------------参数定义完毕-------------------------------"<<endl;
}
///使PCB连接成循环队列
Connect()
{
///PCB的前驱
pcb1.head=&pcb5;
pcb2.head=&pcb1;
pcb3.head=&pcb2;
pcb4.head=&pcb3;
pcb5.head=&pcb4;
PCB的后续
pcb1.next=&pcb2;
pcb2.next=&pcb3;
pcb3.next=&pcb4;
pcb4.next=&pcb5;
pcb5.next=&pcb1;
}
///显示输入
display()
{
cout<<"----------------------------------------------------------------"<<endl;
cout<<" 进程名称 "<<" 下一进程名"<<" 运行时间";
cout<<" 要求时间"<<" 优先级"<<" 状态"<<endl;
cout<<"----------------------------------------------------------------"<<endl;
}
/PCB执行
Run()
{
Value();
Connect();
// struct PCB pcb1,pcb2,pcb3,pcb4,pcb5,*p,*q;
char a;
int num,n,PcbNum=5,Number=5,flag=1;//PcbNum表示进程执行过程中进程的个数,n表示已执行完毕的进程个数
q=NULL; //flag=1时程序继续
cout<<endl;
cout<<"***选择a进程先运行的请按1;"<<endl;
cout<<"***选择b进程先运行的请按2;"<<endl;
cout<<"***选择c进程先运行的请按3;"<<endl;
cout<<"***选择d进程先运行的请按4;"<<endl;
cout<<"***选择e进程先运行的请按5;"<<endl<<endl;
cout<<"***请选择你想要运行的进程:";
cin>>num;
cout<<endl;
switch(num)//num为何值则转向那一个case,选择执行的进程
{
case 1:
p=&pcb1;
break;
case 2:
p=&pcb2;
break;
case 3:
p=&pcb3;
break;
case 4:
p=&pcb4;
break;
case 5:
p=&pcb5;
break;
}
while (flag==1){
n=1;
if((p->RequestTime==0)||(p->RequestTime==p->RunTime)){///要求运行时间为0或要求运行时间=运行时间时status='E'
p->status='E';
}
else{ //否则,运行时间+1
p->RunTime=p->RunTime+1;
}
cout<<"***进程运行情况如下所示:"<<endl<<endl;
cout<<"***当前正在执行的进程名称为:"<<p->name<<endl<<endl;
display();
while(n<=PcbNum){
if((p->RequestTime==0)||(p->RequestTime==p->RunTime)){///要求运行时间为0或要求运行时间=运行时间时status='E'
p->status='E';
}
cout<<"/t"<<p->name<<"/t "<<p->next->name<<"/t "<<p->RunTime<<"/t "<<p->RequestTime;
cout<<"/t "<<p->super<<"/t "<<p->status<<endl;
cout<<"----------------------------------------------------------------"<<endl;
cout<<endl;
if ((p->RunTime==p->RequestTime)&&(n==1)){/该进程执行完毕
q=p;
Number=Number-1;
}
p=p->next;//指向下一进程
n++;
PcbNum=Number;
}
if(q!=NULL){
if(q->RunTime==q->RequestTime){//有一个进程块执行完毕
q->status='E';
q->head->next=q->next;
q->next->head=q->head;
cout<<"*************************进程"<<q->name<<"已执行完毕!****************************"<<endl<<endl;
p=q->next;
q=p;
}
else{
p=p->next;
}
}
if(q==NULL){
p=p->next;
}
if(PcbNum!=0){
flag=0;
cout<<"***要继续运行程序请按Enter键两次......"<<endl;
a=getchar();
if(a==getchar()){
flag=1;
}
else{
cout<<"***输入错误!!!"<<endl;
cout<<"********************** 程序结束!*************************"<<endl;
flag=0;
}
}
if(PcbNum==0){
flag=0;
cout<<"*********************进程经已全部执行完毕!**********************"<<endl;
}
}
}
main()
{
//Value();
// Connect();
Run();
}