Darwin Streaming server 的 Task 类
Darwin Streaming Server 是一个开放源代码的streaming server,对于streaming server的编程和软件结构有着一定的参考价值,它是使用C++写的,其中的并发模式的核心就是Task类,下面写一下我的理解:
多任务的程序常常采用线程+同步阻塞IO的模式, 每个线程/进程服务于一个client,使用阻塞式的IO:
这种模式对于交互式的长连接应用也是常见的选择(比如Telnet)。好处是实现极其简单,容易嵌入复杂的交互逻辑。Apache、ftpd 等都是这种工作模式。但是这种策略很能难足高性能程序的需求。
在handle大量用户的情况下,为了避免创建过多的线程导致context switch开销,常常采用select I/O复用的方法(你可能说select过时了,不过Darwin QTSS就是用的这个):
上面是经典的select IO复用的过程, 以上的过程可以由3步来描述:
应用注册事件
事件触发通知应用
应用运行处理事件
注意在SELECT THREAD有3个任务:接受事件注册,等待事件触发,驱动SESSION处理事件,这些任务可以分解为不同的角色,我们可以在这种模式里定义4种角色:
1. EventHandler : EventHandler 向 EventGenerator注册事件,并对注册事件进行处理
2.EventGenerator :EventGenerator接受事件注册,当事件触发的时候,通知 EventHandler
3.EventHandler Driver : EventHandler Driver 驱动EventHandler 的运行,当它发现有EventHandler 受到事件触发以后,调度运行 EventHandler 的事件处理函数。一个EventHandler Driver可以驱动多个EventHandler。多个EventHandler Driver可以组成 Pool 进行驱动EventHandler。
4. Event Driver : Event Driver 驱动 EventGenerator 的事件触发。EventGenerator本身不包含执行线程,需要Event Driver的驱动。多个EventGenerator 在 Event Driver 中等待事件,当事件发生时,Event Driver调度 EventGenerator的来触发事件。
下面就是Darwin对各个对象和上述角色的对应:
Task 就是对EventHandler的对象化封装。每个Task对象有两个主要的方法:Signal和Run。当服务器希望发送一个事件给某个Task对象时,就会调用Signal()方法;而Run()方法是在Task对象获得处理该事件的时间片后运行的,服务器中的大部分工作都是在不同Task对象的Run()函数中进行的。每个Task对象的目标就是利用很小的且不会阻塞的时间片完成服务器指定某个工作。应用可以通过继承Task 并重写Run()方法实现自己的任务。
EventContext 对应EventGenerator的角色,事件的触发者,当事件发生时,调用Task::signal().
TaskThread 对应EventHandler Driver的角色。任务的驱动线程,对一个或者多个Task进行调度,通过调用 Task::run() 处理事件
EventThread对应Event Driver的角色。EventContext的驱动线程,可以处理多个EventContext, 发生事件时调用EventContext::process_event(),后者将调用Task::Signal()
流程:
Client或者 Task的子类向Event Context注册事件。
Event Context将事件放入EventThread的Pool内。
EventThread 调用select 等待多个事件中任一个触发。
事件触发以后,EventThread调用 Event Context::process_event()。
调用 Task::signal()。
Task::signal()将task放入TaskThread的队列。
TaskThread调度相应的Task, 执行其Run()方法。
Darwin Streaming server 的 Task 类的更多相关文章
- Darwin Streaming Server 简介
Darwin Streaming Server 概要 Darwin Streaming Server简称DSS.DSS是Apple公司提供的开源实时流媒体播放服务器程序.整个程序使用C++编写 ...
- Darwin Streaming Server 核心代码分析
基本概念 首先,我针对的代码是Darwin Streaming Server 6.0.3未经任何改动的版本. Darwin Streaming Server从设计模式上看,采用了Reactor的并发服 ...
- Darwin Streaming Server Relay Setting
安装完Darwin Streaming Server,就可以使用VLC通过RTSP协议播放流媒体文件了.但是我现在有一个需求,需要将一台DSS(假设为A机)上的媒体文件发送到另一台DSS(假设为B机) ...
- Darwin Streaming Server 6.0.3安装、订制、插件或模块
How to setup Darwin Streaming Server 6.0.3 on 32 or 64 bit Linux platforms, add custom functionality ...
- Darwin Streaming Server 安裝操作備忘
Darwin Streaming Server 安裝操作 Darwin Streaming Server是蘋果公司推出的開放源碼.跨平台多媒體串流伺服器, 提供音樂 (mp3) 與影音 (3gp.mp ...
- Linux编译安装Darwin Streaming Server 6.0.3。。。
目前主流的流媒体服务器有微软的windows media server.RealNetworks的Helixserver和苹果公司的Darwin Streaming Server. 微软的window ...
- Linux编译安装Darwin Streaming Server 6.0.3
买回来VPS后就一直想在上面搭建一个流媒体服务,在网上搜索了很多资料,大部分都是介绍Linux中安装Darwin Streaming Server 5.5.5版本,因为这个版本提供了针对linux的安 ...
- Darwin Streaming Server用vs2005编译运行过程
原创. 一:编译 Darwin6.0.3版本是最新版本,也提供了.dsw文件.但是使用vs2005和vc6是编译不过的.所以,采用Darwin5.5.5版本.使用vc6打开WinNTSupport文件 ...
- Darwin Streaming Server 安装流程
Darwin StreamingServer 安装流程 Darwin StreamingServer 支持开放源代码和基于标准的实时传输协议/实时流协议(RTP/ RTSP).MPEG-4 和MP3 ...
随机推荐
- spoj 138
离散化 去掉重复点 排序 二分查找 #include<cstdio> #include<cstring> #include<algorithm> #define ...
- ZOJ3765 Lights Splay树
非常裸的一棵Splay树,需要询问的是区间gcd,但是区间上每个数分成了两种状态,做的时候分别存在val[2]的数组里就好.区间gcd的时候基本上不支持区间的操作了吧..不然你一个区间里加一个数gcd ...
- ubuntu下安装spark1.4.0
构建在hadoop2.6.0之上的 1.在官网下载spark-1.4.0-bin-hadoop2.6.tgz 2.解压到你想要放的文件夹里,tar zxvf spark-1.4.0-bin-hadoo ...
- Project Euler 83:Path sum: four ways 路径和:4个方向
Path sum: four ways NOTE: This problem is a significantly more challenging version of Problem 81. In ...
- ASP.NET MVC 3 初认知
什么是ASP.NET MVC 1. asp.net mvc 是微软官方提供的mvc模式编写asp.net web应用程序的框架. 2. 是微软既asp.net webForm 后的又一种开放方式,而非 ...
- jquery通过ajax-json访问java后台传递参数,通过request.getParameter获取不到参数的说明
http://m.blog.csdn.net/blog/eyebrother/36007145 所以当后台通过request.getParameter("name");对参数值的作 ...
- Dropbox 有哪些鲜为人知的使用技巧?
作者:Feeng链接:http://www.zhihu.com/question/20104959/answer/13991578来源:知乎著作权归作者所有,转载请联系作者获得授权. 原文:The B ...
- 嵌入式控制(0)----linux系统网络配置
嵌入式系统本身具有操作系统的全部属性,但收到其硬件条件制约,故需要主机通过串口/网口等方式与其通信.今日下午的工作主要是linux系统的ssh传输配置,nfs服务器配置,tftp服务器配置. ip的概 ...
- YUV到RGB的转换
以下内容来源于网络,下面三个链接里的内容是比较好的,感谢博主的分享. http://blog.csdn.net/housisong/article/details/1859084 http://blo ...
- iosblock用法
看了很多的block用法,还是小糊涂. 最后还是自己尝试吧. #import "FirstViewController.h" @interface FirstViewControl ...