ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-04-12 15:00:34  阅读:339  来源: 互联网

标签:RQ2 RQ RQ1 队列 多级 next need PCB OS


实验 多级队列调度算法

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

进程P1P2P3P4P5P6P7P8P9P10
运行时间1611141315211810714
已等待时间6543212345

实现描述:

 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;
}

标签:RQ2,RQ,RQ1,队列,多级,next,need,PCB,OS
来源: https://blog.csdn.net/toywish/article/details/115621613

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有