两种并发模式:半同步半异步 领导者追随者

介绍

半同步半异步 
   介绍 
   变体 
      半同步半反应堆 
      高效的半同步半反应堆 
领导者追随者 
   介绍 
   实现
      组成
      过程
  优缺点 


介绍

并发模式是指IO处理单元和多个逻辑单元之间协调完成任务的方法
主要有半同步半异步  领导者追随者两种模式。 

半同步半异步 

介绍 

同步线程是指线程程序完全按照代码序列 顺序执行
异步线程是指线程程序的执行需要由异步事件来驱动 比如信号 中断等
半同步半异步模式中,同步线程用来处理客户逻辑 (相当于逻辑处理单元),
异步线程用来处理IO事件(相当于IO处理单元)
IO处理单元的异步线程监听到客户请求,
将其封装成请求对象插入请求队列先中,
请求队列将通知某个逻辑处理单元的同步线程来读取并处理该请求对象


变体 

半同步半反应堆 
 

高效的半同步半反应堆

领导者追随者 

 

介绍 

  多个工作线程轮流获得事件源集合,轮流监听,分发并处理事件的一种模式,任意时间点,程序都仅有一个领导者线程,他负责监听I/O事件,其他线程都是追随者,他们休眠在线程池中等待成为新的领导者,当前领导者如果检测到I/O事件,首先从线程池中选出新的领导线程,然后处理I/O事件,此时原来的领导者等待新的I/O事件,新的领导者处理I/O事件,二者实现了并发。

实现 

组成

 

1.句柄:用于表示I/O资源,linux下为一个文件描述符
2.句柄集:管理众多句柄,用wait_for_event来监听句柄上的I/O事件,
并将就绪的事件通知给领导者线程,
领导者线程通过绑定到handle上的事件处理器来处理事件
(handle和事件处理器的绑定是通过句柄集中的regeiregister_handle实现)
3.线程集:所有工作线程(领导者,追随者)的管理者,
负责各个线程间的同步及选出新的领导者,线程集中的线程任意一时刻处于一下三种状态:

1>处于领导者身份,负责等待句柄集上的I/O事件。

2>Processing:线程正在处理事件状态,


3>当前线程处于追随者身份,通过调用线程集的join函数成为新的领导者,也可呗当前领导者指定处理任务。

4.事件处理器:事件处理器通常包含一个或多个回调函数handle_event,
这些回调函数用于处理事件对应的逻辑业务,
事件处理器使用前需要绑定到某个句柄上,当该句柄上有事件发生时,
领导者就执行与之绑定的事件处理器上的回调函数。

5.具体的事件处理器:是事件处理器的派生类,他必须重新实现基类的handle_event以处理特定的任务。

 过程

情况一:领导线程检测到I/O事件后转移到该状态来处理事件,并调用promote_new_leader推选新的领导者,
情况二:也可以指定其他追随者处理事件(Event handoff),此时领导地位不变,当处于processing状态的线程处理完该事件后,如果当前线程没有领导者那么他就变为新的领导者,否则变为追随者。 

 

优缺点 

  由于领导者线程需要自己监听I/O事件并处理客户请求,所以此模式下之间不需要传递额外的数据,也不用向半同步/半反应堆模式那样在线程之间同步对请求队列的访问,但是仅支持事件源集合,无法让每个线程独立的管理多个客户的连接。

发布了84 篇原创文章 · 获赞 18 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/vjhghjghj/article/details/103956236