📄 process.cpp
字号:
#include <iostream.h>
#include<stdlib.h>
enum Status{running,ready,blocked};
static int num=1;
class PCB
{
friend class Queue;
friend class CPU;
public:
PCB()
{
ID=num;
Priority=1+rand()%5;
All_time=10+(rand()%20)*10;
if(All_time>60){
begin_block=(rand()%3*10)+10;
blocked_time=20;
}
else
blocked_time=begin_block=0;
Rest_time=All_time;
state=ready;
}
private:
int ID; //进程号
int Priority; //优先数
Status state ; //状态
int begin_block;
int blocked_time;
int All_time; //运行需要时间
int Rest_time; //完成进程还需的时间
PCB *next;
};
class Queue{
friend class CPU;
public:
Queue()
{
head=rear=0;
}
void EnQueue(Queue &Q,PCB *P);
void DeQueue(Queue &Q);
void DeQueue(Queue &Q,PCB *P);
PCB *gethead(Queue &Q);
void dispQueue(Queue &Q);
private:
PCB *head,*rear;
};
void Queue:: EnQueue(Queue &Q,PCB *P)
{
if(!Q.head){
Q.head=Q.rear=P;
if(P->All_time==P->Rest_time)
P->state=running;
Q.head->next=NULL;
}
else{
P->next=NULL;
Q.rear->next=P;
Q.rear=P;
}
}
void Queue::DeQueue(Queue &Q)
{
PCB *P;
if(!Q.head)
{cout<<"无进程" <<endl;
return;
}
P=Q.head;
if(Q.rear==P)
Q.head=Q.rear=0;
else
Q.head=P->next;
delete P;
}
void Queue::DeQueue(Queue &Q,PCB *P)
{
PCB *P1=Q.head;
while(P1->next!=P)P1=P1->next;
P1->next=P->next;
delete P;
}
PCB* Queue::gethead(Queue &Q)
{
return Q.head;
}
void Queue::dispQueue(Queue &Q)
{
PCB *P;
if(!Q.head)cout<<"无进程"<<endl;
else{
P=Q.head;
cout<<"ID "<<"Priority "<<"state "<<"All_time "<<"Rest_time "<<"blocked_time "<<"beginblocked"<<endl;
while(P){
cout<<P->ID<<" "<<P->Priority<<" ";
if(P->state==running)cout<<" running";
if(P->state==ready)cout<<" ready";
if(P->state==blocked)cout<<" blocked";
cout<<" "<<P->All_time<<" "<<P->Rest_time<<" "<<P->blocked_time<<" "<<P->begin_block<<endl;
P=P->next;
}
}
}
class CPU
{
friend class Queue;
public:
void run();
void check();
void wait();
void nowait();
int time_slice;
Queue Q1,Q2;
};
void CPU::check()
{
PCB *P1,*P2=new PCB();
P1=Q2.head;
while(P1){
if(P1->blocked_time<=time_slice)
{
P1->blocked_time=0;
if(!Q1.head->next)
P1->state=running;
else
P1->state=ready;
*P2=*P1;
Q1.EnQueue(Q1,P2);
if(P1==Q2.head){
Q2.DeQueue(Q2);
break;
}
else{
P2=P1;
P1=P1->next;
Q2.DeQueue(Q2,P2);
}
}
else
{
P1->blocked_time-=time_slice;
P1=P1->next;
}
P2=new PCB();
}
}
void CPU::nowait()
{
PCB *p=new PCB();
if(Q1.head->Rest_time<=time_slice){
Q1.DeQueue(Q1);
Q1.head->state=running;
}
else{
Q1.head->Rest_time-=time_slice;
if(Q1.head->Priority>1)
Q1.head->Priority--;
Q1.head->state=ready;
*p=*Q1.head;
Q1.DeQueue(Q1);
Q1.EnQueue(Q1,p);
Q1.head->state=running;
}
}
void CPU::wait()
{
PCB *p=new PCB();
if(Q1.head->begin_block<=time_slice)
{
Q1.head->Rest_time=Q1.head->All_time-Q1.head->begin_block;
if(Q1.head->Priority>1)
Q1.head->Priority--;
Q1.head->begin_block=0;
Q1.head->state=blocked;
*p=*Q1.head;
Q1.DeQueue(Q1);
Q2.EnQueue(Q2,p);
}
else
{
Q1.head->Rest_time=Q1.head->Rest_time-time_slice;
if(Q1.head->Priority>1)
Q1.head->Priority--;
Q1.head->state=ready;
Q1.head->begin_block-=time_slice;
*p=*Q1.head;
Q1.DeQueue(Q1);
Q1.EnQueue(Q1,p);
}
if(Q1.head)
Q1.head->state=running;
}
void CPU::run()
{
if(Q1.head){
Q1.head->state=running;
time_slice=Q1.head->Priority*10;
check();
if(Q1.head->begin_block==0)
nowait();
else
wait();
}
else
check();
}
void main()
{
cout<<"*********进程调度实验开始**********(采用时间片轮转法)\n";
CPU C1;
PCB *p1;
char a;
while(1)
{
cout<<"*****************************************************\n";
cout<<"*** A--新建进程 ***\n";
cout<<"*** B--执行(每次执行一个时间片) ***\n";
cout<<"*** C--显示就绪及阻塞队列 ***\n";
cout<<"*** Q--退出 ***\n";
cout<<"*****************************************************\n";
cout<<"请选择:";
cin>>a;
switch(a)
{
case 'A':
p1=new PCB();
num++;
C1.Q1.EnQueue(C1.Q1,p1);
break;
case 'B':
if(!(C1.Q1.gethead(C1.Q1)||C1.Q2.gethead(C1.Q2)))cout<<"无可执行的进程"<<endl;
else
C1.run();break;
case 'C':
cout<<"就绪队列:"<<endl;
C1.Q1.dispQueue(C1.Q1);
cout<<"阻塞队列:"<<endl;
C1.Q2.dispQueue(C1.Q2);
break;
case 'Q':exit(0);
default:cout<<"输入有误,请重新输入。\n";break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -