一种用于直播缓冲的环形队列设想

随着各种盒子的涌现,高清的P2P直播研究开始有些返潮;
在技术上,P2P直播分为几大块,一是资源获取,二是资源的缓冲设计,三是用户间的分发、交互处理,四是播放和呈现
其中,二三比较关键,设计的好坏决定了最终效果;
出于对P2P研究的爱好,一直关注这一块的优化设计,参考的文献也较多(此处省略各种大牛文献列表);
网上充斥着各种环形队列的设计理论,个人感觉写得太高大上了,不是从一个码农真正理解的角度去写
参考tvants的缓冲设计,提出一个类似的环形队列
状态 : #已生产  *未生产
---------------------------------------------------------------------------
状态 |#    |#        |*       |#     |#       |#      |*        |*        |n 
---------------------------------------------------------------------------
游标 |       |         |         |        |^       |        |        |          |
---------------------------------------------------------------------------
序列 |1     |2       |3       |4      |5       |6      |7      |8        |n   
---------------------------------------------------------------------------
数据 |0x01 |0x03 |0x5d |0x24 |0x56 |0x11 |0x55 |0x1F | .....

数据进行分块,每一块为固定大小(如64k)
数据层按seq进行存入与取出(环形存取)

消费者(consumer)
    用于直播播放
    顺序消费,按照直播流的码率进行顺序消费,被消费数据的状态可以是已生产的块,也可以是未生产的块
    消费未生产的块时,视频画面可能会黑屏或花屏
生产者(producer)
    P2P下载数据
    乱序生产,生产者生产消费流标之后的数据,可以乱序多线程生产,但越靠近游票的SEQ生产的优化级越高
观察者(peeker)
    P2P分享数据
    在整个数据层取已生产的数据,目的是分享给其它用户,他不影响序列,不影响游标,不影响状态

按以上设计思路,设计了一个环形队列,经测试,简单大方,实用可靠
请大牛斧正

时间: 2024-11-07 16:25:50

一种用于直播缓冲的环形队列设想的相关文章

环形缓冲区的设计及其在生产者消费者模式下的使用(并发有锁环形队列)

1.环形缓冲区 缓冲区的好处,就是空间换时间和协调快慢线程.缓冲区可以用很多设计法,这里说一下环形缓冲区的几种设计方案,可以看成是几种环形缓冲区的模式.设计环形缓冲区涉及到几个点,一是超出缓冲区大小的的索引如何处理,二是如何表示缓冲区满和缓冲区空,三是如何入队.出队,四是缓冲区中数据长度如何计算. ps.规定以下所有方案,在缓冲区满时不可再写入数据,缓冲区空时不能读数据 1.1.常规数组环形缓冲区 设缓冲区大小为N,队头out,队尾in,out.in均是下标表示: 初始时,in=out=0 队头

【转】环形队列理论

原文链接:http://blog.sina.com.cn/s/blog_8b200d440100xsug.html 环形队列是在实际编程极为有用的数据结构,它有如下特点. 它是一个首尾相连的FIFO的数据结构,采用数组的线性空间,数据组织简单.能很快知道队列是否满为空.能以很快速度的来存取数据. 因为有简单高效的原因,甚至在硬件都实现了环形队列. 环形队列广泛用于网络数据收发,和不同程序间数据交换(比如内核与应用程序大量交换数据,从硬件接收大量数据)均使用了环形队列. 一.环形队列实现原理 --

并发无锁之环形队列生产者消费者问题

1.生产者消费者问题 三种关系:生产者--生产者(互斥):消费者-消费者(互斥):生产者--消费者(互斥同步) 两个角色:生产者:消费者 一种生产场所:缓冲区 2.环形队列(缓冲区) 数据结构:可以有多种,这里选用数组,逻辑上将a[0]和a[size-1]相连构成环形队列 判断空/判断满:当读指针和写指针指向同一个区域为空,或者满(但不能区分空或者满) 两种方案:1.即尾结点与首结点之间至少留有一个元素的空间. 2. 添加一个计数器(信号量就是计数器所以这里用信号量完成计数器的功能) 3.sem

java实现数据结构中的环形队列

最近在看数据结构,队列在数据结构中是个重要的元素. 定义:数据结构是指相互之间存在一种或多种特定关系的数据元素的集合. 队列主要分为普通队列和环形队列,环形队列比普通队列的使用效率更高(普通队列容易造成内存的浪费,时间效率也会降低,主要体现在队列的删除操作上) 下面用java来实现队列,仅供参考 package demo; //环形队列 public class QueueDemo { //创建队列 public QueueDemo(int num){ m_iQueueCapacity=num;

<2014 05 16> 线性表、栈与队列——一个环形队列的C语言实现

栈与队列都是具有特殊存取方式的线性表,栈属于先进后出(FILO),而队列则是先进先出(FIFO).栈能够将递归问题转化为非递归问题,这是它的一个重要特性.除了FILO.FIFO这样的最普遍存取方式外,还有一些扩展的数据结构,如双端队列.双栈.超队列.超栈等,它们是一种扩展与变异结构. 线性表有顺序存储和链接存储两类,这是针对计算机的线性存储空间作出的分类.前者可以是数组,后者可以是链表.字符串是线性表最常见的应用. 这里我用C语言实现了一个基于数组环形队列,它具有固定的队列空间.相比于链表实现,

眉目传情之并发无锁环形队列的实现

眉目传情之并发无锁环形队列的实现 Author:Echo Chen(陈斌) Email:[email protected] Blog:Blog.csdn.net/chen19870707 Date:October 10th, 2014 前面在<眉目传情之匠心独运的kfifo>一文中详细解析了 linux  内核并发无锁环形队列kfifo的原理和实现,kfifo鬼斧神工,博大精深,让人叹为观止,但遗憾的是kfifo为内核提供服务,并未开放出来.剑不试则利钝暗,弓不试则劲挠诬,鹰不试则巧拙惑,马不

【转】缓冲区设计--环形队列

原文链接:http://blog.csdn.net/billow_zhang/article/details/4420789 在程序的两个模块间进行通讯的时候,缓冲区成为一个经常使用的机制. 如上图,写入模块将信息写入缓冲区中,读出模块将信息读出缓冲区.这样使得: 将程序清晰地划分模块,建立良好的模块化架构,使得写入和读出成为高聚合,低耦合的模块. 对于写入和读出的处理可能产生的快慢不均匀的情况进行平衡,使得整个处理的速度趋于平滑的均匀状态,避免出现读出模块处理的慢速使得写入模块等待使得响应速度

linux内核之Kfifo环形队列

1.前言 最近项目中用到一个环形缓冲区(ring buffer),代码是由linux内核的kfifo改过来的.缓冲区在文件系统中经常用到,通过缓冲区缓解cpu读写内存和读写磁盘的速度.例如一个进程A产生数据发给另外一个进程B,进程B需要对进程A传的数据进行处理并写入文件,如果B没有处理完,则A要延迟发送.为了保证进程A减少等待时间,可以在A和B之间采用一个缓冲区,A每次将数据存放在缓冲区中,B每次冲缓冲区中取.这是典型的生产者和消费者模型,缓冲区中数据满足FIFO特性,因此可以采用队列进行实现.

环形队列高效触发大量超时任务的算法实现

基于环形队列的超时触发算法只需要一个timer即可实现批量超时任务的触发,CPU消耗低,效率高.下面是此算法的简单实现. 1,TaskHolder.java package com.zws.timer; /**  *   * @author wensh.zhu  * @date 2018-04-22  */ public class TaskHolder { /** 任务所需等待的圈数,即任务需要走几圈**/ private int cycles; private int delays; pri