http://www.cnblogs.com/MikeZhang/archive/2012/08/16/ReactorPattern20120815.html
Reactor模式在DSS中的体现
Darwin流媒体服务器是由父进程及其fork出来的子进程构成的,子进程就是核心服务器。父进程的职责就是等待子进程退出。如果子进程出错退出,则父进程就会fork一个新的子进程,从而保证视频服务器继续提供服务。核心服务器的作用是充当VOD(视频点播)客户端与服务器模块之间的接口,VOD客户端采用RTP和RTSP协议向服务器发送请求并接收响应,服务器模块负责处理VOD客户端的请求并向VOD客户端发送数据包。
在DSS中,除主线程以外,还有有三种类型的线程:
-
TaskThread:TaskThread通过运行Task类型对象的Run方法来完成相应Task的处理。典型的Task类型是RTSPSession和RTPSession。TaskThread的个数是可配置的,缺省情况下TaskThread的个数与处理器的个数一致。等待被TaskThread调用并运行的Task放在队列或者堆中。
-
EventThread:EventThread负责侦听套接口事件,在DSS中,有两种被侦听的事件,分别是建立RTSP连接请求的到达和RTSP请求的到达。对于RTSP连接请求的事件,EventThread建立一个RTSP
Session,并启动针对相应的socket的侦听。对于RTSP请求的事件,EventThread把对应的RTSPSession类型的Task加入到TaskThread的队列中,等待RTSP请求被处理。 -
IdleTaskThread:IdleTaskThread管理IdleTask类型对象的队列,根据预先设定的定时器触发IdleTask的调度。TCPListenerSocket就是一个IdleTask的派生类,当并发连接数达到设定的最大值时,会把派生自TCPListenerSocket的RTSPListenerSocket加入到IdleTaskThread管理的IdleTask队列中,暂时停止对RTSP端口的侦听,直到被设定好的定时器触发。
下图是Darwin Streaming Server核心架构的示意图。在这个示意图中有三种类型的要素,分别是线程,Task队列或者堆,被侦听的事件。
其中,事件线程(Event thread)是Event Demultiplexer(事件分离器),任务线程(Task threads)是Event Handler(事件处理器)。
这里的主线程(Main thread)就是Reactor模式中的Reactor(Initiation Dispatcher)。