实验:进程调度算法——时间片轮转算法
1.实验设计说明
用时间片轮转算法模拟单处理机调度。
(1) 建立一个进程控制块PCB来代表。PCB包括:进程名、到达时间、服务时间,状态,和指向本身结构体的指针。
进程状态分为运行(R)和成功(C)
(2) 为每个进程任意确定一个要求服务时间和到达时间。
(3) 按照进队连接成一个队列,再设链表的头指针head.
(4)执行处理机调度时,开始选择对首的第一个进程运行。
(5)(a)让这个进程的剩余时间减去一个时间片;
(b)时刻加一,并且状态为R
(c)让已经运行的时间加一。
(6) 进程执行一次后,若该进程的运行时间为零或小于零,则删除该结点,并将该进程的状态置为C;反之,继续运行对首的第一个进程。
(7) 诺链表不为空,继续执行(5)(6),直至链表为空。
实验代码
#include<stdlib.h>
#include<stdio.h>
#include<malloc.h>
typedefint datatype;
typedefstruct pcb /*进程控制块定义*/
{
char pname[5]; /*进程名*/
int arrivetime; /*到达时间*/
int runtime; /*服务时间*/
char state; /*进程状态*/
struct pcb *next;/*联接指针*/
}PCB;
floatx;
PCB*create()//尾插入法建立链表
{
PCB *head,*r,*p;
int i;
head=r=NULL;
printf("请输入进程的总数:");
scanf("%f",&x);
for(i=0;i<x;i++)
{
p=(PCB*)malloc(sizeof(PCB));
printf("进程名 到达时间 要求服务的时间\n");
scanf("%s%d%d",&p->pname,&p->arrivetime,&p->runtime);
p->state='W';
if(head==NULL)//链表为空
{
head=p;
p->next=NULL;
r=p;
}
else {
p->next=r->next;
r->next=p;
}
r=p;
}
if(r) r->next=NULL;
return head;
}
voidRun(PCB*head)
{
PCB *p,*r,*t,*s,*f;
int h,n=0;
static int d;
float m=0,k=0;
printf("时间片大小为:");
scanf("%d",&h);
p=head;
t=head;
f=head;
while(t->next)
{
t=t->next;
}
d=t->arrivetime;
while(head!=NULL)//链表不为空
{
p->runtime=p->runtime-h;
n++;
p->state='R';
if(p->runtime<=0)
{
p->runtime=0;
p->state='C';
m=m+n-p->arrivetime;
k=k+m/p->runtime;
}
printf("time\tpname\tarrivetime\truntime\tstate\t\n");
printf("%d\t%s\t%d\t%d\t%c\n",n,p->pname,p->arrivetime,p->runtime,p->state);
if(p->runtime==0)/*判断是否删除结点*/
{
s=p;
head=p->next;
p=head;
free(s);
}
else
{
head=p->next;
if(n<d)
{
r=head;
while(r)
{
if(n==r->arrivetime)
{
p->next=r->next;
r->next=p;
break;
}
else r=r->next;
}
}
else
{
while(f->next)
f=f->next;
p->next=f->next;
f->next=p;
}
p=head;
}
}
printf("平均周转时间为:%f\n",m/x);
printf("平均带权周转时间为:%f",k/x);
}
intmain()
{
PCB *head;
head=create();
Run(head);
return 0;
}