时间片调度算法

来源:互联网 发布:死而有知 其几何离 编辑:程序博客网 时间:2024/04/29 03:29

实验:进程调度算法——时间片轮转算法

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;

}


1 0
原创粉丝点击