OS实验:多级队列调度算法

实验 多级队列调度算法

设RQ分为RQ1和RQ2,RQ1采用轮转法,时间片q=7.
RQ1>RQ2,RQ2采用短进程优先调度算法。
测试数据如下:RQ1: P1-P5, RQ2: P6-P10

进程 P1 P2 P3 P4 P5 P6 P7 P8 P9 P10
运行时间 16 11 14 13 15 21 18 10 7 14
已等待时间 6 5 4 3 2 1 2 3 4 5

实现描述:

 typedef  struct  tag_pcb
    {  char  name[8];
       int need;//须运行的时间
       int turn;//周转时间
       struct  tag_pcb  *next;
   } PCB;
PCB  *RQ1,*RQ2,*Finish;
int clock=0;  //时钟

int main ( )
{  输入RQ1;
   输入RQ2;(最好从文件读入)
   while(RQ1!=NULL)
{    从RQ1中选取一进程Pi准备运行;
      计算其运行的时间t;
      clock+=t;  //表示Pi运行t;
      if (Pi完成)  计算其turn;
      否则   Pi加入到队尾;
   }
   while(RQ2!=NULL)
   { 从RQ2中选取一进程Pi准备运行;   
      clock+=Pi.need;
      计算Pi的turn;
   }
   输出进程的周转时间;   
}
 

C语言实现如下:

#include <stdio.h>
#include <stdlib.h>
#define MAX 5

typedef struct tag_pcb
{
   char name[8];
   int need; //须运行的时间
   int turn; //周转时间
   struct tag_pcb *next;
} PCB;
PCB *RQ1, *RQ2, *Finish;
int clock = 0; //时钟

void CreateRQ(PCB *RQ, char *filename)
{//从文件读取数据创建链表
   FILE *fp;
   if ((fp = fopen(filename, "r")) == NULL)
   {
      printf("Can't open file %s\n", filename);
      exit(0);
   }

   PCB *p = RQ;
   while (!feof(fp))
   {
      PCB *q = (PCB *)malloc(sizeof(PCB));
      fscanf(fp, "%s %d %d", q->name, &q->need, &q->turn);
      p->next = q;
      p = q;
   }
   p->next = NULL;
   fclose(fp);
}

void display(PCB *RQ)
{ //打印队列
   PCB *p;
   p = RQ->next;
   for (; p != NULL; p = p->next)
      printf("test:%s\t%d\t%d\n", p->name, p->need, p->turn);
}

void disprocess(PCB *p)
{//打印进程
   printf("RR:\t%s\t%d\t%d\n", p->name, p->need, p->turn);
}

int check(PCB *RQ)
{ //检查队列中进程是否全部运行结束
   PCB *p;
   p = RQ->next;
   while (p != NULL && p->need == 0) //跳过已运行完成的进程
      p = p->next;

   if (p == NULL)
      return 0;
   else
      return 1;
}

void RR(PCB *RQ, int timeslice)
{//时间片轮转算法
   PCB *p; //表示准备运行的进程
   p = RQ->next;
   int count = 1; //表示队列中尚有进程未结束运行
   while (count && p != NULL)
   {

      if (p->need > timeslice)
      { //运行时间大于时间片,进程未完成
         clock += timeslice;
         p->need -= timeslice;
      }
      else if (p->need > 0)
      { //进程完成
         clock += p->need;
         p->turn += clock;
         p->need = 0;
      }
      p = p->next;

      if (p == NULL)
         p = RQ->next; //从头开始遍历
      count = check(RQ);
   }
}

void SJF(PCB *RQ)
{//短进程优先
   PCB *p = RQ->next;
   PCB *pmin = p;
   int count = 1; //表示队列中尚有进程未结束运行
   while (count && p != NULL)
   {
      while (p != NULL)
      { //选出最短进程
         if (p->need != 0 && pmin->need > p->need)
         {
            if (pmin->need == 0)
               pmin = pmin->next;
            else
               pmin = p;
         }
         p = p->next;
      }

      clock += pmin->need;
      pmin->turn += clock;
      pmin->need = 0;
      p = RQ->next;
      pmin = RQ->next;

      count = check(RQ);
   }
}

void runtime(PCB *RQ)
{//队列中进程周转时间
   printf("Turnaround time for process:\n");
   PCB *p = RQ->next;
   while (p != NULL)
   {
      printf("%s\t%d\n", p->name, p->turn);
      p = p->next;
   }
   printf("\n");
}

void avgtime(PCB *R1, PCB *R2)
{//平均周转时间
   printf("Average turnaround time for process:\n");
   PCB *p = R1->next;
   int total_time = 0;
   int pnum = 0;
   for (; p != NULL; p = p->next)
   {
      total_time += p->turn;
      pnum++;
   }
   p = R2->next;
   for (; p != NULL; p = p->next)
   {
      total_time += p->turn;
      pnum++;
   }
   printf("%.1f\n", total_time * 1.0 / pnum);
}

int main()
{
   RQ1 = (PCB *)malloc(sizeof(PCB)); //初始化头节点
   CreateRQ(RQ1, "RQ1.txt");//创建队列
   RQ2 = (PCB *)malloc(sizeof(PCB)); //初始化头节点
   CreateRQ(RQ2, "RQ2.txt");
   //display(RQ1);
   //display(RQ2);
   int timeslice = 7;
   RR(RQ1, timeslice); //轮转法
   SJF(RQ2);           //短进程优先
   runtime(RQ1);       //各进程周转时间
   runtime(RQ2);
   avgtime(RQ1, RQ2); //进程平均周转时间
   printf("Press enter to continue...");
   getchar();

   return 0;
}

上一篇:spring boot 和shiro的代码实战demo


下一篇:Cisco Netflow V9配置模板