b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

osip_osip解析_sip 200ok包(2)

电脑杂谈  发布时间:2017-04-01 15:05:52  来源:网络整理

__osip_transaction_add_event(),

osip_xxx_execute()

修改时需要注意不要将事务重复添加到活动列表里,以尽量减少活动列表的长度。当osip_xxx_execute()函数从活动列表里取出一个事务后便删除该事务,这样在函数执行完毕后,活动列表就是空的了,保证该列表一直处于低长度下。因此实际上经过测试发现函数__osip_remove_xxx_transaction()里不需要再次试图从活动列表里删除事务了,但为了保险起见,这部分代码我还没有去除。另外,要注意函数__osip_transaction_add_event()的修改,这里可能会遇到信号量的问题。之后对定时器的优化时会提到。

经过以上的修改,测试协议栈性能有显著的提高,经过统计osip_xxx_execute()这四个函数执行时间减少到了之前的一半。它怎么就才一半呢?继续看这个函数osip_transaction_execute(),它是osip_xxx_execute()最终调用的事务处理函数,原来函数fsm_callmethod()(这个函数定位具体的fsm并调用)是用已知的状态和事件类型查找列表的方式来调用实际的fsm的,还不赶快改成数组的,别节约内存了。osip这里需要改动xxx_fsm.c中的的__xxx_load_fsm()和__xxx_unload_fsm()函数以及fsm_callmethod()函数。改动比较繁琐,注意不要改错了哦:)

最后再次测试,四个状态机执行函数osip_xxx_execute()的执行事件已经减少到原来的1/4了。以上的改动之后,对于事务的处理基本上克服了事务数增多导致的性能非线性下降的因素。

1.3 超时事件的产生

Osip的定时器超时事件是通过轮询所有事务的每个定时器而产生,然后将其放入事务列表(注意,这里可能需要将事务放入活动列表,因为之前事务处理完成后是从活动列表里删除了的),而每次SIP消息的事件唤醒协议栈后都会触发定时器遍历操作的执行,可见定时器的效率非常低下,并且大部分的定时器通常都不会超时。

改进的方法就是给osip增加一个定时器模块,这里大家可以参考相对定时器的实现。主要的思想就是将所有定时器进行排序,最先超时的放在前面,这样在触发定时器事件的时候通常只需要判断一下最前面的那个定时器。这对于osip定时器效率的提升大有帮助,虽然在启动定时器的时候要考虑排序的问题,至少在我的测试中这里的消耗还不至于影响到总体性能。当然,精益求精的你可能会考虑双向有序链表的插入问题了,如果有好的解决方法可别忘了通知我啊,呵呵。当然,为了尽量减少这类消耗,我的实现是按RFC3261规定的osip四种状态机下的定时器种类分类,所有同类的定时器都放到同一个定时器组(这个要取决于你实现的定时器了),启动定时器的时候是从链表的后面开始,通常在定时器长度相同的情况下,新加入的定时器总是最后超时,那么它就应该放到链表的最后位置。这样,一定程度的减少了启动定时器时的消耗,当然有几个重发请求的定时器的超时事件是变的,不过这已经没多大影响了,毕竟重发请求又不是经常要发生的。

对定时器的优化改动可能会比较多。你需要参考RFC3261,在相应的状态下启动或者停止对应的定时器。为了不对源代码作过多的修改,你需要添加两类回调函数,一是进入某个状态时,二是退出某个状态的时候,然后将定时器的起停操作放到这些回调函数里去,最后由函数__osip_transaction_set_state()来调用。

具体的改动涉及到xxx.c和xxx_fsm.c,我将状态切换回调函数(起停定时器)放到了xxx_fsm.c里,定时器超时回调函数(产生定时器事件)放到了xxx.c里。最后,用定时器组的触发函数(取决于你设计的定时器)替换掉四个定时器执行函数


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-38863-2.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...