发明名称 一种面向物联网平台的套接字实现方法
摘要 一种面向物联网平台的套接字实现方法,面向物联网应用的服务器需要为大量并发连接提供高效,高可靠性的服务,同时通信层应当尽量减小系统负荷。为此在物联网平台的通信层,利用缓冲池、线程池建立多线程并发连接,提出一种高效Socket服务器设计方案,在应对大量的用户和数据请求的同时,最大限度地减少系统开销和缓存的使用。仿真结果表明,引入线程池和缓冲池的Socket服务器可减少线程的创建和销毁时间以及客户端阻塞时间,减少线程的动态生成和销毁过程,从而增强服务器的处理能力。
申请公布号 CN102546437B 申请公布日期 2014.10.22
申请号 CN201210038597.X 申请日期 2012.02.20
申请人 南京邮电大学 发明人 王堃;于悦;暴建民;胡海峰;郭篁;房硕
分类号 H04L12/861(2013.01)I;H04L29/08(2006.01)I;H04L1/18(2006.01)I 主分类号 H04L12/861(2013.01)I
代理机构 南京经纬专利商标代理有限公司 32200 代理人 叶连生
主权项 一种面向物联网平台的套接字实现方法,其特征在于在物联网平台的通信层,利用缓冲池、线程池建立多线程并发连接,提出一种高效套接字服务器设计方法,具体如下:1)使用线程池技术构建套接字服务器;2)设计系统运行支撑方案;3)深入分析线程池的工作机制,计算动态线程池在面临超过其容量的请求时的开销,提出使用缓冲池存储超量连接请求;4)对总体设计进行优化,设计常见的突发情况的解决方案;所述的使用线程池技术构建套接字服务器,包括改进型通信模块设计和线程池设计,本方法在线程池前加入了缓冲池接收超量线程,当线程池中出现空闲线程时从缓冲池中取出新的连接请求,套接字服务器用于完成两个程序之间的网络通讯和消息处理操作,服务器必须给出自己的IP地址和端口号,客户端向该地址的相应端口请求连接;具体过程为:服务器端建立服务器套接字监听客户端的连接,收到请求后建立连接,并取出不同数据格式的消息进行处理,将处理后的结果返回,客户端向服务器发送连接请求,建立连接后就向服务器发送或从服务器接收消息;所述的系统运行支撑方案是:系统使用自定协议,客户端和服务器发送和接收数据包完成消息处理任务并进行通信,数据包大小设计为100Bytes;系统处理消息后以数据包的形式将消息返回;为了达到双工,设定发送与接收两条线程,并且发送线程是接收线程的子线程;服务器收到的消息放入接收消息队列交由业务层处理,当业务层处理完毕,各个线程去发送消息队列取出属于自己的处理结果然后发送;所述的设计常见突发情况的解决方案是1)如何标记不同客户端的任务的方案;2)接收数据时可能有阻塞的解决方案;3)Socket关闭后仍进行读写操作的改进解决方案;4)客户端意外断开的改进解决方案;所述的改进型通信模块设计,基本设计方案为:为了满足双工通信的要求,即服务器和客户端同时收发数据,需建立发送,接收两个线程,线程池中存放的是接收线程,在建立连接后该线程取出Socket连接,接收消息并进行处理,随后通过接收消息队列传送至上层,同时建立发送线程,监听发送消息队列,即与上层的接口,存放上层处理完的结果,并发送信息;与此同时,接收线程处于阻塞状态,客户端请求断开,则关闭Socket连接;此外,为防止连接数过多,将超过池中线程数的连接放入缓冲池,等到出现空闲线程再取出;所述的线程池设计,关键问题是线程池大小的设置问题,最佳线程池大小n<sup>*</sup>的确定方法如下:线程技术中的两个主要开销是线程的建立和销毁,以及线程的维护,设第一种开销为C1,第二种开销为C2,C1大部分是为线程分配内存的时间,C2则是线程的上下文切换时间;实际情况中C1&gt;&gt;C2,假设线程池大小为n,n为定值,当前运行的线程数为r,分别考虑线程池的使用与否对于系统性能的影响:1)当池中存活的线程数小于池的大小时,0≦r≦n,在有线程池的情况下系统的开销仅限于在各个线程之间进行切换,即C2·n;而没有线程池时系统需要对每一个新连接创建并销毁线程,开销为C1·r,使用线程池的方案将使得系统性能提升C1·r‑C2·n;2)当池中存活的线程数大于池的大小时,r&gt;n,任务数超过了线程池的最大值,此时线程池必须为多余的任务创建新线程,开销为C2·n+C1·(r‑n),而没有线程池的开销依然为C1·r;使用线程池的方案使得系统性能提升了C1·n‑C2·n,实际环境中线程池中存活的线程是在不断变化的,设变量r为当前运行的线程数,f(r)为其分布律,线程池大小n的期望为:<maths num="0001" id="cmaths0001"><math><![CDATA[<mrow><mi>E</mi><mrow><mo>(</mo><mi>n</mi><mo>)</mo></mrow><mo>=</mo><munderover><mi>&Sigma;</mi><mrow><mi>r</mi><mo>=</mo><mn>0</mn></mrow><mi>n</mi></munderover><mrow><mo>(</mo><msub><mi>C</mi><mn>1</mn></msub><mo>&CenterDot;</mo><mi>r</mi><mo>-</mo><msub><mi>C</mi><mn>2</mn></msub><mo>&CenterDot;</mo><mi>n</mi><mo>)</mo></mrow><mo>&CenterDot;</mo><mi>f</mi><mrow><mo>(</mo><mi>r</mi><mo>)</mo></mrow><mo>+</mo><munderover><mi>&Sigma;</mi><mrow><mi>r</mi><mo>=</mo><mi>n</mi><mo>+</mo><mn>1</mn></mrow><mo>&infin;</mo></munderover><mrow><mo>(</mo><msub><mi>C</mi><mn>1</mn></msub><mo>&CenterDot;</mo><mi>n</mi><mo>-</mo><msub><mi>C</mi><mn>2</mn></msub><mo>&CenterDot;</mo><mi>n</mi><mo>)</mo></mrow><mo>&CenterDot;</mo><mi>f</mi><mrow><mo>(</mo><mi>r</mi><mo>)</mo></mrow><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>1</mn><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000536620100000011.GIF" wi="1397" he="133" /></maths>设最佳线程池大小为n<sup>*</sup>,其期望为:<maths num="0002" id="cmaths0002"><math><![CDATA[<mrow><mi>E</mi><mrow><mo>(</mo><msup><mi>n</mi><mo>*</mo></msup><mo>)</mo></mrow><mo>=</mo><munder><mi>sup</mi><mrow><mi>n</mi><mo>&Element;</mo><mi>N</mi></mrow></munder><mi>E</mi><mrow><mo>(</mo><mi>n</mi><mo>)</mo></mrow><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>2</mn><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000536620100000021.GIF" wi="1237" he="101" /></maths>N表示线程池中线程数的所有可能取值的集合,<img file="FDA0000536620100000022.GIF" wi="186" he="98" />表示E(n)的取值上界,将(1)改写成如下形式,p(r)为线程池中存活的线程数的概率密度函数<maths num="0003" id="cmaths0003"><math><![CDATA[<mrow><mi>E</mi><mrow><mo>(</mo><mi>n</mi><mo>)</mo></mrow><mo>=</mo><msubsup><mo>&Integral;</mo><mn>0</mn><mi>n</mi></msubsup><mrow><mo>(</mo><msub><mi>C</mi><mn>1</mn></msub><mo>&CenterDot;</mo><mi>r</mi><mo>-</mo><msub><mi>C</mi><mn>2</mn></msub><mo>&CenterDot;</mo><mi>n</mi><mo>)</mo></mrow><mo>&CenterDot;</mo><mi>p</mi><mrow><mo>(</mo><mi>r</mi><mo>)</mo></mrow><mi>dr</mi><mo>+</mo><msubsup><mo>&Integral;</mo><mi>n</mi><mo>&infin;</mo></msubsup><mrow><mo>(</mo><msub><mi>C</mi><mn>1</mn></msub><mo>&CenterDot;</mo><mi>n</mi><mo>-</mo><msub><mi>C</mi><mn>2</mn></msub><mo>&CenterDot;</mo><mi>n</mi><mo>)</mo></mrow><mo>&CenterDot;</mo><mi>p</mi><mrow><mo>(</mo><mi>r</mi><mo>)</mo></mrow><mi>dr</mi><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>3</mn><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000536620100000023.GIF" wi="1524" he="101" /></maths>为了得到E(n)的最大值,对(3)进行求导,得式(4):<maths num="0004" id="cmaths0004"><math><![CDATA[<mrow><mfrac><mi>dE</mi><mi>dn</mi></mfrac><mo>=</mo><mo>-</mo><msub><mi>C</mi><mn>2</mn></msub><mo>+</mo><msub><mi>C</mi><mn>1</mn></msub><mo>&CenterDot;</mo><msubsup><mo>&Integral;</mo><mi>n</mi><mo>&infin;</mo></msubsup><mi>p</mi><mrow><mo>(</mo><mi>r</mi><mo>)</mo></mrow><mi>dr</mi><mo>=</mo><mn>0</mn><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>4</mn><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000536620100000024.GIF" wi="1273" he="128" /></maths>改写(4),设维持运行线程与创建新线程的比率为ξ=C<sub>2</sub>/C<sub>1</sub>:<maths num="0005" id="cmaths0005"><math><![CDATA[<mrow><msubsup><mo>&Integral;</mo><msup><mi>n</mi><mo>*</mo></msup><mo>&infin;</mo></msubsup><mi>p</mi><mrow><mo>(</mo><mi>r</mi><mo>)</mo></mrow><mi>dr</mi><mo>=</mo><mi>&xi;</mi><mo>,</mo><msubsup><mo>&Integral;</mo><mn>0</mn><msup><mi>n</mi><mo>*</mo></msup></msubsup><mi>p</mi><mrow><mo>(</mo><mi>r</mi><mo>)</mo></mrow><mi>dr</mi><mo>&le;</mo><mn>1</mn><mo>-</mo><mi>&xi;</mi><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>5</mn><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000536620100000025.GIF" wi="1362" he="140" /></maths>由于线程池大小为整数,所以n<sup>*</sup>可由下式确定:<maths num="0006" id="cmaths0006"><math><![CDATA[<mrow><msubsup><mo>&Integral;</mo><mn>0</mn><msup><mi>n</mi><mo>*</mo></msup></msubsup><mi>p</mi><mrow><mo>(</mo><mi>r</mi><mo>)</mo></mrow><mi>dr</mi><mo>&le;</mo><mn>1</mn><mo>-</mo><mi>&xi;</mi><mo>,</mo><msubsup><mo>&Integral;</mo><mn>0</mn><mrow><msup><mi>n</mi><mo>*</mo></msup><mo>+</mo><mn>1</mn></mrow></msubsup><mi>p</mi><mrow><mo>(</mo><mi>r</mi><mo>)</mo></mrow><mi>dr</mi><mo>></mo><mn>1</mn><mo>-</mo><mi>&xi;</mi><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>6</mn><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000536620100000026.GIF" wi="1363" he="130" /></maths>式(6)表明n<sup>*</sup>与ξ有关,当线程切换的开销远小于线程创建与销毁的开销时,线程池的容量更大;式(5)式(6)也表明n<sup>*</sup>与系统当前负载p(r)有关。
地址 210003 江苏省南京市新模范马路66号