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

📄 sy.cpp

📁 操作系统实验 实现先进先出算法 基于优先级算法 最短执行时间算法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <iostream.h>
#include <time.h>
#define NUM 4

typedef struct pcb{
	char name[10];		//进程名
	int state;			//进程状态
	int prior;			//优先级
    int exetime;		//执行时间
	int exe;              //是否执行过
	struct pcb *next;	//指向下一个PCB
}pcb,*PCB;

typedef struct {
	PCB front;			//对头指针 
	PCB rear;			//队尾指针

}team;					//队列

void Initteam(team &Q){
	  //初始化队列
	  Q.front=Q.rear=(PCB)malloc(sizeof(pcb));
	  if(!Q.front) exit(0);  //存储分配失败
	  Q.front->next=NULL;


}


void Enteam(team &Q,PCB e){
   //入队函数
	 Q.rear->next=e;
     e->next=NULL;
	 Q.rear=e;
 }

 void Deteam(team &Q,PCB &e){
	 //出队函数

	 e=Q.front->next;
	 Q.front->next=e->next;
	 if(Q.rear==e) Q.rear=Q.front;
	
}


void Inti(team &Q1, team &Q2){
	int i;
	PCB s;
	PCB h1;
	PCB h2;
	int Q1num,Q2num;
	cout<<"请输入PCB的信息:"<<endl<<endl;
	
    for(i=1;i<=NUM;i++){
		 s=(PCB)malloc(sizeof(pcb));
		 s->exe=0;
		 cout<<"第"<<i<<"个PCB:"<<endl<<endl;
		 cout<<"请输入此PCB的名称:  ";
		 cin>>s->name;
	   	 cout<<endl;
		 cout<<"请输入此PCB的优先级:  "; 
		 cin>>s->prior;
		 cout<<endl;
	     cout<<"请输入此PCB的执行时间:  ";
		 cin>>s->exetime;
		 cout<<endl;
		 
		 s->state=rand()%2;
		 if(s->state==1)
			Enteam(Q1,s); //1表示在等待态中
	   	 if(s->state==0)
			Enteam(Q2,s); //0表示在就绪态中
		 
	}
	h1=Q1.front;
	h2=Q2.front;
	
	cout<<"当前在等待队列中的PCB是:"<<endl;
	if(Q1.front==Q1.rear)
		cout<<"就绪队列为空"<<endl;
	for(Q1num=0;h1!=Q1.rear; Q1num++)
			{h1=h1->next;
			 cout<<Q1num+1<<".  "<<h1->name<<endl;}
	cout<<endl;
	//记下等待态中PCB数目
	cout<<"当前在就绪队列中的PCB是:"<<endl;
    if(Q2.front==Q2.rear)
	{	cout<<"抱歉,当前就绪队列为空"<<endl;
		cout<<endl;}
	for(Q2num=0;h2!=Q2.rear; Q2num++)
			{h2=h2->next;
			cout<<Q2num+1<<".   "<<h2->name<<endl;}
	cout<<endl;
	//记下就绪态中PCB数目
	
 }
 

void FIFO(team Q1,team Q2){
     //先来先出调度算法,Q1为等待态队列,Q2为就绪态队列
     PCB s;
	 int i;
	 int Q1num,Q2num;
	 cout<<"先进先出算法:"<<endl;
	 for(int n=1;n<=NUM;n++){
		 PCB e=(PCB)malloc(sizeof(pcb));//e用于接受Q1的第一个PCB
         PCB d=(PCB)malloc(sizeof(pcb));//d用于接受Q2的第一个PCB
		 PCB h1=Q1.front;
		 PCB h2=Q2.front;
		
		cout<<"第"<<n<<"轮执行"<<endl;
		for(Q1num=0;h1!=Q1.rear; Q1num++)
			{h1=h1->next;}//记下等待态中PCB数目
		for(Q2num=0;h2!=Q2.rear; Q2num++)
			{h2=h2->next;}//记下就绪态中PCB数目
	 
		 if(Q2num==0)//就绪态队列为空
		   {Deteam(Q1,e);//让Q1的第一PCB出队,保存在e中
			Enteam(Q2,e);
			Deteam(Q2,d);//让Q2的第一PCB出队,保存在d中
			Enteam(Q1,d);
			cout<<"当前就绪态为空,所以执行等待队列的PCB!"<<endl;
			cout<<endl;
			cout<<"当前在执行的PCB是: "<<d->name<<endl;
			cout<<"其执行时间是:"<<d->exetime<<endl;
            cout<<"其优先级是:"<<d->prior<<endl;          
			cout<<endl;
			cout<<"经过执行,现在的等待队列中的PCB是:"<<endl;
			s=Q1.front->next;
			for(i=1;i<=Q1num;i++)
			{	cout<<i<<"."<<s->name<<endl;
				s=s->next;
			}
			cout<<endl;
			cout<<"执行完成,当前就绪队列依然为空!"<<endl;
	 }
	       
	 else if(Q1num==0)//等待队列为空	  
     {		Deteam(Q2,d);//让Q2的第一PCB出队,保存在d中
			Enteam(Q1,d);//让d进入Q1的队尾
			
		    
			cout<<"当前在执行的PCB是: "<<d->name<<endl;
			cout<<"其执行时间是:"<<d->exetime<<endl;
            cout<<"其优先级是:"<<d->prior<<endl<<endl;     
			cout<<"经过执行,现在的等待队列中的PCB是:"<<endl;
			s=Q1.front->next;
			for(i=1;i<=Q1num;i++)
			{	cout<<i<<"."<<s->name<<endl;
				s=s->next;
			}
			if(Q2.front==Q2.rear)
				cout<<"经过执行,现在的就绪队列为空"<<endl;
			else{
				cout<<"经过执行,现在的就绪队列中的PCB是:"<<endl;
				s=Q2.front->next;
				for(i=1;i<=Q2num;i++)
				{	cout<<i<<"."<<s->name<<endl;
					s=s->next;
				}
				cout<<endl;
			}
	 
	 }
	 else{  
		    Deteam(Q2,d);//让Q2的第一PCB出队,保存在d中
			Enteam(Q1,d);//让d进入Q1的队尾
		    Deteam(Q1,e);//让Q1的第一PCB出队,保存在e中
			Enteam(Q2,e);//让e进入Q2的队尾
			cout<<"当前在执行的PCB是: "<<d->name<<endl;
			cout<<"其执行时间是:"<<d->exetime<<endl;
            cout<<"其优先级是:"<<d->prior<<endl;     
			cout<<endl;
			cout<<"经过执行,现在的等待队列中的PCB是:"<<endl;
			s=Q1.front->next;
			for(i=1;i<=Q1num;i++)
			{	cout<<i<<"."<<s->name<<endl;
				s=s->next;
			}
			cout<<endl;
			cout<<"经过执行,现在的就绪队列中的PCB是:"<<endl;
			s=Q2.front->next;
			for(i=1;i<=Q2num;i++)
			{	cout<<i<<"."<<s->name<<endl;
                s=s->next;
			}
			cout<<endl;
	 }
	 }//for
     }

void FIFOtime(team Q1,team Q2){
	//计算先进先出算法周转时间函数,Q1为等待态队列,Q2为就绪态队列
	float t[NUM+1],tave,tsum,w[NUM+1],wave,wsum;
	//定义周转时间,平均周转时间带权周转时间,平均带权周转时间
	PCB s;
	PCB h1=Q1.front;
	PCB h2=Q2.front;
	int i;
	int Q1num,Q2num;
	for(Q1num=0;h1!=NULL; Q1num++)
			{h1=h1->next;}//记下等待态中PCB数目
	for(Q2num=0;h2!=NULL; Q2num++)
			{h2=h2->next;}//记下就绪态中PCB数目
     s=Q1.front->next;
	 t[0]=0;  
     w[0]=0;//0单元不用
	 for(i=1;i<=(Q1num-1);i++)
	 {	 t[i]=t[i-1]+s->exetime;
		 w[i]=t[i]/(s->exetime); 
		 s=s->next;
	 }
	 
	 s=Q2.front->next;
	 for(;i<=NUM;i++)
	 {	
		 t[i]=t[i-1]+s->exetime;
    	 w[i]=t[i]/(s->exetime);
         s=s->next;
	 }
	  tsum=0;
      wsum=0;
      for(i=1;i<=NUM;i++)
	  {	 tsum=tsum+t[i];
         wsum=wsum+w[i];}
      tave=tsum/NUM;
      wave=wsum/NUM;
      cout<<"FIFO算法的平均周转时间是:" <<tave;
	  cout<<endl;
      cout<<"FIFO算法的平均带权周转时间是:"<<wave;
	  cout<<endl<<endl;
}

void  Prior(team Q1,team Q2){
	//基于优先级的算法 每次执行就绪队列里优先级高的PCB
	//Q1为等待态队列,Q2为就绪态队列
	PCB h1=Q1.front->next;
	PCB h2=Q2.front->next;
	PCB e=(PCB)malloc(sizeof(pcb)); //接收Q1中出队的PCB
	PCB min;//=(PCB)malloc(sizeof(pcb));            //记下优先级最高的PCB
    int minprior;      //记下最高的那个优先级数
	int i,n;
	for(int Q1num=0;h1!=NULL; Q1num++)
			{h1=h1->next;}//记下等待态中PCB数目 
	for(int Q2num=0;h2!=NULL; Q2num++)
			{h2=h2->next;}//记下就绪态中PCB数目
	cout<<"基于优先级算法:"<<endl;
	for(n=1;n<=NUM;n++){
		if((Q2num!=0)&&(Q1num!=0)){
        h2=Q2.front->next;
		minprior=h2->prior;
		min=Q2.front->next;//h2;
		for(i=1;i<=Q2num;i++){
			if((minprior>=(h2->prior))&&((h2->exe)!=1))
			{
				minprior=h2->prior;
				min=h2;
			}//if
			h2=h2->next;
		}//for
		h2=Q2.front;
		while((h2->next)!=min){
			h2=h2->next;
		}//while
		min->exe=1;
		cout<<"第"<<n<<"轮执行"<<endl;
		cout<<"正在执行的是:"<<min->name<<endl;
		cout<<"其执行时间是:"<<min->exetime<<endl;
		cout<<"其优先级是:"<<min->prior<<endl<<endl;
		
		if(min!=Q2.rear)//->next)!=NULL)
			h2->next=min->next;
		else if((min->next)==NULL)
		{	Q2.rear=h2;
			Q2.rear->next=NULL;}
		Enteam(Q1,min);    //min执行完毕后进入等待队列
		Deteam(Q1,e);      //等待队列第一个PCB出队
		Enteam(Q2,e);
		cout<<"经过执行,当前等待队列里的PCB是:"<<endl;
		PCB a,b;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -