EasyDarwin开源流媒体服务器高性能设计之无锁队列
本文来自EasyDarwin团队Fantasy(fantasy(at)easydarwin.org)
一. EasyDarwin任务队列实现
EasyDarwin的任务队列是通过OSQueue类来组织的,操作方法有
EnQueue()插入一个节点
DeQueue()弹出一个节点
外面再经过一层封装,OSQueue_Blocking(),该类对OSQueue的操作都是加锁的,线程池的线程都是各自维护自己的队列,EventContext主循环往里投递事件,线程读取,处理。一边写一边读理论上来讲不需要加锁,但是这里加锁了。
原因是这样的,我们看EnQueue和DeQueue的实现,队列的前后两个队列之间是有联系的,有fNext和fPrev的关系,如果在读的时候,删除了fNext节点,就会出现空指针访问,导致段错误,这个就像是STL迭代器失效。
二. 针对一读一写去锁问题
大家可以学习一下内核的RCU机制,http://blog.csdn.net/nevil/article/details/7718375,通过缓存多份内存的方法避免读写冲突,举个很简单的例子,两个进程需要访问同一片共享内存,为了提高效率,我们不加锁(因为这两个进程都不能阻塞),A会定时更新共享内存,B会查询内存中的数据,A更新内存的操作不是原子操作,也就是说可能出现A更新一半,或者还没更新刚刚清空内存的时候,B来查询了,这样就会出现错误的结果。于是我们申请两块内存,A写的时候写内存块1,B查询内存块2,然后更换这两块内存的角色,这样就不会有冲突了。
三. EasyDarwin无锁队列实现
实现起来也比较简单,定一个合适长度的任务数组,目前定的是64
**#define MAX_QUEUE_ELEMS 64**
CyclicElem elems[MAX_QUEUE_ELEMS];
实现和OSQueue一模一样的接口
GetLength()获取有效任务个数
EnQueue()插入任务
DeQueue()弹出任务
int iread_pos;
int iwrite_pos;
int ivalid_elems; //定义读写位置,和有效元素个数变量。
初始化的时候都是0,如果处理的速度大于插入的速度,将不会有冲突,当读的速度小于写的速度的时候(这种情况下,我们认为队列超载,将丢弃任务),因此实现的时候,只要判断当写位置下一个位置就是读的位置的时候,我们认为写已经超过读一圈了,任务队列已满。具体实现在OSQueue.h中。
获取更多信息
Copyright © EasyDarwin.org 2013-2016

EasyDarwin开源流媒体服务器高性能设计之无锁队列的更多相关文章
- EasyDarwin开源流媒体服务器将select改为epoll的方法
本文来自EasyDarwin团队Fantasy(fantasy(at)easydarwin.org) 一. EasyDarwin网络模型介绍 EventContext负责监听所有网络读写事件,Even ...
- NodeJS版本EasyDarwin开源流媒体服务器开发心得
title: Node版本EasyDarwin开发心得 date: 2018-03-27 22:46:15 tags: 年后着手Node版本EasyDarwin的开发工作,截止到今天2018年03月2 ...
- EasyDarwin开源流媒体服务器Golang版本:服务端录像功能发布
EasyDarwin开源流媒体服务器(www.easydarwin.org)现在使用Go版本实现了.最新的代码提交,已经支持了推流(或者拉流)的同时进行本地存储. 本地存储的原理,是在推流的同时启动f ...
- EasyDarwin开源流媒体服务器Golang版本:拉转推功能之拉流实现方法
EasyDarwin开源流媒体服务器(www.easydarwin.org),拉转推是一个很有意义的功能,它可将一个独立的RTSP数据源"拉"到服务器,再通过转发协议转发给多个客户 ...
- EasyDarwin开源流媒体服务器实现RTSP直播同步输出MP4、RTMP、HLS的方案思路
背景 近期跟开源团队商量,想在EasyDarwin上继续做一些功能扩展,目前EasyDarwin开源流媒体服务器只能够实现高效的RTSP推流直播转发/分发功能,输入与输出都是RTSP/RTP流,不能够 ...
- EasyDarwin开源流媒体服务器性能优化之Work-stealing优化方案
本文转自EasyDarwin开源团队成员Alex的博客:http://blog.csdn.net/cai6811376/article/details/52400226 EasyDarwin团队的Ba ...
- 解决用EasyDarwin开源流媒体服务器做HLS直播时Flash Player卡住的问题
最近在开发EasyDarwin开源流媒体服务器HLS直播的时候发现一个现象:在PC上用flash player播放HLS和在ios上面播放HLS时,效果明显不同,在ios上播放非常稳定,而在flash ...
- EasyDarwin开源流媒体云平台设计与实现(分布式+负载均衡)
前言 早在2013年我就设计了一套架构非常简单的分布式流媒体服务器平台<基于Darwin实现的分布式流媒体直播服务器系统>,当时的考虑如今看来有诸多的细节点没有考虑到:1.CMS是单点部署 ...
- EasyDarwin开源流媒体服务器提供的TS切片/HLS直播打包库
EasyHLS Github:https://github.com/EasyDarwin/EasyHLS EasyHLS是什么? EasyHLS是EasyDarwin开源流媒体社区开发的一款HLS打 ...
随机推荐
- 【CF387D】George and Interesting Graph(二分图最大匹配)
题意:给定一张n点m边没有重边的有向图,定义一个有趣图为:存在一个中心点满足以下性质: 1.除了这个中心点之外其他的点都要满足存在两个出度和两个入度. 2.中心 u 需要对任意顶点 v(包括自己)有一 ...
- netsh配置Windows防火墙(advfirewall)
有人可能会说,Windows防火墙有非常友好的用户界面,为什么要使用命令行界面来配置一个Windows防火墙?有 个人认为有一下原因(撇开有的人喜欢命令行不喜欢界面的 , o(∩_∩)o 哈哈) Fi ...
- 42深入理解C指针之---指针与队列
一.借助第40指针与链表的相关内容,稍微修改即可: 1.定义头文件queue.h代码如下: #include <stdlib.h> #include <stdio.h> #if ...
- Django迁移数据库
我们已经编写了博客数据库模型的代码,但那还只是 Python 代码而已,Django 还没有把它翻译成数据库语言,因此实际上这些数据库表还没有真正的在数据库中创建 为了让 Django 完成翻译,创建 ...
- 在tomcat发布项目遇到的问题
今天从SVN上把系统导入本地发生了异常,问题如下: java.math.BigInteger cannot be cast to java.lang.Long 百度一番后发现是因为使用Mysql8.0 ...
- NLP项目
GitHub NLP项目:自然语言处理项目的相关干货整理 自然语言处理(NLP)是计算机科学,人工智能,语言学关注计算机和人类(自然)语言之间的相互作用的领域.本文作者为自然语言处理NLP初学者整理了 ...
- 《从0到1》读书笔记第一章"未来的挑战"第2记:做老子还是做孙子
从1到N VS 从0到1 - 别让自己的小鸡鸡抓在别人的手上 近几年国内互联网创业上非常流行一种C2C(也就是Copy to China - 复制到中国)的创业模式,打的就是一个时间差和地域差.将在国 ...
- c++程序猿经典面试题(2)
1.以下程序的输出结果是? #include<stdio.h> main(){ int b=3; int arr[]={6,7,8,9,10}; int *ptr=arr; *(ptr++ ...
- const、typedef 、 define总结
constkeyword const=read only,修饰的为仅仅读变量而不是常量.const修饰的变量不能用作数组的维数也不能放在switch语句的case:之后. 主要作用有: 1.通过把不希 ...
- jsp中获取spring 管理的bean(通过config)
WebApplicationContext wac = (WebApplicationContext)config.getServletContext().getAttribute(WebApplic ...