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

一、并发模式中的同步和异步的区别

1、同步:程序完全按照代码顺序执行(简单理解就是,我调用一个功能该功能没有结束前,我就一直死等结果)

2、异步:程序的执行需要由系统事件来驱动,常见的系统事件包括中断、信号等(简单理解为:调用一个功能,不需要指代该功能最后执行的结果,该功能有结果后再通知我就行(回调通知)。也可以理解为:数据拷贝的时候,进程是否阻塞来作为同步和异步的区别)。常见的系统事件包括中断、信号等

二、并发模式是什么?

   指I/O处理单元和多个逻辑单元和多个逻辑单元之间协调完成任务的方法。

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

三、同步线程和异步线程的区别?

(1)同步线程:按照同步方式运行的线程

(2)异步线程:按照异步方式运行的线程

四、异步线程和同步线程的优缺点?

1)优点:

a:同步线程:逻辑简单

b:异步线程:执行效率高,实时性强,是很多嵌入式程序采用的模型

2)缺点:

a:同步线程:效率低,实时性差

b:异步线程:编写以异步方式执行的程序相对复杂,难于调试和扩展,不适合大量的并发

因此,对于像服务器这种既要要求较好的实时性,有要求能同时处理多个客户请求的应用程序,就应该同时使用同步线程和异步线程来实现,即采用半同步/半异步模式来实现

五、半同步/半异步模式的实现

  在该模式中,同步线程用于处理客户逻辑,异步线程处理I/O事件。异步线程监听到客户请求之后,就将其封装成请求对象并插入到请求队列中。请求队列将通知某个工作在同步模式的工作线程来读取并处理该请求对象。具体选择哪个工作线程来为新的客户请求服务,则取决于请求队列的设计,比如最简单的轮流选取工作线程的算法,也可以通过条件变量来随机选取一个工作线程

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

七、半同步/半异步的高效模式(它的每个工作线程都能同时处理多个客户连接)

  主线程只管监听socket,连接socket由工作线程来管理。当有新的连接到来时,主线程就接受并将返回新的连接socket派发给某个工作线程,此后该新socket上的任何I/O操作都由被选中的工作线程来处理,直到客户关闭连接。主线程向工作线程派发socket的最简单的方式,是往它和工作线程之间的管道里写数据。工作线程检测到管道上有数据可读时,就分析是否是一个新的客户连接请求到来。如果是,则把该新socket上的读写事件注册到自己的epoll内核事件表中

  每个线程(工作线程和主线程)都维持自己的事件循环,它们各自独立地监听不同地事件。因此,在这种高效的半同步/半异步模式中,每个工作线程都工作在异步模式,所以它们并非严格意义上的半同步/半异步模式

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

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

   这种模式是半同步/半异步的一种变体。它的实现如下:

异步线程只有一个,主线程来充当。它负责监听所有socket上的事件。如果监听socket上有可读事件发生,即有新的连接请求到来,然后主线程就接收它,并且往epoll内核事件表中注册该socket上的读写事件。如果连接socket上有读写事件发生,则有新的客户请求到来或有数据要发送到客户端,主线程就将该连接socket插入到请求队列中。所有工作线程都睡眠在请求队列中上,当有任务到来时它们将通过竞争(比如申请互斥锁)获得任务的接管权。这种竞争机制使得只有空闲的工作线程才有机会处理新任务,很合理。

九、半同步/半反应堆模式存在的缺点

(1)主线程和工作线程共享请求队列。主线程往请求队列中添加任务,或者工作线程从请求队列中取出任务,都需要对请求队列加锁保护,从而白白耗费CPU的时间

(2)每个工作线程在同一时间只能处理一个客户请求。如果客户数量较多,二工作线程较少,则请求队列中将堆积很多任务对象,客户端的响应速度将越来越慢。如果通过增加工作线程来解决这一问题,则工作线程的切换也将耗费大量的CPU时间

十、领导者/追随者模式

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

  (2)领导者/追随者包含如下几个组件:句柄集、线程集、事件处理器、具体的事件处理器

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

十一、多线程服务器的优点

   不同的线程可以同时允许在不同的CPU上,当线程数量不大于CPU的数目时,上下文的切换就不成问题了