并发模式——半同步半异步、半同步半反应堆

1、同步和异步的介绍

1.1 I/O模型中的同步和异步

在I/O模型中,同步I/O和异步I/O主要的区别是内核向应用程序通知的是就绪事件还是完成事件,以及是由应用程序还是由内核来完成I/O的读写操作

  • 同步I/O:内核向应用程序通知就绪事件,由应用程序自身来完成I/O的读写操作
  • 异步I/O:由内核来完成I/O的读写后向应用程序通知完成事件 

1.2 并发模式中的同步和异步

在并发模式中,同步和异步的主要区别是功能完成的流程是否是顺序化的,是否需要等待 

  •  同步:当遇到阻塞任务时,会一直等待,直到该任务处理完成,程序完全按照代码顺序执行;
  • 异步:程序的执行需要由系统事件驱动,程序的执行是不确定的,没有顺序上的要求 

按同步方式运行的称为同步线程;按异步方式运行的称为异步线程 

2、并发模式

2.1 半同步/半异步模式

在该模式中,使用同步线程处理用户逻辑,使用异步线程处理I/O事件

以Reactor事件处理模式为例:

  • 异步线程监听到客户请求后,将其封装成请求对象并插入请求队列中;
  • 请求队列将通知某个工作在同步模式的工作线程来读取并处理该请求对象;
  • 具体选择哪个同步线程主要取决于请求队列的设计,如轮流选取的Round Robin算法、使用条件变量或信号量等随机选取

2.2 半同步/半反应堆模式

在该模式中,异步线程只有主线程一个,由主线程负责监听所有socket上的事件

 以Reactor事件处理模式为例:

  • 主线程充当异步线程,负责监听所有socket上的事件;
  • 若由新的请求到来,则主线程接受它并得到新的连接socket,然后往epoll内核时间表中注册该socket上的读写事件;
  • 若是已连接的socket上有读写事件发生,主线程将该socket放入共享的请求队列中;
  • 所有工作线程睡眠在请求队列上,当有任务到来时,通过竞争(申请互斥锁)获得任务;
  • 这种竞争机制使得只有空闲的工作线程才有机会来处理新任务,避免了忙闲不均的情况

 2.3 理解的两者的区别(个人理解)

  • 半同步/半异步有多个异步线程,而半同步/半反应堆模式只有主线程一个异步线程;
  • 半同步/半反应堆模式将有事件发生的socket放进共享的请求队列,需要通过竞争来获得任务(半同步/半异步模式的请求队列是共享的吗?)

2.4 半同步/半反应堆模式的缺点

  • 主线程和工作线程共享请求队列,主线程往请求队列中添加任务,工作线程从请求队列中取出任务是互斥的操作,需要对请求队列进行加锁保护,导致白白浪费CPU时间;
  • 每个工作线程在同一时间内只能处理一个客户请求,如果客户较多而工作线程较少,就会导致任务队列中堆积大量的任务对象,此时客户端的响应将越来越慢。而如果通过增加工作线程来解决这个问题,就会因为大量的上下文切换导致消耗大量的CPU时间

参考连接:

 Linux网络编程 | 并发模式:半同步/半异步模式、领导者/追随者模式_凌桓丶的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值