C++写的多级反馈队列代码
根据给定的C++代码,我们可以提取出有关多级反馈队列调度算法的关键知识点,并对这些知识点进行详细的解析。 ### 多级反馈队列调度算法简介 多级反馈队列调度算法是一种常用的进程调度策略,它通过将进程分配到不同优先级的就绪队列中,并为每个队列分配不同的时间片大小来实现公平与效率的平衡。在本段代码中,作者实现了这样一个算法,并邀请读者共同学习与改进。 ### 代码结构分析 #### 数据结构定义 1. **PCB (Process Control Block):** 进程控制块,是操作系统用于存储进程状态数据的结构。 - `char name[20]`: 进程名称。 - `int prio`: 进程优先级。 - `int round`: CPU时间片。 - `int cputime`: 已经执行的时间。 - `int needtime`: 执行所需总时间。 - `char state`: 当前状态(等待 W、运行 R、完成 F)。 - `int count`: 周期计数器。 - `struct node* next`: 指向下一个PCB的指针。 2. **ReadyQueue:** 就绪队列结构体,用于组织具有相同优先级的进程。 - `PCB* LinkPCB`: 指向该优先级下的第一个进程的指针。 - `int prio`: 队列的优先级。 - `int round`: 该优先级下的时间片长度。 - `struct Queue* next`: 指向更高优先级队列的指针。 #### 主要函数介绍 1. **Output():** 输出当前系统状态,包括各队列中的进程信息以及已完成进程的信息。 2. **InsertFinish(PCB* in):** 将一个进程插入到完成队列中。 3. **InsertPrio(ReadyQueue* in):** 将一个新的就绪队列插入到队列链表中,确保优先级高的队列位于链表头部。 4. **PrioCreate():** 创建初始的多级反馈队列结构。 5. **GetFirst(ReadyQueue* queue):** 获取队列中的第一个进程。 6. **InsertLast(PCB* in, ReadyQueue* queue):** 将进程添加到指定队列的末尾。 7. **ProcessCreate():** 创建并初始化一系列进程。 8. **RoundRun(ReadyQueue* timechip):** 对单个队列执行时间片轮转调度。 9. **MultiDispatch():** 执行整个多级反馈队列调度过程。 10. **int main(void):** 程序入口点,调用其他函数来设置并执行调度。 ### 关键知识点详解 #### PCB (Process Control Block) 进程控制块是每个进程的重要组成部分,存储了进程的所有必要信息,如进程名、优先级、已使用的时间片等。这些信息对于操作系统调度和管理进程至关重要。 #### ReadyQueue (就绪队列) 就绪队列是多级反馈队列调度算法的核心数据结构之一,每个队列对应一种优先级。较低优先级的队列通常有更长的时间片,而较高优先级的队列则有较短的时间片,这样可以确保高优先级的进程能够得到及时处理。 #### 调度策略 多级反馈队列调度算法通过设置不同优先级队列的时间片来实现对不同进程类别的调度优化。当一个进程在其所在队列的时间片用尽后,它会被移动到下一级队列,并且重新获得新的时间片继续运行,这样既保证了系统的响应性,又兼顾了公平性。 #### 具体实现 - 在`PrioCreate()`函数中创建了多个具有不同优先级的就绪队列。 - `ProcessCreate()`函数负责初始化一组进程,并将其按照优先级插入到对应的就绪队列中。 - `MultiDispatch()`函数实现了完整的调度过程,通过遍历各个优先级队列并调用`RoundRun()`函数,让进程按照时间片轮转的方式执行。 - `RoundRun()`函数实现了时间片轮转的细节逻辑,例如更新进程状态、时间片计数等。 ### 总结 通过对上述代码的分析,我们不仅了解了多级反馈队列调度算法的基本原理及其实现方式,还深入探讨了其中涉及的关键数据结构和算法逻辑。这种调度策略在实际操作系统设计中有着广泛的应用价值,尤其适用于需要平衡实时响应和长期公平性的场景。
#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 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)
剩余9页未读,继续阅读
- qq_389710702019-03-10确实不错,看得出作者很用心
- 粉丝: 0
- 资源: 3
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助