TIM中c2s的事件反应模型

简介:
为了更容易理解后面的内容,先给出登录jabber服务器的交互包。
登录的xml片断

S:是server发给client的包,C:是Client to Server

Wildfire中采用的是per requst per thread的模型(确切的说是处理一个请求,需要两个线程),这种设计的缺陷是显而易见的,但优势是易于编码。当新的物理连接建立之后,一直都有线程专门对应这个连接做业务处理,直到完成全部业务后断开连接,销毁线程。
为了让单机能服务的连接数最大,TIM中不采用per thread per request的模型,而采用的是Reactor模型(ACE中已实现,更多参阅POSA2),在尽量少的线程中应答请求,避免多线程带来的开销。
由于这个原因,在应用层必须设计一个可靠的事件分配机制,将收到的包分给适当的处理器。
我的想法是坚决杜绝业务处理过程中阻塞线程。由于Reactor的特性,业务处理过程默认是在Reactor自身运行的thread中进行,如果该线程被业务处理过程阻塞,Reactor也无法监视更多的句柄状态,系统整体性能会受到严重的影响。参照前面的xml,设想如下情况,server发出标示,希望接收到客户端的验证串,在此时阻塞等待句柄的可读状态,并试图接收数据。在正常情况下,client会立刻发送验证包给server,server接收到后继续进行其他处理。这个过程看起来很流畅。但是,如果client不发送任何数据过去,server会一直处于阻塞态,线程主控权永远也不会交还给Reactor的主循环,明显这个模型是脆弱的,我们无法防止恶意用户,即使是使用超时来防止永久阻塞,系统整体性能也会受到极大影响。

未完待续...
目录
相关文章
|
9月前
QT自定义信号,信号emit,信号参数注册
使用signals声明返回值是void在需要发送信号的地方使用emit 信号名字(参数)进行发送在需要链接的地方使用connect进行链接ct进行链接。
93 0
QT自定义信号,信号emit,信号参数注册
STM32学习笔记(4) 高级定时器-两路互补的PWM输出(带死区和刹车控制)
原理:当捕捉到信号的跳变沿时,将CNT的值所存到捕获寄存器CCR中,然后把两次的值相减,就可以得到脉宽或者频率。
1721 0
STM32中断与事件的理解
STM32中断与事件的理解
420 1
STM32F103C8 TIM输入捕获
STM32F103C8 TIM输入捕获
121 0
|
缓存 程序员 内存技术
STM32定时器配置(TIM1-TIM8)高级定时器+普通定时器,定时计数模式下总结
STM32定时器配置(TIM1-TIM8)高级定时器+普通定时器,定时计数模式下总结
873 0
MSP430F5529库函数定时器A——捕获实验
MSP430F5529库函数定时器A——捕获实验
297 0
【STM32】基本定时器TIM6&TIM7自定义时长
【STM32】基本定时器TIM6&TIM7自定义时长
202 0
【STM32】通用定时器TIM2-TIM5中断配置方式+继电器控制
【STM32】通用定时器TIM2-TIM5中断配置方式+继电器控制
491 0
【STM32】高级定时器TIM1计数中断配置
【STM32】高级定时器TIM1计数中断配置
561 0
STM32学习笔记(3) TIM基本定时器
代码中有这样一条,有人会问函数TIM_ClearFlag()和函数TIM_ClearITPendingBit()有什么区别?其实重点在Flag和IT,前者是外设的状态标志,而后者是外设的中断标志。状态标志就是一个外设它有自身的一些标志位(Flag),来表明它处于什么状态,下图就是定时器的状态标记。中断标志就是使能外设的中断后,每次发生一次中断,它会表明发生了什么样的中断,同样中断也有相应的标记。两者分别靠函数TIM_GetFlagStatus()和函数TIM_GetITStatus()来获取
618 0

热门文章

最新文章