Linux下多线程Socket通信的研究与应用王枫罗家融!"#中国科大学等离子体化学研究所兰州230031:E-maiimapie@"$摘要Linux操作具有良好的稳定性和出众的网路性能因而被广泛应用于网路服务领域而在Linux下开发高性能的网路通信程序"是充分发挥Linux网路特点的一个关键诱因$文章通过对Socket通信模型的剖析和比较"探讨了在大规模分布式系统中采用多线程Socket通信技术的必要性$而且以HT-7数据采集和控制系统中的炮号服务器为例"详尽说明了怎样在Linux下借助多线程Socket通信技术进行网路通信程序的开发$关键词LinuxSocket多线程文章编号!%文献标示码中图分类号1002-8331-200416-0106-04ATP311。13StudyandApplicationoftheSocketCommunicationBasedonMultithreadinginLinuxWangFengLuoJiarong(InstituteofPiasmaPhysicsChineseAcademyofSciencesHefei230031Abstract:Linuxoperationsystemhasfavorabiestabiiityandexceiientcapabiiityofnetworkwhichhasbeenusedinthefieidofnetworkserviceslinux社区。
ItisakeyfortakingadvantageofnetworkfeatureofLinuxthatdeveiopingnetworkcom-municationprogramswithhighperformance。ThispaperanaiyzesandcomparestheSocketmoduiesandconciudesthatitisnecessarytoadoptmuitithreadingsocketcommunicationinagreatdistributedsystem。ItaisoprovidesaactuaicasetheShotNoserverofHT-7controianddataacguisitionsystemanddescribeshowtodeveiopthenetworkcommunica-tionprogramsusingmuitithreadingsocketinLinux。Keywords:LinuxSocketmuitithreading1序言Socket是Internet网路编程的通用API在不同的操作系是国外第一个超导托卡马克核聚变实验装置自建统下有相应的实现版本可能会有细节上的区别并且SocketHT-7成以来中科院等离子体所已在该装置上进行了多次实验获通信模型基本是一致的最基本的Socket通信模型即顾客服得了大量宝贵的实验数据和资料以及多项核聚变化学实验领务器模型顾客服务器模型按照通信发起的方向对应用程序进[1]行分类发起通信的应用程序为顾客相应的等待接受顾客通域里的重大成果HT-7是一个小型的复杂的实验系统拥有讯的则是服务器Socket通信依据所采用的合同分为面向联接一个大规模分布式数据采集系统和分布式控制系统其以各类和面向非联接两种[2]假如采用TCP合同则是面向联接的通计算机为基本单元以高速网路为纽带将各类分布式元素有讯倘若采用合同则是面向非联接的通信因为尽UDPUDP机的联系上去成为一个整体因而网路通信在整个HT-7系最大努力但提供不可靠的服务简单的算法可以在本地UDP统中具有至关重要的作用Linux作为一种自由免费的操作系统相对于Windows具有良好的稳定性和出众的网路性能因网路条件好的环境中良好工作但在环境较复杂的网路中就不此被广泛应用于各类网路服务器在HT-7中也大量采用Lin-能正常工作了必须通过超时和重传来实现可靠性而TCP则ux作为服务器的操作系统Socket是TCP/IP网路编程的通用提供了数据传输的完全可靠性虽然TCP相对于UDP会消耗插口一般采用的单进程循环模型可以满足网路通信简单负荷更多的系统资源并且为了保证采集和控制讯号的完全确切小的情况并且在大规模分布式系统中网路通信复杂在HT-7中大多采用面向联接的通信方法文章主要讨论面向HT-7联接的服务面向非联接的类似如图所示的是数据量大就不能挺好的工作因而必须采用并发模型相对于TCPUDP1用API调用序列表示的最简单的Socket顾客服务器通信模型其他类型的并发基于多线程的并发具有更好的性能所以为一般顾客应用程序比服务器应用程序简单的多由于(TCP了充分发挥Linux的网路性能但是获取最大的通信效率和稳大多数顾客端何必要显著处理并发而且不须要考虑其它异定性在HT-7中采用多线程Socket通信技术开发Linux下的常而服务器端则要复杂的多须要考虑并发执行效率网路网路通信程序状况顾客状态和服务器崩溃等等众多方面问题因而一个网2Socket通信模型络通信程序的关键在于服务器应用程序的开发依据服务器模!"-(:("基金项目国家九五重大科学工程HT7U超导托卡马克核聚变实验装置的一个子项目编号国家发展计划委员会计投资19981303号项目作者简介王枫男中科院等离子体化学研究所硕士研究生主要从事计算机实时控制和数据采集系统的研究!(1977-O!"#2004。
16计算机工程与应用型是否提供并发可以大致分为循环服务器和并发服务器两大程与多进程相比主要具有两个重要优点OOO类1更高的效率线程是快捷的与标准fork相比线程带来的开支很小内核无需单独复制进程的显存空间或文件描述O符等等这就节约了大量的CPU时间促使线程创建比新进因而可以大量使用线程而无需太过程创建快上十到一百倍于害怕带来的或显存不足使用时造成的大量CPUOforkCPU占用也不复存在[3]O共享储存空间采用方法对不同进程来说它们O2fork具有独立的数据空间要进行数据的传递只能通过进程间通讯1IPC的方法进行但有如下不足强加了某种方式的额外内核G开支因而增加性能对于大多数情形IPC不是对于代码的H"OO自然扩充一般极大地降低了程序的复杂性多线程则不然同一进程的不同线程共享相同的储存空间所以程序中的所有线程都可以访问申明过的全局变量O并且多线程还具有更多的优点多线程才能提升应用程才能充分发挥的作用才能改善程序结构就能序相应SMP图典型顾客服务器通信模型1Socket构造冗余服务器等等因而只要在程序中有意义一般就采用O多线程技术O2。
1循环服务器循环服务器是指在一个时刻只能处理一个顾客恳求的服务器只要循环的执行相对于负载能提供足够快的响应时间一般采用循环服务器其设计编程也是最容易的因而也只能提供最简单的服务O如图所示的即是一种典型的循环服务器1(OOTCP这些模型实现上去很简单而且不能处理复杂的情况例如同时有多个联接恳求到来时服务器就难以作出及时地响应虽然可以通过设置侦听队列的厚度来降低联接数也不O能保证通信的有效性假如处理一次联接的时间不确定都会导致前面的联接未能接通更糟糕的情况是假如其中一个客可能会导致服务器的堵住或崩溃大户出现死锁或异常情况O大增加了服务器的稳定性这也是循环服务器无法克服的弊病因而必须采用并发服务器OO!"图基于多进程多线程的并发服务器2。2并发服务器2并发服务器是指在一个时刻可以处理多个顾客恳求的服务器O这只是概念上和表面的并发并不一定是真正同时处理将多线程技术应用到Socket通信中可以更容易地构造多个恳求假如服务器具有多个处理器则是实际的并发但对并发服务器其基本设计与多进程的并发服务器相类似主线于大多数服务器来说是借助操作系统的某种机能例如异步程始终循环运行负责侦听和接受顾客联接恳求每每有新的多进程多线程等技术来实现的只是从顾客的角度看上联接时主线程将创建一个从线程负责处理联接直至与顾客I/0通信结束从线程中止基于多线程的并发服务器更适宜于大去如同服务器并发地与多个顾客通信OLinux提供了两种方式O的并发进程和线程因而常见的并发服务器即是基于进程的量线程间通信的情况更利于设计强悍和复杂的服务器OO并发和基于线程的并发两种类型O2。
2。1多进程并发3在HT-7的应用进程表示一个静态程序的执行在Linux中当一个进程需基于上述剖析和比较可以看出在大规模分布式系统中要由另一个实体执行某件事时该进程派生fork一个从进程有必要采用基于多线程的通信技术在控制和数SocketOHT-7让从进程去进行处理O若果将多进程引入Socket通信中即构据采集系统中对于下的通信基本都采用多线LinuxSocket造了基于多进程并发的服务器如图所示主进程并不与客2程方法下边就以实验中的炮号服务器为例具体介绍OHT-7户直接通讯只是仍然等待下一个联接恳求每每有新的联接其应用O时主进程创建一个从进程来处理该联接并容许从进程并发如图所示整个实验网路主要包括个组成部3HT-74操作下好多网路服务程序都是如此编撰的这些模型一OLinux分控制子网采集子网数据服务子网和数据确诊子网由于1\O直使用的挺好但实际上使用有一些问题因而有必要采forkO各个子网与不同的现场和设备相连也为了避免互相干扰和出用多线程技术OO于安全考虑所以各个子网互相隔开同时为了避免单位局域2。
2。2多线程并发O网带来的干扰整个实验网路也与之隔开一次独立的运行成为一个执行线程一个进程可以包含一3。1炮号服务器O个或多个线程线程是增强代码响应和性能的有力手段多线炮号服务器处于实验网路的数据服务子网是向所HT-7计算机工程与应用2004。16!"#图3HT-7实验网路示意图有子系统提供放电炮号和一些最重要的放电参数由于放电炮号为1000恳求最新炮号为4000等等这种服务类型码由服务器事先规定之后统一公布各顾客端在联接到服务器后首号是一次放电实验的惟一标识是所有子系统联系的纽带所以炮号服务器的运行状况将直接关系到整个实验的进行炮号先发送服务类型码服务器判定此服务类型码是否在服务范若果不在则结束通信假如满足服务类型码中某一条则提服务器采用了的配置以充分发挥多线畴PII450*2+Redhat8。0供服务比如顾客端须要恳求炮号在与服务器构建联接以程的优势后先发送服务类型码之后再读取炮号同以前的单服如图所示炮号服务器主要包括两组服务主服务和旧40004务相比只是降低了一个简单的判定过程从代码上只是一组版本服务因为历史缘由好多旧的程序已无法再做更改为了句子因而在执行速率上几乎不会有影响如下边的代码保持软件的向后兼容性和其他系统地稳定性而保留了旧版本case片段所示其中的和CSockaddiCblockingSocketCblocking-服务因为旧版本顾客不是好多因而一直采用原来的循环服SocketException等是一组经过封装的有效的关于Socket通信务器而主服务则采用并发服务器炮号服务器主要具有下列[4]的C++类此处是经过笔者移植的Linux版本功能1接收和转发最新炮号一旦炮号形成器形成了新的炮CSockaddisaClient号则立刻刷新当前炮号并发献给须要实时炮号的子系统比如中央控制室的大屏幕实时显示等此时炮号服务器又充当了CblockingSocketsaccept顾客端接收等离子体厚度和其他重要参数由于那些参数tiy{2大多来自重要的控制系统并且好多子系统须要那些参数为if!sListenlinux使用socket通信。
acceptsacceptsaClient{}了不影响控制系统的正常工作所以将这种参数统一发送到炮sacceptlinux使用socket通信。Readchai*&ReguestIDnIntSize号服务器再提供给其他子系统向所有子系统提供信息3switchReguestID{服务caseID_SEND_SHOTNOcaseID_SEND_IPLENGTHcaseID_GET_SHOTNOcaseID_GET_SHOTINFOcase}}catchCblockingSocketExceptione{图4HT-7炮号服务器示意图saccept。Cleanup}3。2多服务的合并因为在炮号服务器中存在新旧版本两组服务并且两者之间存在好多数据交换因而为了增强通信效率和简化编程将炮号服务器中包含了好多服务其实可以分别为每种服务两者转换成两个独立运行的线程集成到同一个程序中如下编撰相应的服务程序并且那样大大降低了系统开支并且这代码所示程序一开始就创建两个主线程OldSeiveiThiead和些服务之间同时还存在互相关联因而有必要将这种服务结合SeiveiThiead分别提供不同的服务这样也相当于两个服务器到同一个服务进程中这样可以明显降低正在执行的进程的数理论上多服务服务器引入了单点故障增加了可靠性并且在同时运行量因为采用了多线程技术这个缺点基本上可以克服有好多种3。
3多线程编程方式可以实现多服务服务器并且编程维护相对比较复杂在Linux系统下的多线程遵守POSIX线程接口称为实际中采用了一种简单有效的方式即所有服务共享同一个侦pthiead编撰Linux下的多线程程序须要使用头文件pthiead。h联接时须要使用库一般须要用到个基本函数听端口同时降低一个服务类型码的辨识过程如发送最新炮libpthiead。a5!"#2004。16计算机工程与应用线程因为并发服务器的主线程通常处于循环接受恳求状态pthlead_cleatepthlead_joinpthlead_seifpthlead_detachthlead_永远不会自己结束所以这种僵死线程也永远不会结束直至exit多线程编程是一门比较复杂的技术细节问题比较多还包括线程的同步与互斥线程的数据处理等等问题可以参考整个程序结束这样最终会造成线程数量达到系统所容许的最有关的文献在此只针对炮号服务器程中涉及的关键问题作一大数量难以创建新的线程其实可以通过在主线程中调用函数来结束从线程并且这些技巧比较复杂并且下说明pthlead_join对于并发服务器不是非常有效一种简单的方式就是通过设置调用创建线程时假如创建线程成功函数pthlead_cleatea从线程的属性为分离PTHREAD_CREATE_DETACHED来解返回若不为则说明创建线程失败常见的错误返回代码00决这个问题即线程运行结束了也就中止了马上释放系统为EINVAL和EAGAIN后者表示第二个参数代表的线程属性资源值非法前者表示系统限制创建新的线程诸如线程数量过多了而Linux下一般一个进程中最多可以有255个线程对于普通应用程序来说这个数量足够了并且对于一个大规模分4推论通过采用多线程通信技术在下可以开发更布式系统来说有成百上千台计算机而每台计算机可能同时SocketLinux加强壮和复杂的网路通信程序这早已在大规模分布式会发起好多次联接恳求倘若这种联接恳求陆续抵达而服务HT-7控制和数据采集系统中得到挺好的应用相比过去的循环服务器又没有及时处理完恳求的话可能会使当前进程中运行的线程数量达到系统所容许的上限因而在创建线程时必须判定返器和多进程服务器如今的基于多线程并发的炮号服务器在效率和性能上有了大幅度提升在HT-7化学实验中仍然十分良回值否则可能导致错误好的运行收稿日期年月创建线程时可以设置线程的属性属性主要包括是否绑200311定是否分离堆栈地址堆栈大小优先级等默认的属性为非绑定非分离缺省的堆栈与主线程同样级别的优先级参考文献1M并且有时须要重新设置属性属性值不能直接设置须使用相1。
JKXieHT-7gloup。inPiasmaPhysicsandContloiiedNuciealthFusionResealch[C]。InPloc16IntConfMontleaiIAEAVienna1996关函数进行操作初始化的函数为pthlead_attl_init这个函数2。DougiasEComelDavidLStevensZhaoGangetailinuxtar。Intelnetwolking必须在pthlead_cleate函数之前调用在炮号服务器中须要调WithTCP/IPVoi!Ciient-SelvelPloglammingAndAppiications整的一个关键属性是线程是否分离线程的分离状态决定其以Linux/POSIXSocketsVelsion[M]。beijingEiectlonicsIndustlyPless哪些样的形式结束自己在默认的非分离情况下原有的线程2000等待创建的线程结束才会释放自己占用的系统资源这不太3。DanieiRobbins。
POSIXthleadsexpiained。http///适宜于多线程并发服务器由于每次联接恳求主线程就会形成deveiopelWolks一个从线程线程数量仍然递增这引起积累了大量早已运行4。DavidJKlugiinskiPanAiminWangGuoyintlansiated。InsideVisuai结束正在等待主线程结束并且却没有释放系统资源的僵死C++4thEdition[M]。beijingTsinghuaUnivelsityPless1999上接105页试表明在其他不同的环境湿度下目标体温检测值的偏差均folj=0j
本文原创地址://gulass.cn/zgkxydlztwly.html编辑:刘遄,审核员:暂无