Darwin架构优化的一点想法

    首先说下我对Darwin架构的一些理解:

    Darwin在对socket、任务、线程等对象封装的基础上,创建一个事件线程来对所有的网络事件进行监听,当监听到网络事件后就向与socket对象绑定的任务对象发送消息即将任务对象添加到Darwin根据cpu个数创建的任务线程的任务队列中,任务线程来循环获取任务队列的任务,调用其Run函数,来实现对socket事件的处理。

另外我们注意到任务线程会根据Run函数的返回值来进行不同的处理,当返回为0时表示当前任务本次执行完毕,这通常是处理socket请求;返回为-1时表示当前任务对象期待被删除,这通常是任务对象超时或者被主动干掉;返回值>0表示当前任务期望在返回值ms后再次被调用,这通常用于周期性的调用。

    Darwin服务器在进行RTSP服务的时候,任务对象或者是用来处理socket的请求,如HTTPSession、RTSPSession,或者是周期性的执行一些操作如RTPSession。


    当同时需要处理socket请求和进行一些定时操作该怎么办?我们看下EasyCamera的EasyCMSSession实现,其Run函数不仅需要处理CMS发来的socket请求,还要定时的向CMS发送快照、心跳保活,其处理方法是(1)使用kTimeoutEvent来实现定时功能(2)Run函数中增加状态kIdle,其想实现的目的是当我们进行socket请求/定时事件的处理时,最开始/最后都会进入到kIdle状态,这样对于下一次的事件会根据不同的事件类型进行不同的处理。

    但实际上是有问题的,一次socket请求的处理从接受数据、处理数据、发送输出、清理这几个环节,可能不会持续进行而被其他事件的处理打断。比如kProcessingMessage状态时有可能返回0,这时来了kTimeoutEvent事件,那么kTimeoutEvent就不会被正常的处理;当然也不能在kProcessingMessage状态返回0的时候将状态粗鲁的置为kIdle,否则socket请求的处理就不能正常的进行。

    此外在CMS的实现中也遇到了这样的问题,一个Session希望向另一个Session的连接发送数据,现在的做法是非阻塞循环发送,这样的做法简直是高效率服务器不能忍受的,能不能通过向任务对象发送消息事件,消息事件中携带数据的方法实现?那么发送什么事件?数据存储在哪?事件什么时间被执行呢?

    这些问题困扰这我,经过一段时间的思考,暂时考虑下面的解决方案:

    1.任务对象的可执行事件必须在开始设计好,比如包括超时事件、自杀事件、socket请求事件、开始事件、更新事件等。

    2.任务对象为每一个(需要的)事件创建事件队列,同时为每一个(需要的)事件创建具体的状态机。

    3.事件的执行相互独立,或者不受干扰。

    4.当需要任务对象执行某个事件时,将其添加到对应的事件队列中,如果当前任务还未添加到任务队列中,则添加。

    5任务对象在执行任务时,如果其事件队列不为空则持续执行,直到为空为止。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值