⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scand_pcb.cpp

📁 实验要求用高级语言编写模拟进程调度程序
💻 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 + -