`
xidajiancun
  • 浏览: 492326 次
文章分类
社区版块
存档分类
最新评论

线程池模式比较

 
阅读更多

线程池模式一般分为两种:L/F领导者与跟随者模式、HS/HA半同步/半异步模式。
HS/HA半同步/半异步模式:分为三层,同步层、队列层、异步层,又称为生产者消费者模式,主线程处理I/O事件并解析然后再往队列丢数据,然后消费者读出数据进行应用逻辑处理;
优点:简化编程将低层的异步I/O和高层同步应用服务分离,且没有降低低层服务性能。集中层间通信。
缺点:需要线程间传输数据,因此而带来的动态内存分配,数据拷贝,语境切换带来开销。高层服务不可能从底层异步服务效率中获益。
L/F领导者跟随者模式:在LF线程池中,线程可处在3种线程状态之一:leader、follower或processor。处于leader状态的线程负责监听网络端口,当有消息到达时,该线程负责消息分离,并从处于follower状态中的线程中按照某种机制如FIFO或基于优先级等选出一个来当新的leader,然后将自己设置为processor状态去分配和处理该事件。处理完毕后线程将自身的状态设置为follower状态去等待重新成为leader。在整个线程池中同一时刻只有一个线程可以处于leader状态,这保证了同一事件不会被多个线程重复处理。
缺点:实现复杂性和缺乏灵活性;
优点:增强了CPU高速缓存相似性,消除了动态内存分配和线程间的数据交换。
两种模式性能分析:
L/F模式处理一个消息的时间为多路分离、分配、处理的时间,加上线程管理时间,LF中多个线程共享一个事件源,所以,需要协调它们间的行为,即有同步开销,L/F同步开销仅为申请/释放锁的开销,在LF处理请求过程中并不需要线程上下文切换,但是在线程由follower成为leader时需要进行线程上下文切换,所以当两个请求同时到达时,这种上下文切换会影响第二个请求的处理时间,也会带来一定的上下文开销。
T(L/F)=T(多路分离)+T(分配)+T(处理)+T(同步)+T(上下文)
HS/HA模式监听线程和工作线程间通过一个消息队列来交换数据。这会带来数据传递开销,。同时,监听线程和工作线程都需要去访问消息队列,造成了资源的竞争,需要额外的同步机制来协调他们的行为,包括监听线程获取和释放资源锁,对应的工作线程获取和释放资源锁,以及监听线程在将一个请求放入队列后通知工作线程带来的开销,我们称此为同步开销,HS/HA模式的同步开销大于L/F的同步开销,。一个请求由监听线程负责放入消息队列,但是却由工作线程来处理,所以,每个请求都会造成一次线程上下文切
换,由此带来的开销我们称为上下文开销。
T(H/H)=T(多路分离)+T(分配)+T(处理)+T(同步)+T(数据传递)+T(上下文)
从上面分析可以看出没有并发情况下L/F模式线程池模式性能优于HS/HA模式。
并发性能分析:
T(多路分离)、T(分配):LF和HH中把每一个消息的到来当作一个事件来处理。事件分配所做的工作是在一个事件处理器注册表中为一个事件查找事件处理器。这一步骤花费的时间随着当前注册的事件处理器的个数变化。当线程池接受用户连接请求后会为每一个连接注册一个事件处理器,所有通过该连接发来的请求都将由同一个事件处理器来处理。而事件处理器表采用一个平衡二叉树来实现。因此,事件分配的时间可以认为是随着并发用户数的增大而增大;
T(处理)处理消息和管理线程所需的时间都不受并发用户数的影响。
T(线程管理),多线程带来的线程管理开销只会随着线程池中线程数而变化,相对固定。
LF和HH的吞吐量会随着并发用户数的增加而增加。当并发用户数达到一定数量时,CPU成为系统瓶颈,此后增大并发用户数不仅不能增加并发处理的请求个数,反而会加大多路分离和分配的时间,从而使得系统吞吐量下降。
最佳性能时线程线:
随着线程数的增多吞吐量不断增大,当达到最大值后有一个短暂的保持阶段,此后继续增大线程数反而会使得吞吐量减小。而且当请求类型为计算密集型时线程数对
HH 的吞吐量的影响并不是很明显。原因是HH线程池在增加线程数时线程管理开销也有较大幅度的增加。因此,通过增大线程数来改善系统性能对HH来说并不是一种有效的方法。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xhs_lh04/archive/2008/05/24/2476820.aspx

分享到:
评论

相关推荐

    Python 程序语言设计模式思路-并发模式:线程池模式:管理线程池,优化线程创建和销毁

    线程池模式(Thread Pool Pattern)是一种优化线程管理的设计模式,它通过创建一个线程池来管理和复用线程,从而避免频繁的线程创建和销毁,提高系统性能。线程池模式适用于需要频繁执行大量短生命周期任务的场景,...

    多线程控制,线程池模式,HTTP线程

    线程池模式是一种管理线程的技术,它预先创建了一组线程,当有新的任务需要执行时,线程池会从池中选择一个空闲线程来执行任务,而不是每次都创建新线程。这样可以减少线程创建和销毁的开销,提高系统响应速度。...

    Linux环境下线程池模式的研究.pdf

    【线程池模式在Linux环境下的应用】 线程池是一种多线程编程的高效解决方案,尤其在Linux操作系统中,利用POSIX线程库(pthread)实现。线程池通过预先创建一组工作线程,用于并发处理任务,从而提高系统的响应速度...

    Java线程池及观察者模式解决多线程意外死亡重启问题

    Java线程池是Java并发编程中的重要组成部分,它...总之,通过Java线程池和观察者模式的结合,我们可以构建一个健壮的多线程系统,即使在部分线程意外终止的情况下,也能及时发现并采取措施恢复,确保系统的稳定运行。

    线程池 + 工厂模式 + 工厂方法 + 单件模式

    线程池、工厂模式、工厂方法和单件模式是软件设计中常见的模式,它们在构建高效、可扩展的系统中发挥着关键作用。此外,内存池的概念也与资源管理紧密相关,尤其在处理大量对象创建时能提升性能。下面将分别详细介绍...

    Hystrix系列之信号量、线程池

    Hystrix 作为一个流行的服务熔断器框架,提供了两种模式来执行逻辑:信号量模式和线程池模式。了解这两种模式的区别和使用场景非常重要。 信号量模式 信号量模式是 Hystrix 提供的一种执行逻辑模式。在该模式下,...

    C++线程池,带PPT 线程池

    这种设计模式可以避免频繁地创建和销毁线程带来的性能损失,同时也能更好地控制系统的并发程度,防止过多的线程消耗资源导致系统不稳定。 C++11及后续标准库(C++14、C++17、C++20)引入了`std::thread`库,提供了...

    MySQL的线程池原理学习教程

    No-Threads主要用于调试,One-Thread-Per-Connection是线程池之前的默认模式,而Pool-Threads就是我们关注的线程池模式。MySQL通过一组函数指针来实现这三种模式的切换,根据`thread_handling`参数动态调整。 连接...

    线程池管理线程demo

    线程池是多线程编程中的一个重要概念,它是一种线程使用模式,旨在优化系统资源的使用并提高系统的响应速度。在Java中,线程池通过`java.util.concurrent`包中的`ExecutorService`接口和其相关类实现。下面将详细...

    线程池

    1. **ProductsExportCmdImpl.java**:可能是一个命令模式的实现,用于导出产品数据。在实现中可能会使用线程池来并行处理导出任务,提高效率。 2. **ExpProductThread.java**:可能是处理产品导出的线程类,可能...

    Android线程池+单例模式+webService

    本项目涉及了三个核心概念:线程池、单例模式和WebService,这些都是Android应用开发中的重要知识点。 首先,让我们来深入理解线程池。线程池是一种多线程处理形式,预先创建了多个线程,当需要执行任务时,直接从...

    VC++ 线程池IOCP模式下的封装

    VC++ 线程池IOCP模式下的封装 CThreadPool::CThreadPool( size_t initialThreads, size_t minThreads, size_t maxThreads, size_t maxDormantThreads, size_t poolMaintPeriod, size_t dispatchTimeout, ...

    java线程池封装j

    这种设计模式大大提高了系统的性能,减少了系统资源的消耗,特别是在高并发场景下。本文将深入探讨Java线程池的原理、封装以及相关知识点。 ### 1. Java线程池概念 Java线程池由`java.util.concurrent`包中的`...

    windows线程池,使用Windows自带的线程池api功能,比你写的线程池性能好得多

    线程池是多线程编程中的一个重要概念,它是一种线程使用模式,通过预先创建一组线程并维护一个线程集合来处理并发任务。在Windows操作系统中,内建的线程池API(Thread Pool API)提供了高效且灵活的线程管理机制,...

    java常用23中设计模式

    总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式...其实还有两类:并发型模式和线程池模式。

    vc++线程池的经典实例

    线程池是多线程编程中的一个重要概念,它是一种线程使用模式,通过预先创建一组线程,并将它们组织成一个池,来处理到来的任务。在VC++中,线程池可以帮助开发者更有效地管理和调度线程,从而提高程序的并发性能和...

    安卓,线程池的使用 ,封装

    封装线程池时,建议创建一个工具类或单例模式的类,提供简单的接口供其他组件调用,如`execute(Runnable task)`、`submit(Callable<T> task)`等,以降低使用难度。 在实际开发中,线程池的封装和使用能够帮助我们更...

    VC实现的线程池

    在项目中,由于移动设备需要跟管理中心进行请求服务,在管理中心使用并发模式对请求进行处理(与其对应的是轮询模式),由于每次连接就需要创建一个线程对相应的请求提供服务,所以需要频繁的创建线程,而服务结束或者...

    一个线程池封装类及例子程序

    在"A programming model to use a thread pool.txt"文档中,可能会详细讲解线程池的工作模式和编程模型,包括如何提交任务到线程池,如何定制线程池的行为,以及如何监控和调整线程池的参数。 "threadpool.zip"和...

    基于对象池模式的自适应线程池技术

    ### 基于对象池模式的自适应线程池技术 #### 一、引言 在现代软件开发中,特别是对于高性能服务器应用而言,优化线程管理是提升系统响应能力和资源利用率的关键因素之一。传统的线程池技术虽然能显著减少线程创建...

Global site tag (gtag.js) - Google Analytics