#include
#include
#include
/* 所用头文件 */
#define PACE 5
/* 每次时间片长度 */
typedef struct running{
int num;
int priority;
int time;
}Run;
/* 处于运行状态的进程 */
typedef struct waiting{
int num;
int priority;
int time;
struct waiting *next;
}Wait;
/* 处于等待状态的进程 */
typedef struct ready{
int num;
int priority;
int time;
struct ready *next;
}Ready;
Run *runPCB;
Wait *waitPCB;
Ready *readyPCB;
int num=0,PCBno=0;
void addReadyPCB();
void displayReadyPCB();
void ReadytoRunning();
void displayRunPCB();
void Runningtowaiting();
void displayWaitPCB();
void WaitingtoReady();
void RunningtoReady();
int readyNUM();
/* 所用子函数 */
void main(){
/* 主函数 */
int l,j;
readyPCB=NULL;
runPCB=NULL;
waitPCB=NULL;
/* 初始化PCB列表 */
while(!kbhit()){
clrscr();
if(readyPCB==NULL)addReadyPCB();
if(runPCB==NULL)
ReadytoRunning();
displayRunPCB();
displayReadyPCB();
displayWaitPCB();
sleep(PACE);
/* 显示当前状态PACE秒钟 */
runPCB->time-=PACE;
if(runPCB->time==0){
free(runPCB);runPCB=NULL;}
clrscr();
if((!(rand()%4))&&(readyNUM()<5))addReadyPCB();
if(!(rand()%2))RunningtoReady();
Runningtowaiting();
WaitingtoReady();
displayRunPCB();
displayReadyPCB();
displayWaitPCB();
sleep(1);
/* 显示转化时一秒钟 */
}
}
void addReadyPCB(){
/* 添加就绪状态的PCB */
Ready *p,*p1;
int creatno,i;
clrscr();
creatno=rand()%3+1;
p=NULL;
for(i=0;inum=num++;
if(PCBno==0)p1->priority=1;
else p1->priority=rand()%PCBno+1;
PCBno++;
p1->time=(rand()%5+1)*PACE;
p1->next=NULL;
if(p==NULL)p=p1;
else {p1->next=p;p=p1;}
}
if(readyPCB==NULL)readyPCB=p;
else{
p1=readyPCB;
while(p1->next!=NULL)
p1=p1->next;
p1->next=p;
}
}
void displayReadyPCB(){
/* 显示就绪状态的PCB */
Ready *p;
p=readyPCB;
if(p==NULL)return;
printf("The ready PCB(name priority time):
");
while(p!=NULL){
printf("%-3d %-3d %-3d
",p->num,p->priority,p->time);
p=p->next;
}
}
void ReadytoRunning(){ /* 就绪状态向运行状态转换 */
Ready *p,*hp,*p1,*info;
p=readyPCB;
clrscr();
if(p==NULL){printf("There is still no ready PCB!Error!
");return;}
hp=p;
p1=info=NULL;
while(p!=NULL){
if(p->prioritypriority){hp=p;info=p1;}
p1=p;
p=p->next;
}
runPCB=(Run *)malloc(sizeof(Run));
runPCB->num=hp->num;
runPCB->priority=hp->priority;
runPCB->time=hp->time;
if(info==NULL)readyPCB=readyPCB->next;
else {info->next=hp->next;free(hp);}
}
void displayRunPCB(){ /* 显示运行状态 */
if(runPCB==NULL)return;
printf("The running PCB(name priority time):
");
printf("%-3d %-3d %-3d
",runPCB->num,runPCB->priority,runPCB->time);
}
void Runningtowaiting(){ /* 运行状态阻塞到等待状态 */
Wait *p,*p1;
int randomno=rand()%2+1;
if(runPCB==NULL)return;
clrscr();
if(randomno==2)return;
else{
if(waitPCB==NULL){
waitPCB=(Wait *)malloc(sizeof(Wait));
waitPCB->num=runPCB->num;
waitPCB->priority=runPCB->priority;
waitPCB->time=runPCB->time;
waitPCB->next=NULL;
}
else{
p=waitPCB;
while(p->next!=NULL)
p=p->next;
p1=(Wait *)malloc(sizeof(Wait));
p1->num=runPCB->num;
p1->priority=runPCB->priority;
p1->time=runPCB->time;
p1->next=NULL;
p->next=p1;
}
free(runPCB);
runPCB=NULL;
}
}
void displayWaitPCB(){
/* 显示等待状态的PCB */
Wait *p;
p=waitPCB;
if(waitPCB==NULL)return;
printf("The waiting PCB(name priority time):
");
while(p!=NULL){
printf("%-3d %-3d %-3d
",p->num,p->priority,p->time);
p=p->next;
}
}
void WaitingtoReady(){ /* 等待状态等待事件发生,转化为就绪状态 */
Wait *p,*p1;
Ready *q,*q1;
p=waitPCB;
p1=NULL;
clrscr();
if(p==NULL)return;
while(p!=NULL){
if(rand()%3){
q=(Ready *)malloc(sizeof(Ready));
q->num=p->num;
q->priority=p->priority;
q->time=p->time;
q->next=NULL;
q1=readyPCB;
if(q1==NULL)readyPCB=q;
else{
while(q1->next!=NULL)
q1=q1->next;
q1->next=q;
}
if(p1==NULL)
{
if(waitPCB->next==NULL){free(waitPCB);waitPCB=NULL;p=waitPCB;break;}
else{
p=waitPCB->next;
free(waitPCB);
waitPCB=p;
continue;
}
}
else{
p1->next=p->next;
free(p);
p=p1;
}
}
p1=p;
p=p->next;
}
}
void RunningtoReady(){
/* 运行状态时间片到了,转化为就绪状态 */
Ready *p,*p1;
if(runPCB==NULL)return;
clrscr();
p=readyPCB;
if(p==NULL){
readyPCB=(Ready *)malloc(sizeof(Ready));
readyPCB->num=runPCB->num;
readyPCB->priority=runPCB->priority;
readyPCB->time=runPCB->time;
readyPCB->next=NULL;
}
else{
while(p->next!=NULL)
p=p->next;
p1=(Ready *)malloc(sizeof(Ready));
p1->num=runPCB->num;
p1->priority=runPCB->priority;
p1->time=runPCB->time;
p1->next=NULL;
p->next=p1;
}
free(runPCB);
runPCB=NULL;
}
int readyNUM(){ /*返回就绪状态的就绪PCB的个数 */
int i=0;
Ready *p;
p=readyPCB;
while(p!=NULL)
{
i++;
p=p->next;
}
return i;
}