服务器网络模型(3)---工作线程与线程池模型

工作线程负责请求的具体处理,也与具体的服务器功能相关。实际上,多个线程的组织一般是松散的,好的设计应该完全避免各线程之间的干扰,同时减少线程的切换(如果工作线程不存在阻塞I/O和长耗时处理过程,建议线程数少于CPU核数)。在不考虑I/O的情况下,线程池一般有两种实现,【半同步/半异步】和【领导者/跟随者】模式。

半同步/半异步模型

       关于半同步/半异步的解释可以参考POSA2,简单来说,就是多个工作线程各自都同步的处理请求,而另有一个线程专门只负责接受请求,请求被缓冲在一个队列里,以生产者/消费者的形式竞争。

      

       如上图所示,在半同步/半异步模型中,分3个角色:请求接受者,队列和工作线程。实际上请求接受者一般是一个API,由I/O线程负责调用。队列一般封装了同步机制,将各工作线程协同在队列尾部,队列还能采用不同的优先级策略,比如某个fd优先,timer优先等。在此模式下,工作线程的数量和fd无关,同时由于存在队列缓冲的能力,能应对请求突然爆发的情况,能较好的应对请求波动比较大的情况。但是由于引入队列缓冲,需要对请求数据做一次拷贝,同时也增加了线程的切换,它的性能不是最优的,但它具有较大的伸缩性,是最常被采用的模型。

领导者/跟随者模型

       领导者/跟随者模式同样可以参考POSA2,它不同于半同步/半异步模式,没有专门的线程负责接收请求,而是各自自主的交替接受请求。它的情况类似于机场打车,各个线程就好比各个出租车,出租车来一个拉走一个,然后选择后一个车作为Leader,这个车又拉一个,然后又选择再后一个作为Leader……第一个车拉完后又回到队尾,依次类推。

      

       如上图所示,这种模式下没有显示的队列,跟I/O模型结合时依赖于系统的隐式队列,比如缓冲区。由于缓冲区大小有限,因此这样的模型在处理请求时伸缩性较小,它的优势在于可以一定程度上减少数据拷贝。在后面的内容中,我们会较少的用到它。

线程组

       抛开池的概念,我们可以让工作线程分而治之,完全没有交汇点,而成为一组完全不相干的线程组,一个合理的比喻是游泳池的泳道,每个比赛者从头游到尾都完全没有相互干扰,我们姑且给他取个名字“泳道线程组”。它的图示如下:

      

       泳道线程组较好的解决了同步机制引起的竞争,单个线程一般和I/O模型处于相同的线程,形成多个单线程服务器在进程内的简单组合,具体来说,一般是每个线程各自分管不同的fd,以单线程的形式处理这些fd。泳道线程组受限于CPU个数,在线程数大于CPU个数的情况下,线程切换带来的代价很高,而在线程数小于CPU的情况,除了accept以外,它几乎是零数据拷贝零加锁零切换,性能非常高。但是它的缺点也是比较明显的,缺少一个显示队列,难以应对爆发的请求量,不仅如此,由于线程绑定特定fd,还无法在各个线程分摊单个fd的爆发请求,伸缩性比较差。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值