并发模式

并发编程 

并发编程的目的是让程序“同时”执行多个任务。如果程序是计算密集型的,并发编程并没有优势,反而由于任务的切换是运行效率降低。但如果程序是I/O密集型的,如经常访问读写文件,访问数据库等,情况就不一样了。由于I/O操作的速度远没有CPU的计算速度快,所以让程序阻塞于I/O操作将浪费大量的CPU时间,如果程序有多个执行线程,则当前被I/O操作所阻塞的执行线程可主动放弃CPU(或有操作系统来调度),并将执行权转移到其他线程。如此,CPU就可以用来做其他的任务,而不是等待I/O操作完成,因此CPU的利用率显著提升。

并发模式

 并发编程主要有多进程和多线程两种方式。并发模式是指I/O处理单元(处理客户端连接,读写网络数据)和多个逻辑单元(业务进程或者线程)之间协调完成任务的方法。服务器主要有两种并发编程模式:半同步/半异步模式和领导者/追随者模式。

 半同步/半异步模式

在并发模式中,同步指的是程序完成按照代码序列的顺序执行;异步指的是程序的执行需要操纵系统事件来驱动。常见的系统事件包括终端、信号等。按照同步方式运行的线程称为同步线程,按照异步方式运行的线程称为异步线程。显然,异步线程的执行效率高,实时性强,但是编写异步方式执行的程序相对复杂,难于调试和扩展,而且不适合大量的并发。而同步线程则相反,他虽然效率低,实时性差,但逻辑简单。因此想服务器这种既要求较好的实时性,有要求同时处理过个客户端请求的引用程序,我们就应该同时使用同步线程和异步线程来实现,即采用半同步/半异步模式来实现。

 

半同步/半异步模式中,同步线程用于处理客户端逻辑。异步线程用于处理I/O事件。异步线程监听到客户端请求后,就将其封装成了一个请求对象并插入到请求队列中。请求队列将通知某个工作在同步模式的工作线程来读取并处理该请求对象。具体选择那个工作线程来为新的客户请求服务,则取决于请求队列的设计。

半同步/半异步反应堆

在服务器程序中,如果结合两种事件处理模式和几种I/O模型,则半同步/半异步模式就存在在多种变体。其中有一种变体称为半同步/半异步反应堆。如下图所示

半同步/半反应堆模式

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

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

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

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

半同步/半异步模式

 下图描述了一种相对高效的半同步/半异步模式,它的没个工作线程都能同时处理多个客户连接。

 

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

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

 

本文摘自《Linux高性能服务器编程》

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

顾文繁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值