两种高效的并发模式:半同步/半异步模式、领导者/追随者模式

半同步/半异步模式

同步:程序完全按照代码顺序执行;异步:程序的执行需要由系统事件来驱动。常见的系统事件包括中断,信号等。

https://i-blog.csdnimg.cn/blog_migrate/4a9822249223b76405a7686ea9d470fa.jpeg

半同步/半异步模式中,同步线程用于处理客户逻辑,即逻辑单元;异步线程用于处理I/O事件,即I/O处理单元

异步线程监听到客户请求之后,就将其封装成请求对象插入请求队列,请求队列通知某个工作在同步模式的工作线程来读取并处理该请求对象。具体选择哪个工作线程取决于请求队列的设计

半同步/半异步模式的个工作流程:

https://i-blog.csdnimg.cn/blog_migrate/ef738a93054e7d9ec35b45863527aa82.jpeg

半同步/半反应堆模式:

半同步/半反应堆模式是半同步/半异步模式的一种变体

https://i-blog.csdnimg.cn/blog_migrate/2d525951bf9b642f8d4014ea3c4d2ecf.jpeg

半同步/半反应堆模式

异步线程只有一个,由主线程充当。它负责监听所有socket上的事件。如果监听socket上有可读事件发生,即有新的连接请求到来,主线程就接受得到新的连接socket,然后往epoll内核事件表中注册该socket上的读写事件。如果连接socket上有读写事件发生,主线程就将该连接socket插入请求队列。所有工作线程都睡眠在请求队列上,当有任务到来,通过竞争获得任务管理权。

主线程插入请求队列的是连接socket,说明采用的事件处理模式是Reactor模式;即要求工作线程自己从socket上读取客户请求和往socket写入服务器应答。

半同步/半反应堆模式也可以用模拟的Proactor事件处理模式(用同步I/O模拟出Proactor模式的一种方法):此时,需要主线程完成数据的读写,主线程一般将应用程序数据,任务类型等信息封装成一个任务对象,然后插入请求队列;工作线程从请求队列中取得任务对象之后,就可直接处理,不再需要进行读写操作。

缺点:

 

主线程和工作线程共享请求队列。主线程向请求队列添加任务,工作线程从请求队列取出任务,都需要对请求队列加锁保护,从而耗费了CPU时间。

每个工作线程在同一时间只能处理一个客户请求。如果客户数量多,工作线程少,则请求队列中就会堆积很多任务,客户端的响应速度越来越慢。如果增加工作线程,则工作线程切换也将耗费大量CPU时间。

半同步/半异步模式————-相对高效的一种

主线程只管理监听socket、连接,得到新的连接socket由工作线程来管理。当有新的连接到来时,主线程就接受并将新返回的连接socket派发给某个工作线程,此后,该socket上任何I/O操作都由被选中的工作线程来处理,知道客户端关闭连接。

主线程向工作线程派发socket的方式,是往它和工作线程之间的管道里写数据。工作线程检测到管道上有数据可读时,就分析是否是一个新的客户端连接请求到来,如果是,就把该socket上的读写事件注册到自己的epoll内核事件表中。

此模式每个线程都维持自己的事件循环,各自监听不同的事件。

高效的半同步/半异步模式

领导者/追随者模式

1】该模式是多个线程轮流获得事件源集合,轮流监听、分发并处理事件

【2】在任意时刻,程序仅有一个领导者线程,负责监听I/O事件;其他线程都是追随者,休眠在线程池中等待成为新的领导者或被指定处理任务。

【3】当前领导者如果检测到I/O事件,首先要从线程池中推选出新的领导者线程,然后处理I/O事件;新的领导者则等待新的I/O事件。

【4】领导者/追随者模式包含的组件:

句柄集(HandleSet)

线程集(ThreadSet)

事件处理器(EventHandler)

具体的事件处理器(ConcreteEventHandler)

句柄集:用于表示I/O资源,在Linux下通常就是一个文件描述符。句柄集管理众多句柄,它使用wait_for_event方法监听这些句柄上的I/O事件,并将其中的就绪事件通知给领导者线程。领导者则调用绑定到Handle上的事件处理器来处理事件。领导者将Handle和事件处理器绑定是同通过调用句柄集中的register_handle方法是实现的。

线程集:这个组件是所有工作线程(包括领导者线程和追随者线程)的管理者。负责各线程之间的同步以及新的领导者线程的推选。线程集中的线程在任意时间必处于三种状态之一:

1.Leader:线程当前处于领导者身份,负责等待监听句柄集上的I/O事件。

2.Processing:线程正在处理事件,领导者检测到I/O事件之后,可以转移到Processing状态来处理该事件,并调用promote_new_leader方法推选新的领导者;也可以指定其他追随者来处理时间(Event Handoff),此时领导者的地位不变;当处于Processing状态的线程处理完事件之后,如果当前线程没有领导者,则它将成为新的领导者,否则它将直接转变为追随者

https://i-blog.csdnimg.cn/blog_migrate/d527519677399100d98d177394f9ccd2.jpeg

领导者/追随者模式流程图

https://i-blog.csdnimg.cn/blog_migrate/bf1d18a0ef725a5f5b5bc91f01867a2f.jpeg

缺点:因为领导者自己监听I/O事件并处理客户请求,因此不需要在线程之间传递任何额外的数据,也无须像半同步/半反应堆模式那样在线程之间同步对请求队列的访问。但领导者/追随者仅支持一个事件源集合,因此无法像半同步/半反应堆模式那样让每个工作线程独立管理多个客户连接。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值