C语言实现多级反馈队列调度算法

2023-11-03

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
typedef struct node   /*进程节点信息*/  
{  
char name[20];   /*进程的名字*/  
int prio;    /*进程的优先级*/  
int round;    /*分配CPU的时间片*/  
int cputime;   /*CPU执行时间*/  
int needtime;   /*进程执行所需要的时间*/  
char state;    /*进程的状态,W——就绪态,R——执行态,F——完成态*/  
int count;    /*记录执行的次数*/  
struct node *next;  /*链表指针*/  
}PCB;  
typedef struct Queue  /*多级就绪队列节点信息*/  
{  
PCB *LinkPCB;   /*就绪队列中的进程队列指针*/  
int prio;    /*本就绪队列的优先级*/  
int round;    /*本就绪队列所分配的时间片*/  
struct Queue *next;  /*指向下一个就绪队列的链表指针*/  
}ReadyQueue;  
PCB *run=NULL,*finish=NULL; /*定义三个队列,就绪队列,执行队列和完成队列*/  
ReadyQueue *Head = NULL; /*定义第一个就绪队列*/  
int num;     /*进程个数*/  
int ReadyNum;    /*就绪队列个数*/  
void Output();          /*进程信息输出函数*/  
void InsertFinish(PCB *in);       /*将进程插入到完成队列尾部*/  
void InsertPrio(ReadyQueue *in);     /*创建就绪队列,规定优先数越小,优先级越低*/  
void PrioCreate();         /*创建就绪队列输入函数*/  
void GetFirst(ReadyQueue *queue);     /*取得某一个就绪队列中的队头进程*/  
void InsertLast(PCB *in,ReadyQueue *queue);   /*将进程插入到就绪队列尾部*/  
void ProcessCreate();        /*进程创建函数*/  
void RoundRun(ReadyQueue *timechip);    /*时间片轮转调度算法*/  
void MultiDispatch();        /*多级调度算法,每次执行一个时间片*/  

int main(void)  
{  
PrioCreate(); /*创建就绪队列*/  
ProcessCreate();/*创建就绪进程队列*/  
MultiDispatch();/*算法开始*/  
Output();  /*输出最终的调度序列*/  
return 0;  
}  
void Output()  /*进程信息输出函数*/  
{  
ReadyQueue *print = Head;  
PCB *p;  
printf("进程名/t优先级/t轮数/tcpu时间/t需要时间/t进程状态/t计数器/n");  
while(print)  
{  
  if(print ->LinkPCB != NULL)  
  {  
   p=print ->LinkPCB;  
   while(p)  
   {  
    printf("%s/t%d/t%d/t%d/t%d/t/t%c/t/t%d/n",p->name,p->prio,p->round,p->cputime,p->needtime,p->state,p->count);     
    p = p->next;  
   }  
  }  
  print = print->next;  
}  
p = finish;  
while(p!=NULL)  
{  
  printf("%s/t%d/t%d/t%d/t%d/t/t%c/t/t%d/n",p->name,p->prio,p->round,p->cputime,p->needtime,p->state,p->count);  
  p = p->next;  
}  
p = run;  
while(p!=NULL)  
{  
  printf("%s/t%d/t%d/t%d/t%d/t/t%c/t/t%d/n",p->name,p->prio,p->round,p->cputime,p->needtime,p->state,p->count);  
  p = p->next;  
}  


}  
void InsertFinish(PCB *in)  /*将进程插入到完成队列尾部*/  
{  
PCB *fst;  
fst = finish;  

if(finish == NULL)  
{  
  in->next = finish;  
  finish = in;  
}  
else  
{  
  while(fst->next != NULL)  
  {  
   fst = fst->next;  
  }  
  in ->next = fst ->next;  
  fst ->next = in;  
}  
}  
void InsertPrio(ReadyQueue *in)  /*创建就绪队列,规定优先数越小,优先级越低*/  
{  
ReadyQueue *fst,*nxt;  
fst = nxt = Head;  

if(Head == NULL)    /*如果没有队列,则为第一个元素*/  
{  
  in->next = Head;  
  Head = in;  
}  
else       /*查到合适的位置进行插入*/  
{  
  if(in ->prio >= fst ->prio)  /*比第一个还要大,则插入到队头*/  
  {  
   in->next = Head;  
   Head = in;  
  }  
  else  
  {  
   while(fst->next != NULL)  /*移动指针查找第一个别它小的元素的位置进行插入*/  
   {  
    nxt = fst;  
    fst = fst->next;  
   }  

   if(fst ->next == NULL)  /*已经搜索到队尾,则其优先级数最小,将其插入到队尾即可*/  
   {  
    in ->next = fst ->next;  
    fst ->next = in;  
   }  
   else     /*插入到队列中*/  
   {  
    nxt = in;  
    in ->next = fst;  
   }  
  }  
}  
}  
void PrioCreate() /*创建就绪队列输入函数*/  
{  
ReadyQueue *tmp;  
int i;  

printf("输入就绪队列的个数:/n");  
scanf("%d",&ReadyNum);  

printf("输入每个就绪队列的CPU时间片:/n");  
for(i = 0;i < ReadyNum; i++)  
{  
  if((tmp = (ReadyQueue *)malloc(sizeof(ReadyQueue)))==NULL)  
  {  
   perror("malloc");  
   exit(1);  
  }  
  scanf("%d",&(tmp->round));  /*输入此就绪队列中给每个进程所分配的CPU时间片*/  
  tmp ->prio = 50 - tmp->round;  /*设置其优先级,时间片越高,其优先级越低*/  
  tmp ->LinkPCB = NULL;    /*初始化其连接的进程队列为空*/  
  tmp ->next = NULL;  
  InsertPrio(tmp);     /*按照优先级从高到低,建立多个就绪队列*/  
}  
}  
void GetFirst(ReadyQueue *queue)     /*取得某一个就绪队列中的队头进程*/  
{  
run = queue ->LinkPCB;  

if(queue ->LinkPCB != NULL)  
{  
  run ->state = 'R';  
  queue ->LinkPCB = queue ->LinkPCB ->next;  
  run ->next = NULL;  
}  
}  
void InsertLast(PCB *in,ReadyQueue *queue)  /*将进程插入到就绪队列尾部*/  
{  
PCB *fst;  
fst = queue->LinkPCB;  

if( queue->LinkPCB == NULL)  
{  
  in->next =  queue->LinkPCB;  
  queue->LinkPCB = in;  
}  
else  
{  
  while(fst->next != NULL)  
  {  
   fst = fst->next;  
  }  
  in ->next = fst ->next;  
  fst ->next = in;  
}  
}  
void ProcessCreate() /*进程创建函数*/  
{  
PCB *tmp;  
int i;  

printf("输入进程的个数:/n");  
scanf("%d",&num);  
printf("输入进程名字和进程所需时间:/n");  
for(i = 0;i < num; i++)  
{  
  if((tmp = (PCB *)malloc(sizeof(PCB)))==NULL)  
  {  
   perror("malloc");  
   exit(1);  
  }  
  scanf("%s",tmp->name);  
  getchar();        /*吸收回车符号*/  
  scanf("%d",&(tmp->needtime));  
  tmp ->cputime = 0;  
  tmp ->state ='W';  
  tmp ->prio = 50 - tmp->needtime;  /*设置其优先级,需要的时间越多,优先级越低*/  
  tmp ->round = Head ->round;  
  tmp ->count = 0;  
  InsertLast(tmp,Head);      /*按照优先级从高到低,插入到就绪队列*/  
}  
}  
void RoundRun(ReadyQueue *timechip)    /*时间片轮转调度算法*/  
{  

int flag = 1;  

GetFirst(timechip);  
while(run != NULL)  
{  
  while(flag)  
  {  
   run->count++;  
   run->cputime++;  
   run->needtime--;  
   if(run->needtime == 0) /*进程执行完毕*/  
   {  
    run ->state = 'F';  
    InsertFinish(run);  
    flag = 0;  
   }  
   else if(run->count == timechip ->round)/*时间片用完*/  
   {  
    run->state = 'W';  
    run->count = 0;   /*计数器清零,为下次做准备*/  
    InsertLast(run,timechip);  
    flag = 0;  
   }  
  }  
  flag = 1;  
  GetFirst(timechip);  
}  
}  
void MultiDispatch()   /*多级调度算法,每次执行一个时间片*/  
{  
int flag = 1;  
int k = 0;  

ReadyQueue *point;  
point = Head;  

GetFirst(point);  
while(run != NULL)  
{  
  Output();  
  if(Head ->LinkPCB!=NULL)  
   point = Head;  
  while(flag)  
  {  
   run->count++;  
   run->cputime++;  
   run->needtime--;  
   if(run->needtime == 0) /*进程执行完毕*/  
   {  
    run ->state = 'F';  
    InsertFinish(run);  
    flag = 0;  
   }  
   else if(run->count == run->round)/*时间片用完*/  
   {  
    run->state = 'W';  
    run->count = 0;   /*计数器清零,为下次做准备*/  
    if(point ->next!=NULL)  
    {  
     run ->round = point->next ->round;/*设置其时间片是下一个就绪队列的时间片*/  
     InsertLast(run,point->next);  /*将进程插入到下一个就绪队列中*/  
     flag = 0;  
    }  
    else  
    {  
     RoundRun(point);   /*如果为最后一个就绪队列就调用时间片轮转算法*/  
     break;  
    }  
   }  
   ++k;  
   if(k == 3)  
   {  
    ProcessCreate();  
   }  
  }  
  flag = 1;  
  if(point ->LinkPCB == NULL)/*就绪队列指针下移*/  
   point =point->next;  
  if(point ->next ==NULL)  
  {  
   RoundRun(point);  
   break;  
  }  
  GetFirst(point);  
}  
}   

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言实现多级反馈队列调度算法 的相关文章

随机推荐

  • 谷歌浏览器:拷贝为CURL的小技巧

    1 美图 2 背景 一个项目要写shell 要调用一个接口 这个接口很麻烦 传参很多 一个一个的弄很难 后来发现浏览器自带的小技巧 非常好用 拷贝的url是直接可以在命令行中执行的 curl http blog sina com cn s
  • 毕业设计-基于深度学习的加密及异常网络流量检测系统

    目录 前言 课题背景和意义 实现技术思路 一 相关理论与技术 三 基于流时空特征的加密流量识别模型 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力
  • 路由交换-华为usg6000防火墙上配置内网外网通过公网ip访问http服务

    源nat是将私网地址转换为公网地址 实现内部网络访问外网 目的dnat是将对公网访问Ip转换为内网ip 实现外部网络访问内网资源 目的nat的实现有多种方式 一对一转换 带端口和不带端口的转换 最常用的就是使用带端口的一对多转换 即我们常说
  • Levinson-Durbin快速递推法功率谱估计(Python实现版)

    Levinson Durbin快速递推法功率谱估计是在Yule Walker方程法之上建立的 如果对于Yule Walker方程法不熟悉的话可以参考我的一篇博客 Yule Walker方程法参数化谱估计 Python实现版 声明 博客原本在
  • 文件上传漏洞upload-libs pass5

    文件上传漏洞upload libs pass4 首先查看源码 无法使用空格和大小写绕过 且黑名单过滤了 htaccess 查看提示 利用readme php文件 因为没有过滤ini文件 创建 text ini和一句话木马文件 内容为 aut
  • HIVE厂牌艺人_Labelwarts Vol. 2:洛杉矶天才厂牌 Odd Future Records 的开始到结束

    We re F kin Radical been F kin Awesome 我们太TMD激进 太TMD耀眼 Talked a lotta sh t so far words you re at a loss 说着一大堆胡话 让你们都不知所
  • 将ant design pro打包的JS分离出去

    通过analyze分析发现其实react dom并不算小 有100多kb 所以就想把它单独引用 于是就在config ts增加 externals react window React react dom window ReactDOM b
  • 利用python3 生成密码本

    一 思路 1 把密码中含有哪些字符串都放入一个迭代器中 2 确定生成的密码是几位数的 3 将生成的所有密码写入一个文件里面 二 代码 import itertools as its 迭代器 words 1234567890 生成密码本的位数
  • 3.2 Python图像的频域图像增强-高通和低通滤波器

    3 2 Python图像的频域图像增强 高通和低通滤波器 文章目录 3 2 Python图像的频域图像增强 高通和低通滤波器 1 算法原理 1 1理想滤波器 1 2巴特沃斯滤波器 1 3指数滤波器 2 代码 3 效果 1 算法原理 高通和低
  • Mongodb笔记六:排序与限制输出

    一 排序 db collectionname find sort key1 1 key 1 这里的1代表升序 1代表降序 如 对所有人按年龄升序排序 降序排序 二 索引 索引是特殊的数据结构 索引存储在一个易于遍历读取的数据集合中 索引是对
  • FFmpeg中RTSP客户端拉流测试代码

    之前在https blog csdn net fengbingchun article details 91355410中给出了通过LIVE555实现拉流的测试代码 这里通过FFmpeg来实现 代码量远小于LIVE555 实现模块在liba
  • 蓝桥杯每日一题——手算题·空间

    本题为填空题 只需要算出结果后 在代码中使用输出语句将所填结果输出即可 小蓝准备用 256MB 的内存空间开一个数组 数组的每个元素都是 3232 位 二进制整数 如果不考虑程序占用的空间和维护内存需要的辅助空间 请问 56MB 的空间可以
  • [阶段二] 4. MySQL的基本操作

    mysql的基本操作 数据插入 INSERT 语句可以向数据表写入数据 可以是一条记录 也可以是多条记录 INSERT INTO 数据表名称 字段1 字段2 VALUES 值1 值2 插入一条记录 INSERT INTO 数据表名称 字段1
  • 分析工具 nvprof简介

    nvprof 是一个可用于Linux Windows和OS X的命令行探查器 使用 nvprof myApp 运行我的应用程序 我可以快速看到它所使用的所有内核和内存副本的摘要 摘要将对同一内核的所有调用组合在一起 显示每个内核的总时间和总
  • 十六进制转二进制

    public static String hexToBinary String hex if hex null hex length 2 0 return null String bString String tmp for int i 0
  • Visual Studio(VS) 编程推荐字体和主题设置

    首先是字体 工具 gt 选项 gt 环境 gt 字体和颜色 具体图如下 选择Consolas的原因 Consolas算是最常见的编码字体了 在很多的编译软件都是这个字体 而且在这个字体下的中英文标点和半角圆角符号也能有比较明显的区别 至于字
  • Java 集合 - Map 接口

    文章目录 1 概述 2 常用 API 3 遍历 Map 集合 4 HashMap 和 Hashtable 5 LinkedHashMap 6 TreeMap 7 Properties 8 Set 集合与 Map 集合的关系 9 总结 1 概
  • C++11/14之模板全特化,偏特化

    目录 模板全特化 偏特化 类模板特化 类模板全特化 a 常规全特化 b 特化成员函数而不是模板 类模板偏特化 局部特化 a 模板参数数量 b 模板参数范围 int const int 比int小 函数模板特化 函数模板全特化 函数模板偏特化
  • LayerNorm的理解

    LayerNorm计算公式 y x E x
  • C语言实现多级反馈队列调度算法

    include