//http://blog.163.com/wuhaoqing3@126/blog/static/27505172200993111154602/
//随机函数
//http://baike.baidu.com/view/549594.htm?fr=ala0
//邻接表
#include<fstream>
#include<iostream>
#include<iterator>
#include<string>
#include<algorithm>
#include<list>
#include<vector>
#include<map>
#include<stack>
#include<queue>
#include<iomanip>
#include <time.h>
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
//////////////////////////////////////////////////////////////////////
//
/*
PCB 结构体;
进程标识符pid、进程的状态标识status、进程优先级priority、
进程的队列指针next、进程生命周期的数据项life。
*/
//进程PCB的结构体
struct PCBs{
int pid;//进程标识符
int status;//进程状态
int priority;//进程优先级
int life;//进程生命周期
PCBs *next;
};
typedef PCBs PCB;
//队列QUE的结构体
struct ques{
PCB *ptpcb;
ques *next;
};
typedef ques QUE;
//进程pid是否被使用的bool数组
bool pidm[101];
//100个进程的声明
PCB process[101];
//50个就绪队列
PCB *q[50];
QUE quelist[50];
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
void displayall();
void displayque();
void displayopt();
void displayopt()
{
cout<<"********************************************************************/n";
cout<<"******************实验名称:进程调度的设计与实现********************/n";
cout<<"*****操作方法:按键,然后进行对应的操作/n";
cout<<"*****键盘:f,操作:创建一个进程/n";
cout<<"*****键盘:r,操作:开始进行进程调度循环/n";
cout<<"*****键盘:q,操作:退出进程调度循环程序/n";
cout<<"*****键盘:d,操作:显示当前已创建好的进程/n";
cout<<endl;
return;
}
void displayall()
{
int tempx;
cout<<"所有的进程分别如下:"<<endl;
cout<<"进程号 优先级 生命周期"<<endl;
for(tempx=1;tempx<=100;tempx++)
{
if(pidm[tempx]==1)
{
cout<<setw(6)<<process[tempx].pid<<" "<<setw(6)<<process[tempx].priority<<setw(8)<<process[tempx].life<<endl;
}
}
return;
}
void displayque()
{
int a;
QUE *ptx;
cout<<"优先队列中的进程分别如下:"<<endl;
for(a=49;a>=0;a--)
{
if(quelist[a].next!=NULL)
{
ptx=quelist[a].next;
cout<<"优先级为"<<a<<"中有的进程为:"<<endl;
while(ptx->next!=NULL)
{
cout<<"pid:"<<ptx->ptpcb->pid<<" life:"<<ptx->ptpcb->life<<endl;
ptx=ptx->next;
}
cout<<"pid:"<<ptx->ptpcb->pid<<" life:"<<ptx->ptpcb->life<<endl;
}
}
return ;
}
int main ()
{
char chp,diab;
//int t;
int count,createno;
//
int prno,xst,noxi;
int tmpid,tmpr;
QUE *tmqpt,*pt;
//
int ai;
PCB *ptr;
QUE *ptq;
count=0;
createno=0;
displayopt();
cout<<"请选择操作(f,r,d,q):";
while(cin>>chp)
{
if(chp=='f')//输入f则创建进程
{
xst=0;
srand( (unsigned)time( NULL ) );//srand()函数产生一个以当前时间开始的随机种子
prno=rand()%101;//产生一个随机pid
if(prno==0)prno++;
for(noxi=1;noxi<=100;noxi++)
{
if(pidm[noxi]==1)
xst++;
}
if(xst==100){
cout<<"已经创建了100个进程,请等待一段时间后在创建"<<endl;
//return ;
}
while(pidm[prno]==1)
{
prno=rand()%101;
if(prno==0)prno++;
}
pidm[prno]=1;
process[prno].life=rand()%6;//随机产生生命周期
if(process[prno].life==0)process[prno].life = 1;//若生命为0则变为1
process[prno].next=NULL;
process[prno].pid=prno;
process[prno].priority = rand()%50;//随机产生优先级
process[prno].status=1;
createno++;
//显示创建的进程信息
cout<<"第"<<createno<<"个进程的pid为:"<<process[prno].pid;
cout<<" life为:"<<process[prno].life<<" priority为:"<<process[prno].priority<<endl;
cout<<endl;
//插入到优先队列
tmpid = process[prno].pid;
tmpr = process[prno].priority;
pt = &quelist[tmpr];
tmqpt = new QUE;
tmqpt->next = NULL;
tmqpt->ptpcb = &process[prno];
while(pt->next != NULL)
{
pt = pt->next;
}
pt->next = tmqpt;
}
else
if(chp=='r')//输入为r则开始进程调度
{
for(ai=49;ai>=0;ai--)
{
while(quelist[ai].next != NULL)
{
ptq=quelist[ai].next;
ptr=ptq->ptpcb;
ptr->status = 0;//就绪变为run
Sleep(1000);
ptr->life=ptr->life-1;
ptr->priority = ptr->priority/2;
if(ptr->life>0)
{
tmpid = ptr->pid;
tmpr = ptr->priority;
ptr->status = 1;
pt = &quelist[tmpr];
tmqpt = new QUE;
tmqpt->next = NULL;
tmqpt->ptpcb = ptr;
while(pt->next != NULL)
{
pt = pt->next;
}
pt->next = tmqpt;
quelist[ai].next=ptq->next;
}
else
{
pidm[quelist[ai].next->ptpcb->pid]=0;
quelist[ai].next=ptq->next;
}
}//while
}//for
createno=0;
}
else if(chp=='q')
{
cout<<"多谢使用!"<<endl;
break;
}else
if(chp=='d')
{
cout<<"显示优先队列请按a,显示已创建的进程请按b:";
cin>>diab;
if(diab=='b')displayall();
else if(diab=='a')displayque();
else {
displayall();
displayque();
}
}
cout<<"请选择操作(f,r,d,q):";
}
return 0;
}