📄 operate system.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 + -