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

📄 operate system.cpp

📁 操作系统中进程调度试验
💻 CPP
字号:
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;

struct PCB
{
	char name[50];
	int pri;
	int cputime;
	int needtime;
	int count;
	int round; 
	char state;//o-运行,w-等待,x-就绪
	PCB *next;
}pcb;

void input(int &algo,PCB *pcb)
{
	char type[20];
	algo=0;
	cout<<"TYPE THE ALGORITHM:(PRIORITY/ROUNDROBIN)"<<endl;
	while(algo==0)
	{
		gets(type);
		if(strcmp(type,"PRIORITY")==0)
			algo=1;
		else if(strcmp(type,"ROUNDROBIN")==0)
			algo=2;
		else
			cout<<"Wrong input!Again please:"<<endl;
	}

	cout<<"INPUT NAME AND NEEDTIME"<<endl;
	struct PCB *p1,*p2;
	p1=(struct PCB*)malloc(sizeof(struct PCB)); 
	pcb->next=NULL;
	p2=pcb;
	for(int i=0;i<5;i++)
	{
		cin>>p1->name;
		cin>>p1->needtime;
		p1->state='x';
		p1->cputime=0;
		p1->round=0;
		p1->count=0; 
		p2->next=p1;
		p2=p1;
		p1=(struct PCB*)malloc(sizeof(struct PCB));
	}
	p2->next=NULL;
}

void output_pri(PCB *pcb)
{
	PCB *p1=pcb->next;
	cout<<"OUTPUT OF PRIORITY:"<<endl;
	printf("     NAME | CPUTIME | NEEDTIME | PRIORITY | STATE\n");
	while(p1!=NULL)
	{
		printf("\t%s\t%d\t%d\t%d\t%c\n",p1->name,p1->cputime,p1->needtime,p1->pri,p1->state);
		p1=p1->next;
	}
}

void ini_pri(PCB *pcb)
{//初始优先数
	PCB *p1=pcb->next;
	while(p1!=NULL)
	{
		p1->pri=50-p1->needtime;
		p1=p1->next;
	}
}
/*PCB *order_pri(PCB *pcb)
{//优先级按从大到小排序。pcb->next=order_pri(pcb);
	PCB *p,*q,*la;
	int k;
	la=(struct PCB*)malloc(sizeof(struct PCB));
	la=NULL;
	while(pcb->next)
	{
		p=pcb->next;
		q=p->next;
		k=p->pri;
		while(q)
		{
            if(k>q->pri)// || q->needtime==0)
            {
                p=q;
                k=q->pri;                
            }
            q=q->next;
        }
        q=pcb->next;
        if(p==pcb->next)
        {
            pcb->next=p->next;
            p->next=la;
            la=p;      
        }
        else
        {
            while(q->next!=p)
                q=q->next;
            q->next=p->next;
            p->next=la;
            la=p;
        }
    }
    return la;
}*/
PCB *order_pri(PCB *pcb)
{
	PCB *p1,*p2,*p3,*p4,*p5,*la;
	la=(struct PCB*)malloc(sizeof(struct PCB));
	la=NULL;
	p1=pcb->next;
	p2=p1->next;
	p3=p2->next;
	p4=p3->next;
	p5=p4->next;
	if(p5->pri==0) 
	{
		p4->next=p5->next;
		p5->next=la;
		la=p5; 
	}
	if(p4->pri==0) 
	{
		p3->next=p4->next;
		p4->next=la;
		la=p4; 
	}
	if(p3->pri==0) 
	{
		p2->next=p3->next;
		p3->next=la;
		la=p3; 
	}
	if(p2->pri==0) 
	{
		p1->next=p2->next;
		p2->next=la;
		la=p2; 
	}
	if(p1->pri==0) 
	{
		pcb->next=p1->next;
		p1->next=la;
		la=p1; 
	}
	int k;
	PCB *p,*q;
	while(pcb->next)
	{
		p=pcb->next;
		q=p->next;
		k=p->pri;
		while(q)
		{
            if(k>q->pri)// || q->needtime==0)
            {
                p=q;
                k=q->pri;                
            }
            q=q->next;
        }
        q=pcb->next;
        if(p==pcb->next)
        {
            pcb->next=p->next;
            p->next=la;
            la=p;      
        }
        else
        {
            while(q->next!=p)
                q=q->next;
            q->next=p->next;
            p->next=la;
            la=p;
        }
    }
    return la;
}
/*
void order2(PCB *pcb)
{
	PCB *p1=pcb->next;
	PCB *p2=pcb->next;
	PCB *p3=pcb;
	while(p2->next!=NULL)
	{//找到链表尾部。 
		p2=p2->next;
	}
	while(p1->next!=NULL)
	{//将needtime==0的项放在链尾。 
		if(p1->needtime==0)
		{
			p3->next=p1->next;
			p2->next=p1;
			p1->next=NULL;
			p2=p1; 
			p1=p3->next;
		}
		else
		{	
			p3=p1;
			p1=p1->next;
		}
	}
}*/
void priority(PCB *pcb)
{
	int rate=1; 
	PCB *p1;
	ini_pri(pcb);
	output_pri(pcb);
	while(rate<6) 
	{ 
		pcb->next=order_pri(pcb);//
		pcb->next->cputime++;
		pcb->next->pri=pcb->next->pri-3;
		pcb->next->needtime--;
		p1=pcb->next;
		while(p1!=NULL)
		{ 
			if(p1->state=='o')
			{ 
				p1->state='x';
			}
			p1=p1->next;
		}
		if(pcb->next->needtime==0)
		{
			pcb->next->pri=0;
			pcb->next->state=rate+'0';
			rate++; 
		}
		else	 
		{
			pcb->next->state='o';
		}		
		output_pri(pcb);
	}
//	output_pri(pcb);
}

PCB *order_RR(PCB *L) 
{//L是不带头结点的单链表的头指针,第一个结点移到最后,pcb->next=order_RR(pcb-next);
	PCB *q,*p; 
	if (L && L->next)
	{
		q=L;
		L=L->next;
  	 	p=L;
		while(p->next && p->next->needtime!=0) 
			p=p->next;
		q->next=p->next;
		p->next=q;
	}
	return L;
}

void output_RR(PCB *pcb)
{
	PCB *p1=pcb->next;
	cout<<"OUTPUT OF ROUNDROBIN:"<<endl;
	printf("     NAME | CPUTIME | NEEDTIME | COUNT | ROUND | STATE\n");
	while(p1!=NULL)
	{
		printf("\t%s\t%d\t%d\t%d\t%d\t%c\n",p1->name,p1->cputime,p1->needtime,p1->count,p1->round,p1->state);
		p1=p1->next;
	}
} 

void RR(PCB *pcb)
{
	output_RR(pcb);
	int rate=1; 
	PCB *p1,*p2;
	while(rate<6)
	{ 	
		if(pcb->next->needtime>1)	
		{
			pcb->next->cputime=pcb->next->cputime+2;
			pcb->next->needtime=pcb->next->needtime-2;
			pcb->next->count=pcb->next->count+1;
		}
		else
		{
			pcb->next->cputime=pcb->next->cputime+1;
			pcb->next->needtime=pcb->next->needtime-1;
			pcb->next->count=pcb->next->count+1;
		} 
		p1=pcb->next;		
		while(p1!=NULL)
		{ 
			if(p1->state=='o')
			{ 
				p1->state='x';
			}
			p1=p1->next;
		}
		if(pcb->next->needtime==0)
		{
			pcb->next->state=rate+'0';
			rate++; 
		}
		else	 
		{
			pcb->next->state='o';
		}
		p2=pcb->next;
		while(p2!=NULL)
		{
			p2->round=p2->round+1;
			p2=p2->next;
		}
		output_RR(pcb);		
		pcb->next=order_RR(pcb->next);			
	}
}

int main()
{
	PCB *pcb;
	pcb=(struct PCB*)malloc(sizeof(struct PCB)); 
	int algo;//1-PRIORITY,2-RR
	input(algo,pcb);
	cout<<algo<<endl;
	if(algo==1)
		priority(pcb);
	else
		RR(pcb);
		
	cin>>algo;//delete!! 
	return 0;
}


⌨️ 快捷键说明

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