PQ(Priority queuing优先级队列)

                    PQ(Priority queuing优先级队列)


                                      一种很传统,但不能不谈的队列


PQ是一种具备严格的,分等级执行调度的队列,它可以最多创建4个不同等级的队列,分别是高、中、普通、低;然后根据对不同的数据流量分类,将不同的分类数据送入到4个不同等级的队列。如图X所示,然后以100%的使用带宽的方式,首先服务于处于“高”队列中的数据,直到“高”队列中的数据全部发送完成,再服务于“中”队列中的数据,以此类推,再服务于“普通”队列,最后才是“低”队列。按照这样的逻辑,PQ队列的最大特点是高优先级的队列总是被服务,那么这可能会导致低优先级队列中的数据被“饿死”,为什么呢?如果高优先级队列一直持续发送数据,那么PQ的调度器,将保证高优先级的队列数据发送完成后,才能轮到较低优先级的队列发送,换而言之,处于“低”等级队列中的数据,必须要等待“高”、“中”、“普通”这三个队列的数据全部被发送完成后,“低”等级队列中的数据才能发送。所以说处于“低”等级队例的数据很容易被“饿死”,导致该队列中的数据一直得不到服务,最终的结果将是应用服务暂停或者终止。

关于优先级队列PQ的注意事项:

第一、PQ的队列被充满时,它将采取尾弃;第二、PQ的队列长度可以被设置为0,如果把PQ的队列长度设置为0,这是意味着队列的长度不受限制,直到用完路由器的内存为止,当内存被用完后,那么数据将不能被送入队例,换而言之,内存没被用完之前,数据包都能被送入队列排队,并且不会丢弃数据包,所认值0并不是说该队列没长度,但是请记住:别那么干,因为当路由器的内存被用完的后果,比数据包不能进入队例更严重;第三、PQ中4个队列默认的长度分别是:高20 中40 普通60 低80;第四、四个不同优先级的队列中的数据调度时,从整体队列这个角度讲是从高到低,但是如果一串数据都属于同一个级别的队列,比如都属于High队列,那么在这个high队列中的数据将采取FIFO逻辑完成调度。第五、PQ使用三层的ACL或者接入接口、包大小、TCP和UDP的端口号来分类,没有被明确申明的数据流量将被分类到“默认”类。

注意:如果没有发生拥塞,从技术角度讲就是硬件TX队列没有被充满时,那么数据将直接送入TX队列,将不会使用PQ,请记住,只有在硬件队列被充满时才会启动软件排队PQ 是一种很早、很传统的队列方式,当时产生PQ时还没有后面所描述的CBWFQLLQ的产生,所以在在那一定年代中使用PQ来确保一些重要的服务被高质量的保障,但是现今使用PQ的机率已经很少了,因为它被本书后面将要描述的LLQ(低延迟队列)所代替,这样做的目标就是能保证重要数据首先被发送的同时,也不至于“饿死”其它队列的数据。

 

取证演示:配置PQ队列及影响数据传输的效果

 

演示目标:

1模拟一个可能产生拥塞的低速链路,并在该链路中持续的发送高压流量。

2取证先进先出(FIFO)队列对该环境假定的重要数据(ICMP)传输的不良影响。

3 配置PQ队列将重要数据分类到“高”优先队列。

4 再次观察重要数据的传输延迟,确定PQ对数据传输的影响

5 使用debug工具取证不同的实时数据分类被送到了不同等级的队列。

演示环境:仍然使用“取证演示:FIFO队列影响数据传输的效果”相同的实验环境。

演示步骤:

 

R1(config)#access-list 101 permit icmp host192.168.2.100 host 192.168.4.2

R1(config)#access-list 101 permit udp anyany eq rip

R1(config)#priority-list 1 protocol ip highlist 101

R1(config)#priority-list 1 protocol httpmedium

R1(config)#priority-list1 protocol pppoe normal

R1(config)#priority-list 1 default low

R1(config)#intes1/0

R1(config-if)#priority-group 1

R1(config-if)#exit

时间: 2024-11-12 15:36:54

PQ(Priority queuing优先级队列)的相关文章

初学图论-Dijkstra单源最短路径算法基于优先级队列(Priority Queue)的实现

这一次,笔者使用了STL库中的优先级队列(Priority Queue)来完成Dijkstra算法中extract-min()语句(即从未选中的节点中选取一个距离原点s最小的点)的功能.由于优先级队列的插入.删除操作只需要logn的时间花费,因此降低了不少运行时间. 本文使用C++实现了这一基本算法.参考<算法导论>第24.3节. /**  * Dijkstra's Single Source Shortest Path Algorithm in C++  * Time Cost : O(Ml

优先级队列(Priority Queue)

优先级队列(Priority Queue) 注:队列是一种特征为FIFO的数据结构,每次从队列中取出的是最早加入队列中的元素.但是,许多应用需要另一种队列,每次从队列中取出的应是具有最高优先权的元素,这种队列就是优先级队列(Priority Queue),也称为优先权队列. 1. 优先级队列的概念 1.1 优先级队列的定义 优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最高优先权的元素. 1.2 优先级队列的特点 优先级队列是0个或多个元素的集合,每个元素都有一个优先权或值

什么是优先级队列(priority queue)?

有时候我们需要在某个元素集合中找到最小值和最大值 .优先级队列抽象数据(Priority Queue ADT)模型是我们能够使用的方法之一,这是一种支持插入和删除最小值(DeleteMin)或者最大值(DeleteMax)的数据结构. 这两个操作和队列中的进队(EnQueue)和出队(DeQueue)操作很相似.区别就在于,在优先级队列中,数据进入的顺序与他们接受处理的顺序可能不同.就像工作日程,一般是按重要程度排序而不是到来顺序. 在优先级队列中,如果最小的元素总是优先级最高(即最小元素先出列

初学算法-基于最小堆的优先级队列C++实现

笔者近日实现了最小堆类及其派生的优先级队列,特将代码奉上,不足之处还请指出! 在实现优先级队列时,笔者表示萌萌哒没有用过template写派生类,结果写完了出现error: *** was not decleared in this scope..后来各种补上this->才完事,在CSDN(笔者的帖子地址? http://bbs.csdn.net/topics/391806995)上提问后才知道是模板参数依赖,笔者表示涨姿势了.. /**  * The Minimum Heap Class an

优先级队列与堆排序

转自:http://www.cnblogs.com/yangecnu/p/Introduce-Priority-Queue-And-Heap-Sort.html 在很多应用中,我们通常需要按照优先级情况对待处理对象进行处理,比如首先处理优先级最高的对象,然后处理次高的对象.最简单的一个例子就是,在手机上玩游戏的时候,如果有来电,那么系统应该优先处理打进来的电话. 在这种情况下,我们的数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象.这种数据结构就是优先级队列(Pri

第十章笔记&#183;优先级队列

需求与动机 什么是优先级队列 优先队列是计算机科学中的一类抽象数据类型.优先队列中的每个元素都有各自的优先级,优先级最高的元素最先得到服务:优先级相同的元素按照其在优先队列中的顺序得到服务.优先队列往往用堆来实现. --wikipedia 应用需求 在医院门诊,如果只有一个医生,多位病人.按照通常流程来说,采用先到先服务的顺序(FIFO).但是如果病人中有人患有心脏病,那么显然这个病人需要得到优先治疗. 在计算机系统中,绝大多数支持多任务,这种多任务调度也类似于医院门诊.CPU相当于医生,计算任

浅谈算法和数据结构: 五 优先级队列与堆排序

转载自:http://www.cnblogs.com/yangecnu/p/Introduce-Priority-Queue-And-Heap-Sort.html 浅谈算法和数据结构: 五 优先级队列与堆排序 在很多应用中,我们通常需要按照优先级情况对待处理对象进行处理,比如首先处理优先级最高的对象,然后处理次高的对象.最简单的一个例子就是,在手机上玩游戏的时候,如果有来电,那么系统应该优先处理打进来的电话. 在这种情况下,我们的数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是

优先级队列Priority_queue

定义 拥有权值观点的queue,,一个是返回最高优先级对象,一个是在底端添加新的对象.这种数据结构就是优先级队列(Priority Queue) . 实现 利用max_heap完成,以vector表现的完全二叉堆.max_heap可以满足priority_heap所需要的依照权值高低自动递减的特性. 二叉堆 二叉堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点. 有了这一性质,那么二叉堆上最大值就是根节点了. 二叉堆的表现形式:我们可以使用数

Rabbitmq中的优先级队列操作

1.%% 普通队列操作 in(X, 0, {queue, [_] = In, [], 1}) ->{queue, [X], In, 2}; in(X, 0, {queue, In, Out, Len}) when is_list(In), is_list(Out) -> {queue, [X|In], Out, Len + 1}; 优先级队列操作: in(X, Priority, Q = {queue, [], [], 0}) -> in(X, Priority, {pqueue, []