Darwin 视频服务器6.0.3代码下载地址: http://dss.macosforge.org/
概述
本文先从理论上介绍几种大并发服务器的设计模式,然后分析Darwin Streaming Server的实现,从而为更好的理解Darwin视频服务器或者设计自己的视频服务器提供技术上的积累。
并发设计模式
阻塞的IO方式效率极低,这里不予讨论。非阻塞的IO分成两种,分别是非阻塞同步IO和非阻塞异步IO,对应的,Reactor和Proactor是高性能并发服务器设计中常见的两种模式,Reactor用于同步IO,Proactor用于异步IO。
无论是Reator还是Proactor,都包含了时间分离器和时间处理器。在接下来的对于Darwin视频服务器的分析中会发现其中也包含了事件分离器和事件处理器。
Darwin流媒体服务器
来看一下DarwinStreamingServer的架构,是不是采用了前面描述的两个模式那。Darwin流媒体服务器是由父进程及其fork出来的子进程构成的,子进程就是核心服务器。父进程的职责就是等待子进程退出。如果子进程出错退出,则父进程就会fork一个新的子进程,从而保证视频服务器继续提供服务。核心服务器的作用是充当VOD客户端与服务器模块之间的接口,VOD客户端采用RTP和RTSP协议向服务器发送请求并接收响应,服务器模块负责处理VOD客户端的请求并向VOD客户端发送数据包。核心服务器通过创建四种类型的线程来完成自己的工作:
- 服务器的主线程(Main Thread)。这个线程负责检查服务器是否需要关闭、记录状态信息、打印统计信息。
- 空闲任务线程(Idle Task Thread)。空闲任务线程管理一个周期性的任务队列。任务队列有两种类型:超时任务和套接口任务。
- 事件线程(Event Thread)。事件线程负责侦听套接口事件,比如收到RTSP请求和RTP数据包,然后把事件传递给任务线程。
- 一个或者多个任务(Task)线程。任务线程从事件线程中接收RTSP和RTP请求,然后把请求传递到恰当的服务器模块进行处理,把数据包发送给客户端。缺省情况下,核心服务器为每一个处理器创建一个任务线程。
其中的事件线程就是Reactor模式中的事件分离器,任务线程就是Reactor中的事件处理器。
参考资料
- Proactor和Reactor模式_继续并发系统设计的扫盲,http://www.cppblog.com/kevinlynx/archive/2008/06/06/52356.html
- QuickTime Streaming Server Modules Programming Guide。
- Douglas C. Schmidt, Reactor - An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events