时间片轮转算法

时间:2022-01-14 19:48:15
#include<stdio.h>
#include <iostream>
#include<malloc.h>
#include<string.h>
using namespace std;
#define N  10
#define TIME 2//时间片大小
typedef struct pcb
{
char id[5];//进程标识数
int arrivetime;
int finishtime;
int needtime;
float alltime;
float dqalltime;
char state[12];
struct pcb *next;
} pcb,*PCB;
PCB head;
PCB tail;
int count;
void creatprocess()//创建进程
{
PCB p,q;
int n;//要创建的进程数
int i;
head=tail=(PCB)malloc(sizeof(pcb));
head->next=NULL;
p=q=head;
cout<<"输入要创建的进程数:";
cin>>n;
count=n;
    for(i=1;i<=n;i++)
{
p->next=(PCB)malloc(sizeof(pcb));
p=p->next;
tail=p;
cout<<"输入进程的标识符:";
cin>>p->id;
cout<<"输入进程到达时间:";
cin>>p->arrivetime;
        cout<<"输入进程还需要运行的时间:";
cin>>p->needtime;
        cout<<"进程的状态:";
cin>>p->state;


}
tail->next=p->next=NULL;
}


void RunProcess()
{
 //运行进程,简单轮转法Round Robin
PCB p,temp;
 p=head->next;
 while(1)
 {
 if(head->next==NULL)
 {
cout<<"此时就绪队列中已无进程!"<<endl;
return ;
 }
 else
{
while(p)
{
 if((p->needtime>0)&&!(strcmp(p->state,"wait")))
 {
cout<<"进程"<<p->id<<"开始"<<endl;
strcpy(p->state,"run");
p->needtime-=TIME;
if(p->needtime<0)
{
p->needtime=0;
}
else
{
temp=p;//把该时间片内运行完的进程存到临时temp中
//把temp接到链表尾部,销毁P;
if(temp->needtime>0)
{//把该时间片内运行完的进程接到就绪队列的尾部
 if(count>1)
 {
 head->next=temp->next;
tail->next=temp;
 tail=tail->next;
 strcpy(tail->state,"wait");
tail->next=NULL;
}
 else if(count==1)
 {//当只有一个进程等待时,分开讨论
 head->next=temp;
tail=temp;
strcpy(tail->state,"wait");
tail->next=NULL;
 }
 }
}
 }
if(temp->needtime==0)
{//销毁就绪队列中已经结束的进程
 count--;//此时就绪队列中进程数减1
 cout<<"进程"<<p->id<<"结束"<<endl;
 head->next=temp->next;
free(temp);//撤销就绪队列中已经结束的进程
 }


p=head->next;


 }
 }
 }
}
void main()
{
 cout<<"**************进程的初始状态!**************"<<endl;
 creatprocess();
 cout<<"程序运行结果如下:"<<endl;
 RunProcess();//简单轮转法Round Robin


}