队列,循环队列,乒乓队列区别
很久以前就想说一说这哥仨的区别了,可是奈何懒癌间歇性发作,对这个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空出来可用,这边会立马使用