维普资讯 http://www.cqvip.com 第l6卷2006年8月 第8期 计算机技术与发展 ODMPUTER TECI-hNOLOGY AND DEVELOPMENT voI.16 No.8 Aug.2006 基于线程池的高性能服务器软件的设计和实现 胡 萍 ,陈志鹏2 (1.浙江大学宁波理工学院,浙江宁波315100; 2.中国联通杭州分公司,浙江杭州310000) 摘要:传统的多线程技术,虽然在提高服务器性能发挥了重要作用,但是在实时系统应用中,由于其频繁的创建和销毁线 程的系统开销严重影响了系统性能,因此有效降低这部分开销对进一步提高服务器性能尤为重要。文中在分析传统服务 器模型的弊端基础上,提出了基于线程池的服务器模型,并分析说明了线程池技术如何提高服务器性能,最后给出了应用 C++语言实现该服务器模型的具体方法。 关键词:线程池;C+ ;高性能;服务器 中国分类号:TP311.5 文献标识码:A ‘ 文章编号:1673—629X(20o6)08—0o49—02 Design and Realization of Software of High‘-。Performance Server Based on Thread Pool Technology HU Ping ,CHEN Zhi.pen (1 Ningbo Inst.of Technology,Zhejiang Univ.,Ningbo 315100,China; 2.China Unicorn Branch Company in ̄mgzhou,Hangzhou 310000,China) Abstract.Though traditional multithread technology is improvig userver performance and playing all importnta role,but in the real—time system,because the system pdlseS of its frequent establishing and destmylg tuhread have influenced systematic function seriously,SO it is particularly important to reduce this part of expenses effectively to further improve server performance.This paper has pmpo ̄d the Sel-vegir ̄el based onthread pool Onthe basisof analyzingthe drawbackofthetraditional server rr ̄lel, yzed and proved howthread pooltechnology raise ̄l'ver peHormance.providedthemethod ofimplmee ̄atigtuhis sel-verir ̄el usingC++finally. Key words:thread pool ̄C++:high—performance;server O引 言 在很多实时系统中对响应时间都有较高的要求,如数 开销(T1+ )是不可忽视的L2 J,当它占用服务器开销超 过一定比率的时候,将会严重影响服务器的性能。因此, 据库系统、订票系统等等。传统多线程服务器软件采用的 模型是一旦接收客户端任务请求时,立即创建一个新的线 程来执行任务,任务执行完毕后,线程退出Ll J。尽管创建 线程比创建进程,系统的开销已经小多了,但是如果提交 给线程的任务执行时间较短的话,那么服务器将忙于创建 和销毁线程,而服务器处理客户端请求任务的时间就相对 减少了,这样服务器的性能就受到很大的影响。文中提供 一要提高服务器资源的利用率,应着眼于减少T1和T2这 两部分额外的开销。采用线程池技术能有效地解决这个 问题。 线程池提供了处理系统性能和大用户量请求之间矛 盾的方法,通过对多个任务重用已经存在的线程,降低了 对线程创建和销毁的开销,由于当客户请求到达的时候, 线程对象已经存在,服务器就能立即处理客户请求,从而 提高了服务器的响应能力。线程池采用预创建技术,即在 服务器软件启动时,创建一定数量的线程,放人空闲队列 中,这些线程处于阻塞状态(线程处于阻塞状态不占用 种解决方案来解决以上问题。 1基于线程池的高性能服务器软件的设计思路 服务器线程的执行分为3个过程:线程创建时间 (T1),线程执行时间(1r2),线程销毁时间( )。如果线程 执行时间(T2)很短的话,那么服务器创建和销毁线程的 CPU,只占用很少一部分内存)L3J。当客户端任务到达时, 从线程池中选择一个空闲的线程执行任务。与传统的多 线程服务器模式不同,线程池中的线程执行完任务后并不 退出,而是处于阻塞状态,等待下一个任务到达。线程池 中线程的数目是动态调整的,当线程池中的所有线程都处 于繁忙状态时,线程池自动创建新线程来处理更多的任 务;当线程池比较空闲时,线程池就销毁一部分空闲线程, 收稿日期:2005—11—23 作者简介:胡萍(1978一),女,湖北人,硕士,助教,研究方向为数据 库技术及应用。 维普资讯 http://www.cqvip.com ・50・ 计算机技术与发展 第l6卷 释放系统资源。 一 线程池至少包含线程池管理器、工作 线程、任务接口等部分。其中线程池管理 器负责创建、销毁和调度工作线程;工作 线程是循环执行任务的线程,在没有任务 的时候进行等待;任务接口是每个任务必 须实现的接口,主要用来规定任务的入 一 口、任务执行完后的清理工作和任务执行 状态等等,而工作线程是通过调用这个接 口来执行具体任务的。 线程池框架主要包括4个类:Task 1 分配任务 Base(任务接口),Thread(线程基类), WorkThread(工作线程类),meadPeol(线 程池管理类)。线程池中各个类之间的关 l 系如图1所示。 l TaskBase图2线程池在服务器应用程序中应用的交互图 j ——一——¨嵋———————————————— i<<virtual>>e ̄ecute0 分析任务,根据任务类型创建相应的任务 ……一了一— 一 对象;然后服务器主线程将任务交由线程 / |\ 池执行,而服务器主线程继续等待下一个 \ 客户端请求 引。 、 ■ 一 一ThreadPool 其服务器软件代码框架如下所示: 穗ru ̄*pTaskBase:TaskBase1 void mam() I ̄initO 上r:rr { 池 叶● 隆GetIdleThread0 象-厂 mCreateldleThread() // ̄21建并初始化线程池,THREAD—NUM为 I ̄JVVaitForldleThread'0  ̄llocateTask(1初始化线程池的工作线程数 一丁~ ~  ̄ldleTimeCount0 ThreaclPool pThreadPoo[=new ThreaclPool 一 mDeletel任一dl务一eThr eads0 (THREAD—NUM); 图1线程池中各个类之间的关系图 一 while(1) ● 1●r●● 其中任务接口类TaskBase是个抽象的接口,其派生 1 类必须实现execute()方法,工作线程通过执行这个exe— //循环从客户端接受任务,解析任务,判断任务类型 cute()方法来执行具体任务;线程基类Thread是对操作系 switch(AeeeptTask(TaskData)) 统提供线程接口的封装,它是所有工作线程类的基类,提 { case任务类型1: 供统一的接口run()方法,所有派生类都要实现rull()方 /做行任务1 法,同时Thread还提供了start()方法,它封装了启动线程 /刷建相应的任务对象TaskX 细节;工作线程类WorkThread从Thread类派生,实现了 TaskX pTaskX=new TaskX(); run()方法,工作线程启动以后将执行这个run()方法;线 //设置任务数据 程池管理类ThreadPool负责管理线程池,包括创建、销毁、 调度工作线程等等;TaskX和TaskY都从TaskBase派生, // ̄r ̄配任务,由工作线程执行任务 在execute()方法中定义了具体的任务内容。 pThreadPool一>run(pTaskX); break; 2基于线程池的高性能服务器软件的具体实现 case任务类型2: 线程池的引入,不仅有效解决了服务器线程开销的问 //执行任务2 题,提高了服务器性能,还带来了一个简洁、直观、易于扩 //仓0建相应的任务对象TaskY 展的多线程服务器模型,提高了代码的可读性和可维护 1 sl【Y pTaskY=new1 kY(); 性 j。线程池在服务器应用程序中的应用模型图如图2 /徽置任务数据 所示。 // ̄r ̄配任务,由工作线程执行任务 其中服务器主线程首先创建并初始化线程池,并等待 pThreadPool一>run(pTaskY); 客户端请求;当有任务请求到达时,服务器主线程接收并 (下转第54页) 维普资讯 http://www.cqvip.com ・54・ 计算机技术与发展 第16卷 是正定的当且仅当K 是条件正定的。 图1所示。实验结果表明使用该C.P.d核与多项式核具 将(12)式带入(11)式:存在C.P.d核K 使得: 有等价的效果。由于采用的C.P.d核是线性距离核,其整 ll≯(X)一≯(X )l l= L_(K (X,X)+K (XT X )一 体的分类效果不如使用径向基核。 厶 由于 和KDDA在图像处理、语音和信号处理、 K (X,X。) (13) 模式识别、机器学习等领域有着广泛的用途,上述实验也 特别的,如果K (X,X):0(如在Hilbert空间表示下), 表明使用C.P.d核同样能够完成这类非线性分类和识别 (13)式可简化为: 的任务。 ll≯(X)一≯(X )l l=一K (X,X ) (14) 同时另一方面,有 (≯( )一≯( 0),≯( T)一≯( 0)): 5结束语 随着模式识别与机器学习技术的发展,及越来越多复 告[一l厶 l≯( )一≯( )ll +ll≯( )一≯( 0)l l + 杂分类任务的提出,使得简单线性分类算法或其组合均难 『 I4(X0)一4(X )fI ] (15) 以胜任这种要求。核策略等非线性方法的使用有效地扩 因而可以通过使用C.P.d核来代替直接计算核函数的分 展了学习算法。通过对条件正定核的使用,说明了基于核 级内积,这样做的另一个优势是:由于内积运算没有变换 距离的非线性算法较传统距离度量有更强的适应性和有 不变性,而ll・ll 运算具有平移等变换不变性,因而可以 效性,比Mercer核有着更宽松的约束条件,因而有效地扩 具有更大的适用范围。 展了核方法的适用领域。 事实上[ ,任何负的平方距离核函数均是条件正定而 非正定的,即如下形式的核HJ均是C.P.d.核(而非P.d. 参考文献: 核): [1]孙即祥.现代模式识别[M].长沙:国防科技大学出版社, K (X,X )=一l lX—X (16) 20o2. Smola等人证明 j只有0< <2的(16)式才适用于 [2]DudaRO,Hart PE,StorkDG.模式分类(第2版)[M].李 构造非线性分类算法。 宏东,姚天翔译.北京:机械工业出版社,2003. [3]Lu Juwei.FaceRecognitionUsingKernelDirect Dis minant Analysis Algorithms[J].IEEE TRAN& ( 10NS ON NEU— 4实验及分析 RAL N】 w0RKS,2o03,14(1):117—126. 为了验证文中所述算法的有效性,笔者使用标准测试 [4]孔锐,张国宣.基于核的K一均值聚类[J].计算机工程, 集:鸢尾属植物数据集(iris.dat)进行了分类实验。在实验 2004(11):12—13. 中分别使用多项式核函数和径向基核函数对数据集的4 [5]SmolaA J,Sch61kopf.On a kernel—basedmethodfor pattern 种属性(萼片长度、萼片宽度、花瓣长度、花瓣宽度)的3个 recognition,regression,approximatino and operator inversion 类别(seto ̄,a,versicolor,virglnlca)进行 和KDDA分 [R].GMD Technical Report,GMD-FIRST,Berlin:[s.n.], 析,引入p=1的条件正定核后,利用该类型核的组合执行 1998.1064—1097. 上述核分类算法,并对其分类性能进行对比测试,结果如 (上接第50页) 术的服务器软件模型,对于提高需要处理轻量级任务并且 break; 实时性要求较高的服务器性能有很大帮助,具有现实意 } 义。 } //释放线程池内存 参考文献: delete pThreadPool; [1]Beveridge J,WienerR.Win32多线程程序设计[M].侯捷 } 译.武汉:华中科技大学出版社,20o2. [2]王险峰,刘宝宏.Windows环境下的多线程编程原理与应 3结束语 用[M].北京:清华大学出版社,2002. 线程池是组织服务器应用程序的有用工具,可以显著 [3]ButerthofDR.POSIX多线程程序设计[M].于磊,曾刚 改善服务器程序的性能,在服务器领域有着广泛的应用前 译.北京:中国电力出版社,2003. 景。文中在分析了传统的多线程服务器软件处理轻量级 [4]Hughes C,HughesT.C++面向对象多线程编程[M].周良 任务的弊端的基础上,提出了一个基于线程池技术的服务 忠译.北京:人民邮电出版社,2001. 器软件模型;同时给出了一个通用的可扩展线程池框架, [5]Richter J.Windows高级编程指南[M].王书洪,刘光明译. 以及其在服务器软件中应用的具体实现。基于线程池技 北京:清华大学出版社,1999.