队列,循环队列,乒乓队列区别

很久以前就想说一说这哥仨的区别了,可是奈何懒癌间歇性发作,对这个task是视而不见,汗颜。。好了,废话不说了,进入正题。

首先,先看最基础的队列:

队列嘛,内部使用数组实现的话,无非是从头部读取,在尾部插入

但是有一个缺点,就是队列经过若干次的读取后,前面明明还有空间,却不能再使用了

解决这个问题的直观办法就像这样

 

 就是每删除一个头,后面的所有元素往前移动一位。现实生活中的确是这样,前面的人走了,后面的人顶上去。

但是,这个方法是有问题的,这种方法带来了复制元素的开销,当队列很大时,将会带来严重的性能问题。

因此,为了解决这个问题,循环队列(也叫循环缓冲区)应运而生。其特点是,使用读指针和写指针来完成队列头和队列尾部的判断

这样就没有了复制元素带来的开销了,本质上还是对一个队列的读写过程的优化和改进。

 

那么乒乓缓冲区又是什么鬼呢,它对应的是个什么场景呢?

 

乒乓缓冲区的原理,其实和显示上常用的双缓冲技术本质上是一样的。

 

有AB两个缓冲区,CPU写完A的时候,让DMA去A搬运数据,类似于把A的bufefr送显示,然后写B, 写完B的时候,把B送DMA,  注意这里送DMA是指送到DMA的一个处理队列中;对DMA来说,先处理A , 处理完后,把A还给CPU(信号,condition variable等), 然后处理B.

CPU处理完AB后,如果没有DMA处理完的消息同步过来,可以处于idle状态,让出CPU处理别的事情。一旦有buffer空出来可用,这边会立马使用

 

posted on 2019-12-15 19:03  疾速瓜牛  阅读(916)  评论(1编辑  收藏  举报

导航