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

📄 process.cpp

📁 里面有5个关于操作系统进程调度的算法源码
💻 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 + -