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步来描述:

  1. 应用注册事件

  2. 事件触发通知应用

  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对各个对象和上述角色的对应:

  1. Task 就是对EventHandler的对象化封装。每个Task对象有两个主要的方法:Signal和Run。当服务器希望发送一个事件给某个Task对象时,就会调用Signal()方法;而Run()方法是在Task对象获得处理该事件的时间片后运行的,服务器中的大部分工作都是在不同Task对象的Run()函数中进行的。每个Task对象的目标就是利用很小的且不会阻塞的时间片完成服务器指定某个工作。应用可以通过继承Task 并重写Run()方法实现自己的任务。

  2. EventContext 对应EventGenerator的角色,事件的触发者,当事件发生时,调用Task::signal().

  3. TaskThread 对应EventHandler Driver的角色。任务的驱动线程,对一个或者多个Task进行调度,通过调用 Task::run() 处理事件

  4. EventThread对应Event Driver的角色。EventContext的驱动线程,可以处理多个EventContext, 发生事件时调用EventContext::process_event(),后者将调用Task::Signal()

流程:

    1. Client或者 Task的子类向Event Context注册事件。

    2. Event Context将事件放入EventThread的Pool内。

    3. EventThread 调用select 等待多个事件中任一个触发。

    4. 事件触发以后,EventThread调用 Event Context::process_event()。

    5. 调用 Task::signal()。

    6. Task::signal()将task放入TaskThread的队列。

    7. TaskThread调度相应的Task, 执行其Run()方法。

Darwin Streaming server 的 Task 类的更多相关文章

  1. Darwin Streaming Server 简介

    Darwin Streaming Server     概要 Darwin Streaming Server简称DSS.DSS是Apple公司提供的开源实时流媒体播放服务器程序.整个程序使用C++编写 ...

  2. Darwin Streaming Server 核心代码分析

    基本概念 首先,我针对的代码是Darwin Streaming Server 6.0.3未经任何改动的版本. Darwin Streaming Server从设计模式上看,采用了Reactor的并发服 ...

  3. Darwin Streaming Server Relay Setting

    安装完Darwin Streaming Server,就可以使用VLC通过RTSP协议播放流媒体文件了.但是我现在有一个需求,需要将一台DSS(假设为A机)上的媒体文件发送到另一台DSS(假设为B机) ...

  4. 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 ...

  5. Darwin Streaming Server 安裝操作備忘

    Darwin Streaming Server 安裝操作 Darwin Streaming Server是蘋果公司推出的開放源碼.跨平台多媒體串流伺服器, 提供音樂 (mp3) 與影音 (3gp.mp ...

  6. Linux编译安装Darwin Streaming Server 6.0.3。。。

    目前主流的流媒体服务器有微软的windows media server.RealNetworks的Helixserver和苹果公司的Darwin Streaming Server. 微软的window ...

  7. Linux编译安装Darwin Streaming Server 6.0.3

    买回来VPS后就一直想在上面搭建一个流媒体服务,在网上搜索了很多资料,大部分都是介绍Linux中安装Darwin Streaming Server 5.5.5版本,因为这个版本提供了针对linux的安 ...

  8. Darwin Streaming Server用vs2005编译运行过程

    原创. 一:编译 Darwin6.0.3版本是最新版本,也提供了.dsw文件.但是使用vs2005和vc6是编译不过的.所以,采用Darwin5.5.5版本.使用vc6打开WinNTSupport文件 ...

  9. Darwin Streaming Server 安装流程

    Darwin StreamingServer 安装流程 Darwin StreamingServer 支持开放源代码和基于标准的实时传输协议/实时流协议(RTP/ RTSP).MPEG-4 和MP3 ...

随机推荐

  1. 关于struts2如何去掉默认的后缀(.action)

    struts2是可以配置默认的后缀名的,如http://localhost:8080/test.action,这个是默认的,但是也可以通过配置去修改这个.action为别的. 这里是通过一个常量配置改 ...

  2. MongoDB 性能优化五个简单步骤

    MongoDB 一直是最流行的 NoSQL,而根据 DB-Engines Ranking 最新的排行,时下 MongoDB 已经击败 PostgreSQL 跃居数据库总排行的第四位,仅次于 Oracl ...

  3. HDU 1882 Strange Billboard(位运算)

    题目链接 题意 : 给你一个矩阵,有黑有白,翻转一个块可以让上下左右都翻转过来,问最少翻转多少次能让矩阵变为全白. 思路 : 我们从第一行开始枚举要翻转的状态,最多可以枚举到2的16次方,因为你只要第 ...

  4. DataRow.RowState 属性

    RowState 的值取决于两个因素:已对该行执行的操作的类型,以及是否已对 DataRow 调用了 AcceptChanges. private void DemonstrateRowState() ...

  5. hdu 1133 Buy the Ticket

    首先,记50的为0,100的为1. 当m=4,n=3时,其中的非法序列有0110010; 从不合法的1后面开始,0->1,1->0,得到序列式0111101 也就是说,非法序列变为了n-1 ...

  6. MySQL 当记录不存在时插入(insert if not exists)

    在 MySQL 中,插入(insert)一条记录很简单,但是一些特殊应用,在插入记录前,需要检查这条记录是否已经存在,只有当记录不存在时才执行插入操作,本文介绍的就是这个问题的解决方案.问题:我创建了 ...

  7. hdu1875

    http://acm.hdu.edu.cn/showproblem.php?pid=1875 2 2 10 10 20 20 3 1 1 2 2 1000 1000 给定坐标 //最小生成树 #inc ...

  8. lintcode:Subtree 子树

    题目: 子树 有两个不同大小的二叉树: T1 有上百万的节点: T2 有好几百的节点.请设计一种算法,判定 T2 是否为 T1的子树. 样例 下面的例子中 T2 是 T1 的子树: 1 3 / \ / ...

  9. Xamarin.Android 入门之:Xamarin快速入门

    一. 准备工作 1.新建一个项目取名为phoneword 2.在项目创建好之后,让我们展开“Resources”文件夹然后找到并打开该文件夹下的“layout”文件夹,双击main.axml在Andr ...

  10. amd(超微半导体公司(英语:Advanced Micro Devices, Inc.,缩写:AMD))

    公司名称 AMD(超微半导体公司)   经营范围 CPU.显卡.主板等电脑硬件设备 AMD公司专门为计算机.通信和消费电子行业设计和制造各种创新的微处理器(CPU.GPU.APU.主板芯片组.电视卡芯 ...