队列的相关算法

#include<iostream.h>
#include<malloc.h>
#define MaxLen 20
typedef char elemtype;
typedef struct node
{
 elemtype data[MaxLen];
 int front,rear;
}squeue;


void init(squeue *sq)
{
 sq->front=0;
 sq->rear=0;
}

 

squeue *enqueue(squeue *sq,elemtype x)
{
 if((sq->rear+1)%MaxLen==sq->front)
 {
  cout<<"队满"<<endl;
  return sq;
 }
 sq->data[sq->rear]=x;
 sq->rear+=1;
 return sq;
}

 

squeue *outqueue(squeue *sq,elemtype *x)
{
 if(sq->rear==sq->front)
 {
  cout<<"空队"<<endl;
  return sq;
 }
 *x=sq->data[sq->front];
 sq->front=(sq->front +1)%MaxLen;
 return sq;
}


int empty(squeue *sq)
{
 if(sq->rear==sq->front)
  return 1;
 else
  return 0;
}


int len(squeue *sq)
{
 if(sq->front==sq->rear)
  return 0;
 else if(sq->rear>sq->front)
  return sq->rear-sq->front;
 else if(sq->rear<sq->front)
  return MaxLen+sq->rear-sq->front;
}


 

多级反馈队列调度算法是一种常见的队列等待算法,它是操作系统中一种动态优先级调度算法,结合了多种调度策略(如轮转法、优先级调度),旨在平衡响应时间和吞吐量,同时适应不同进程的行为特点(如短作业、交互式作业、长作业)[^3]。 其原理如下: - 设有N个队列(Q1,Q2…QN),各个队列对于处理机的优先级不同,优先级Priority(Q1) > Priority(Q2) > … > Priority(QN) ,即Q1中的任何作业(进程)比Q2中的任何作业(进程)相对于CPU的优先级高,会先被处理机调度,依此类推其他队列[^1]。 - 优先级最低的队列遵循时间片轮转法,该队列有M个作业,它们的运行时间由QN所设定的时间片确定;其他队列遵循先来先服务算法,每一进程分配一定的时间片,若时间片运行完进程未结束,则进入下一优先级队列的末尾[^1]。 - 各个队列的时间片不同,是随着优先级的增加而减少的,即优先级越高的队列时间片越短。为便于超大作业完成,最后一个队列QN(优先级最低的队列)的时间片一般很大 [^1]。 多级反馈队列调度算法的核心要点包括: - **核心思想**:设置多个优先级不同的队列,每个队列有不同的调度策略和时间片大小;进程根据其行为(如占用CPU时间)在队列间升降级,优先级随时间变化;通过观察进程行为动态调整优先级,例如频繁让出CPU的进程可能提升优先级 [^3]。 - **工作原理**: - **队列结构**:队列优先级从高到低逐级递减(如Q0 > Q1 > Q2);高优先级队列时间片较短(如Q0时间片为8ms,Q1为16ms,Q2 为FCFS);通常高优先级队列用轮转法(RR),低优先级队列用先来先服务(FCFS) [^3]。 - **进程调度流程**:新进程进入最高优先级队列(如Q0);若时间片用完进程未执行完,被降级到下一级队列;若进程在时间片内主动让出CPU(如等待I/O),保持当前优先级;仅当高优先级队列时,才会调度低优先级队列的进程 [^3]。 - **防饥饿机制**:定期将所有低优先级队列的进程移动到最高队列,避免长作业饥饿 [^3]。 另外,为解决多级反馈队列调度算法中低优先级队列任务等待过久问题,可引入老化机制。示例代码如下: ```python def aging(self): for priority in range(1, self.num_queues): # 忽略最高优先级队列 for task in list(self.queues[priority]): task.waiting_time += 1 if task.waiting_time > 10: # 阈值 self.queues[priority].remove(task) self.queues[priority - 1].append(task) print(f"Task {task.task_id} aged to queue {priority - 1}") ``` 此代码的作用是在调度器中定期提升低优先级队列中等待时间过长的任务 [^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值