高效并发模式之半同步/半异步模式

一、基本概念

半同步/半异步模式中的“同步”和“异步”与“I/O模式”下的同步与异步是有区别的,在I/O模式下,同步与异步区分的是内核向应用程序通知的是何种I/O时间(是就绪事件还是完成时间),以及谁来完成I/O读写(是应用程序还是内核)。而在并发模式下,“同步”指程序完全按照代码顺序执行;“异步”指程序的执行需要系统事件来驱动。

显然异步线程的执行效率能高一点,实时性强,但是他适用于大量并发操作,因为其程序复杂,难以调试和扩展。

对于向服务器这种既要求实时性高,又能同时处理多个客户请求的应用程序。我们就应该同时使用同步和异步两种模型来实现,即半同步/半异步模型。

首先给出服务器程序的基本框架

在半同步/半异步模型中,同步线程用于处理客户逻辑,相当于框架中的逻辑单元,而异步线程用于处理I/O事件,相当于框架中的I/O处理单元。异步线程监听到客户请求之后,就将其封装成请求对象,插入到请求队列,请求队列将会通知某个工作在同步线程中的工作线程来读取并请求对象。

二、工作流程图

三、半同步/半反应堆模式

在服务器程序中,如果考虑到事件处理模式和几种I/O模型的话,半同步/半异步模式就会有许多变体。其中一种变体就叫做半同步/半反应堆模式。

  在这种模式下,异步线程只有一个,由主线程来充当。主要负责监听socket上的事件。如果监听到socket上有可读事件发生,即有新的请求事件到来,主线程就接受之,并连接新的连接socket,然后往内核事件表中注册socket上的读写事件。如果连接上的socket有读写事件发生,即有新的客户请求到来,或者有数据要发送到客户端,主线程就该连接socket插入到请求队列,所有工作线程睡眠在请求队列当中,当任务到来的时候,他们将通过竞争,获得任务的接管权。

  主线程插入请求队列中的任务就是就是就绪连接的socket,说明半同步/半反应堆采用的事件处理方是Reactor模式:他要求工作线程自己从socket上读取客户请求和往socket写入服务器应答。

半同步/半反应堆模式存在以下缺点:

  • 主线程和工作队列共享请求队列,主线程往请求队列中添加任务,工作线程从请求队列中取出任务,都需要进行对请求队列进行加锁保护,从而白白浪费了CPU时间。
  • 每个工作线程在同一时间内只能处理一个客户的请求。如果客户数量较多,而工作线程较少,那么请求队列将会堆积许多任务对象。客户端响应就会越来越慢,如果采用增加工作线程的方式,那么线程之间的切换将会大大消耗CPU。

四、高效的半同步/半异步模型

这种描述的半同步半异步模型,他的工作队列可以同时处理多个客户端连接。

主线程只监听socket的事件,连接socket由工作线程来连接管理。当有新的连接的时候,主线程将之接受,并将其新返回的socket派发个某个工作线程,此后该连接上的所有I/O操作都由选中的工作线程来完成,直到客户端关闭。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值