📄 scand_pcb.cpp
字号:
#include<iostream.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#define TIMER 2//时间片大小
#define NULL 0//指针为空标志
struct PCB;
PCB *READY=NULL;//就绪队列指针
PCB *RUN=NULL;//当前运行进程指针
PCB *FINISH=NULL;//完成队头指针
int select=0;//算法选择
int count=0;//进程数
int action=0;//进程运行步数
enum state{F=-1,R,W};//F=-1代表完成态,W=1代表就绪态,R=0代表执行态
struct PCB{//定义
char NAME;//PCB名字
int PRIO_POUND;//进程优先数/进程每次轮转时间片数(设为常数2)
int CPUTIME;//进程累计占用CPU时间片数
int NEEDTIME;//进程到完成还需要的时间片数
enum state STATE;//进程状态
PCB *NEXT;//PCB链指针
};
PCB* INSERT1(PCB *link,PCB& pcb)//优先数插入队列
{
PCB *pointer;//临时指针
pointer=link;//指针赋值
if(link==NULL)//队列空
link=&pcb;
else //队列非空
{
if(pcb.PRIO_POUND>link->PRIO_POUND)//大于队头元素
{
pcb.NEXT=link;
link=&pcb;
}
else//小于或等于队头元素
{
if(pointer->NEXT==NULL)// 队列只有一个元素且pcb小于当前元素
{
pointer->NEXT=&pcb;//
}
else//队列只有两个元素且元素非空
{
if(pcb.PRIO_POUND>pointer->NEXT->PRIO_POUND)//pcb大于第二个元素
{
pcb.NEXT=pointer->NEXT;
pointer->NEXT=&pcb;
}
else//pcb小于第二个元素///
{
while(pcb.PRIO_POUND<=pointer->NEXT->PRIO_POUND&&pointer->NEXT->NEXT!=NULL)
pointer=pointer->NEXT;//指针后移
if(pointer->NEXT->NEXT==NULL)
{//指针指向倒数第二个
if(pcb.PRIO_POUND>pointer->NEXT->PRIO_POUND)
{//pcb大于倒数第二个pcb
pcb.NEXT=pointer->NEXT;
pointer->NEXT=&pcb;
}
else//插入到最后
pointer->NEXT->NEXT=&pcb;
}
else
{//指针指向队中的某一个在倒数第二个前的某一个pcb
pcb.NEXT=pointer->NEXT;
pointer->NEXT=&pcb;
}
}
}
}
}
return link;
}
PCB* INSERT2(PCB *link,PCB& pcb )
{//队列尾部插入函数
PCB *pointer;//临时指针
pointer=link;//指针赋值
if(link==NULL)//队列为空
link=&pcb;
else//队列非空
{
while(pointer->NEXT!=NULL)
pointer=pointer->NEXT;//指针后移
pointer->NEXT=&pcb;//进程块插入队尾
}
return link;
}
void PRINT_LINK(PCB *link)//输出队列链的所有进程信息
{
PCB *pointer;//临时指针
pointer=link;//指针赋值
while(pointer!=NULL)//不空输出pointer所指向的元素
{
cout<<pointer->NAME<<'\t'<<pointer->CPUTIME<<'\t'<<'\t'<<pointer->NEEDTIME
<<'\t'<<'\t'<<pointer->PRIO_POUND<<'\t'<<'\t';
switch(pointer->STATE)
{
case F:cout<<'F'<<endl;break;
case R:cout<<'R'<<endl;break;
case W:cout<<'W'<<endl;break;
default: break;
}
pointer=pointer->NEXT;//指针后移
}
}
void PRINT_ALL_PCB()
{//输出当前所有pcb信息
cout<<"-------------------";
cout<<"ACTION"<<action<<"----------------------------------------------"<<endl;
cout<<"Name"<<'\t'<<"Cputime"<<'\t'<<'\t'<<"Needtime"
<<'\t'<<"Priority"<<'\t'<<"State"<<endl;//输出格式
PRINT_LINK(RUN);//输出RUN队列所有pcb信息
PRINT_LINK(READY);//输出READY队列所有pcb信息
PRINT_LINK(FINISH);//输出FINISH队列所有pcb信息
}
void CREATE_PCB(PCB *link)
{//创建进程函数
PCB *pcb=new PCB();
do{
cout<<"请输入你想要创建的进程名子一个字母:";
cin>>pcb->NAME;
cout<<"需要运行的时间为一个整型数据:";
cin>>pcb->NEEDTIME;
cout<<endl;
}while(pcb->NEEDTIME<=0);
pcb->CPUTIME=0;
pcb->NEXT=NULL;
pcb->STATE=W;
if(select==1)
pcb->PRIO_POUND=50-pcb->NEEDTIME;
else
pcb->PRIO_POUND=TIMER;
switch(select)
{//算法不同调用不同的函数
case 1: READY=INSERT1(READY,*pcb);
break;
case 2: READY=INSERT2(READY,*pcb);
break;
default: cout<<"Wrong PCB!"<<endl;
break;
}
}
void WORK()
{//进程工作函数
RUN->STATE=R;//修改进程状态
if(RUN->NEEDTIME<=0)
{//进程结束
RUN->NEEDTIME=0;
RUN->STATE=F;
FINISH=INSERT2(FINISH,*RUN);
RUN=NULL;
}
else
{
if(select==1)
{//算法1工作处理
RUN->NEEDTIME=RUN->NEEDTIME-1;
RUN->CPUTIME=RUN->CPUTIME+1;
RUN->PRIO_POUND=RUN->PRIO_POUND-1;
}
else
{//算法2工作处理
RUN->NEEDTIME=RUN->NEEDTIME-RUN->PRIO_POUND;
RUN->CPUTIME=RUN->CPUTIME+RUN->PRIO_POUND;
}
if(RUN->NEEDTIME<=0)
{//处理后结束插入FINISH队列
RUN->NEEDTIME=0;
RUN->STATE=F;
FINISH=INSERT2(FINISH,*RUN);
RUN=NULL;
}
}
}
void main()
{
cout<<"请输入你要选择的算法:“1”代表优先数算法:“2”代表时间片轮转算法:"<<endl;
do //算法选择
{
cout<<"请正确输入:";
cin>>select;
}while(((int)select!=1)&&((int)select!=2));
// for(int i=0;i<5;i++)
// CREATE_PCB(READY);
// count=count+1;
// PRINT_ALL_PCB();
srand( (unsigned)time( NULL ) );
while(READY!=NULL||RUN!=NULL||count<=5)
{
if(count<5)
{
if(READY==NULL)
{
CREATE_PCB(READY);
count++;
}
else
{
if(rand()/3270>8)
{
CREATE_PCB(READY);
count++;
}
}
}
// line=line+1;
if(RUN==NULL)
{
RUN=READY;
if(READY==NULL)
break;
if(READY->NEXT==NULL)
{
READY=NULL;
WORK();
}
else
{
READY=READY->NEXT;
RUN->NEXT=NULL;
WORK();
}
}
else
{//RUN NOT EMPTY
if(select==1)
{
if(READY==NULL)
{
if(RUN->NEEDTIME>0)
WORK();
else
{
RUN->STATE=F;
FINISH=INSERT2(FINISH,*RUN);
}
}
else if(RUN->PRIO_POUND>=READY->PRIO_POUND)
WORK();
else
{
RUN->STATE=W;
READY=INSERT1(READY,*RUN);
RUN=READY;
READY=READY->NEXT;
RUN->NEXT=NULL;
WORK();
}
}
else//select=2
{
if(READY==NULL)
{
if(RUN->NEEDTIME>0)
WORK();
else
{
RUN->NEEDTIME=0;
RUN->STATE=F;
FINISH=INSERT2(FINISH,*RUN);
RUN=NULL;
}
}
else
{
RUN->STATE=W;
READY=INSERT2(READY,*RUN);
RUN=READY;
READY=READY->NEXT;
RUN->NEXT=NULL;
WORK();
}
}
}
action++;
PRINT_ALL_PCB();//输出所当前有的PCB信息
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -