时间片轮转算法
2019-07-14 12:12发布
生成海报
#include
#include
#include
#include
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<<"此时就绪队列中已无进程!"<return ;
}
else
{
while(p)
{
if((p->needtime>0)&&!(strcmp(p->state,"wait")))
{
cout<<"进程"<id<<"开始"<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<<"进程"<id<<"结束"< head->next=temp->next;
free(temp);//撤销就绪队列中已经结束的进程
}
p=head->next;
}
}
}
}
void main()
{
cout<<"**************进程的初始状态!**************"< creatprocess();
cout<<"程序运行结果如下:"< RunProcess();//简单轮转法Round Robin
}
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮