#include<bits/stdc++.h>
using namespace std;
int cal=0;
struct PCB
{
// bool use;//是否可用
//bool sta;//是否就绪
int pronum;//进程号(进程唯一标识符,不可重复)
int time;//时间片
PCB* next;
};
void createList(PCB* &pHead)
{
pHead = new PCB;
pHead->pronum= -1;
// pHead->use=false;
pHead->time=5;
pHead->next = NULL;
return;
}
void print(PCB* pHead)
{
PCB* pCur = pHead->next;
while(pCur != NULL)
{
cout<<pCur->pronum<<" ";
pCur = pCur->next;
}
cout<<endl;
return;
}
void delet(PCB* &pHeadR,PCB* &pHeadB,PCB* &pHeadD,int id)
{
PCB* pCurR = pHeadR;
PCB* pCurB = pHeadB;
PCB* pCurD = pHeadD;
while(pCurR->next != NULL)
{
if(pCurR->next->pronum==id)
{
pCurR->next = pCurR->next->next;
return;
}
pCurR = pCurR->next;
}
while(pCurB->next != NULL)
{
if(pCurB->next->pronum==id)
{
pCurB->next = pCurB->next->next;
return;
}
pCurB = pCurB->next;
}
if(pCurD->next->pronum==id)
{
pCurD->next = pCurD->next->next;
return;
}
cout<<"该进程不存在,无法删除!"<<endl;
}
void destoryList(PCB* pHead)
{
assert(pHead!=NULL);//如果它的条件返回错误,则终止程序执行
PCB* pNext = pHead->next;
while(pNext != NULL)
{
delete pHead;
pHead = pNext;
pNext = pHead->next;
}
delete pHead;
pHead = NULL;
return;
}
void create(PCB* pHead)
{
PCB* pCur = pHead;
while(pCur->next != NULL)
{
pCur = pCur->next;
}
PCB* pNewNode = new PCB;
pNewNode->pronum = cal;
pNewNode->time=5;
//pNewNode->use=true;
pNewNode->next = NULL;
pCur->next=pNewNode;
cal++;
}
bool empty(PCB* pHead)
{
if(pHead->next != NULL)
{
return false;
}
else
return true;
}
void insert(PCB* &pPush,PCB* &pPop)
{
PCB* pCurU = pPush;
PCB* pCurO = pPop;
PCB* ptem=new PCB;
ptem=pCurO->next;
pCurO->next=pCurO->next->next;
while(pCurU->next != NULL)
{
pCurU = pCurU->next;
}
pCurU->next=ptem;
ptem->next=NULL;
}
bool timeout(PCB* pCheck)
{
if(pCheck->next!=NULL)
{
pCheck=pCheck->next;
pCheck->time=pCheck->time-1;
if(pCheck->time==0)
{
pCheck->time=5;
return true;
}
else return false;
}
else return false;
}
int main()
{
cout<<" **************************************************"<<endl;
cout<<" ** 进程调度模拟实验 **"<<endl;
cout<<" **************************************************"<<endl;
PCB* Ready = NULL;
PCB* Block = NULL;
PCB* Doing = NULL;
createList(Ready);
createList(Block);
createList(Doing);
char chose;
int id;
do
{
if(timeout(Doing))
insert(Ready,Doing);
if(empty(Doing)&&!empty(Ready)) insert(Doing,Ready);
cout<<endl<<"当前进程在队列中的情况:"<<endl;
cout<<"就绪态:";
print(Ready);
cout<<"阻塞态:";
print(Block);
cout<<"执行态:";
print(Doing);
cout<<endl;
cout<<"................................................................."<<endl;
cout<<"请输入要进行的操作:"<<endl<<"1.创建 2.撤销 3.阻塞 4.唤醒 0.退出"<<endl;
cout<<"================================================================"<<endl;
cin>>chose;
switch(chose)
{
case ‘1‘:
create(Ready);
break;
case ‘2‘:
cout<<"请输入删除id"<<endl;
cin>>id;
delet(Ready,Block,Doing,id);
break;
case ‘3‘:
if(!empty(Doing))
insert(Block,Doing);
else
cout<<"没有执行态进程,无法阻塞"<<endl;
break;
case ‘4‘:
if(!empty(Block))
insert(Ready,Block);
else
cout<<"没有阻塞态进程,无法唤醒"<<endl;
break;
case ‘0‘:
destoryList(Doing);
destoryList(Block);
destoryList(Ready);
exit(0);
default:
cout<<"该操作不存在,请重新输入"<<endl;
}
}
while(1);
return 0;
}