第 3 1 卷第 3期
2 0 1 2年 9月
武 汉 工 业 学 院 学 报
J o u r n a l o f Wu h a n P o l y t e c h n i c Un i v e r s i t y
V01 . 3l No . 3
S e p. 201 2
文章编号: 1 0 0 9 - 4 8 8 1 ( 2 0 1 2 ) 0 3 - 0 0 5 4 - 0 6
D O I : 1 0 . 3 9 6 9 / j . i s s n . 1 0 0 9 - 4 8 8 1 . 2 0 1 2 . 0 3 . 0 1 4
L i n u x下基于 e p o l l +线程池高并发服务器实现研究
梁明刚, 陈西曲
( 武汉工业学院 电气与电子工程学院, 湖北 武汉 4 3 0 0 2 3 )
摘 要:在介绍 l i n u x系统下基于T C P / I P协议的 s o c k e t网络编程的客户端和服务器( c l i e n t /
s e r v e r ) 基本模型、 线程池和 e p o l l 机制的基础上, 给 出了基 于 e p o l l +线程池高并发服务器设计
的详细算法。最后, 给出一个在 l i n u x环境下用C语言编写的基于 e p o U和线程池技术的服务
器和客户端实验程序, 实现了服务器和客户端之间并发通信以及实验结果的截图。实验结果
表明, 基于e p o l l +线程池技术设计出来的高并发服务器能够保证服务器和客户端之间稳定高
效 的通信 。
关键词: l i n u x系统 ; 高并发服务器 ; 线程池 ; e p o l l 机制
中图分类号: r i p 3 1 2 文献标识码 : A
Th e r e s e ar c h on r e a l i z a t i o n o f h i g h c on c u r r e n t s e r v er
b a s e o n e p ol l p l u s t h r e a d p o o l i n L i n u x
HANG Mi n g- ga n g. CHEN 一 q u
(S c h o o l o f E l e c t r i c a l a n d E l e c t r o n i c E n g i n e e r i n g , Wu Ha n P o l y t e c h n i c U n i v e r s i t y , Wu h a n 4 3 0 0 2 3, C h i n a )
A b s t r a c t : T h i s p a p e r d e s c r i b l e s t h e n o r m a l c l i e n t a n d s e r v e r( c l i e n t / s e r v e r )mo d e l o f n e t w o r k c o mm u n i c a t i o n p r o -
g r a m b a s e d o n t h e t e c h n o l o g y o f s o c k e t wi t h TCP /I P p r o t o c o l , t h e t e c h n o l o g y o f t h r e a d p o o l a n d e p o H me c h a n i s m.
An d t h e n i t g iv e s t h e d e t a i l a lg o r i t h m wi t h t h e t e c h n o l o g y o f t h r e a d p o o l a n d e p o U t o a c c o mp l i s h t h e h i g h c o n c u r r e n t
s e r v e r . I n t h e e n d , t h i s p a p e r e x h i b i t s a n a p p l i c a t i o n e x a mpl e b a s e d o n t h e a l g o r it h m , wh i c h i s wr i t t e n b y C l a n —
g ua g e , i n t h e L i n u x s y s t e m a nd t h e r e s u l t p h o t o s . Th e r e s u l t s h o ws t h a t t h e c o n c u r r e n t s e r ve r wi t h t h e t e c h n o l o g y o f
e po l l p l us t h r e a d p o o l c a n ma k e s u r e t h e c o mmu ni c a t i o n be t we e n s e r v e r a n d c l i e n t s i s s t a b l e a n d e f f i c i e n t .
Key wor d s: Li n u x; h i g h c o n c u r r e nt s e r v e r ; t h r e a d p o o l ; e p o l l me c h a n i s m
在数字化、 网络化和信息化的当今, 计算机网络
技术得到了飞速的发展和广泛的应用…。在 T C P /
I P网络应用中, 通信的两个进程间相互作用的主要
模式是客户机/ 服务器模式( c l i e n t / s e r v e r ) 即客户机
向服务器提出请求, 服务器接收到请求后提供相应
的服务。而基于流式套接字( S O C K — s T R E A M) 的并
发服务器是目前 l i n u x网络服务器主流形式。随着
网络技术快速进入各行各业, 服务器的并发请求量
也成几何级数增加, 并且对服务器的实时性和可靠
性的要求也越来越高。而传统基于多进程和 s e l e c t
机制的并发服务器由于受到系统硬件资源和 l i n u x
内核版本的限制, 已经不能满足高实时性、 高可靠性
收稿 日期: 2 0 1 2 - 0 5 — 1 8 .
作者简介: 粱明刚( 1 9 8 6 一 ), 男, 硕士研究生, E — m a i l : 5 0 1 2 5 3 5 2 4 @q q . c o n l
通讯作者: 陈西曲( 1 9 7 1 一 ) , 男, 副教授, E — m a i l : c x q d h l @2 1 o n . t o n i .
基金项目: 湖北省自然科学基金项目( 2 o l 1 C HB 0 3 0 ) . 3期 梁明刚, 陈西曲: L i x 下基于 e p 0 1 1 + 线程池高并发服务器实现研究 5 5
和高并发性的要求。
本文针对传统并发服务器存在的这些不足之
处 , 在介绍多线程和线程池编程知识 以及 l i n u x 2 . 6
内核所采用的多路复用 I / 0机制中的 e p o l l 技术的
基础上, 给出了高并发服务设计的详细算法以及具
体实现的实例。
1 高并发服务器的原理及所用技术
1 . 1 s o c k e t 套接字技术
1 . 1 . 1 s o c k e t 的概念
T C P / I P网络中各种服务广泛地采用客户机和
服务器的模型。为了能够方便的开发网络的应用软
件, 由美国伯克利大学在 U N I X上推出一套直接访
问通信协议的一种接口技术: 套接字( s o c k e t ) , 其屏
蔽了底层网络的一些复杂的协议, 使普通的程序员
可以方便地访问 T C P / I P , 从而开发出各种产品的网
络应用程序。
1 . 1 . 2 套接字分类
L i n u x 系统支持三种套接字类型【 2 如下。
( 1 ) 数据报式套接字( S O C K — D G R A M) 。数据
报式套接字是基于 U D P协议实现的。其主要提供
对网络的传输的差错率要求不高, 但对实时性要求
极高的面向无连接网络服务。
( 2 ) 原始套接字( S O C K — R A W) 。原始套接字是
主要用于新网络协议的测试。其最大的特点就是允
许直接访问底层的网络协议。
( 3 ) 流式套接字( S O C K— S T R E A M) 。流式套接
字是基于 T C P协议实现的。其主要是提供三次握
手的无差错、 不丢失、 不重复、 并且按序到达的面向
连接的网络服务。
1 . 1 . 3 基 于T CP的 s o c k e t 编程模型
本文仅讨论基于流式套接字( S O C K ~ S T R E A M)
客户端/ 服务器模式的编程模型。其通信示意图如
图 1 所示。
服务器端程序编写的步骤: 第一步, 调用 s o c k e t
() 函数创建通讯所需要的流式套接字。第二步, 调
用 b i n d ( ) 函数将创建的套接字绑定到一个本地地
址和端口上。第三步, 调用 l i s t e n () 函数将套接字
设置成监听的模式。第四步, 调用 a c c p e t () 函数,
阻塞等待客户端请求到来, 当有客户端请求到来后,
它会创建一个对应于此连接新套接字, 随后就用这
个套接字与指定的客户端进行通信。第五步: 调用
r e c v ( ) 和 s e n d ( ) 函数与客户端进行数据通信。第
六步, 通信完成后调用 c l o s e ( ) 函数来关闭连接套接
字, 接着回到第四步。第七步: 在服务器端程序关闭
之前调用 c l o s e () 函数关闭监听套接字。
客户端程序编写的步骤: 第一步, 调用 s o c k e t ( )
函数创建用于通信的套接字。第二步, 调用 c o n n e c t
() 函数向指定的服务器发出连接请求。第三步, 调
用 r e c v ( ) 和 s e n d ( ) 函数与服务器进行数据的通信。
第四步: 通信完成之后调用 c l o s e ( ) 函数关闭套接
字 。
服务器
创建套接字
绑定套接字
监听套接字
阻塞等待客户端连接谪
返回连接套接字
数据交互
客户端
创建套接字
堡 皇 垄 竺 I 请 求 连 接
矗 — — — — — — — — 女
关闭连接套接字 I } 关闭套接字
关闭监听套接字
图 1 s o c k e t t c p通信示意图
1 . 2 i i n u x多线程编程
L i n u x 下多线程遵循 P O S I X( 可移植的操作系统
接口) 线程接口。和进程相比, 线程是一种非常“ 节
俭” 的多任务操作方式, 不但创建速度快, 而且线程
间通信也很方便, 容易维护。因此, 为了提高并发服
务器的可靠性和高效性我们采用多线程机制。
1 . 2 . 1 l i n u x多线程编程
L i n u x 操作系统提供了l i n u x T h r e a d s 库, 在这个
库中提供了在 l i n u x系统下线程编程的相关函数。
需要 注意 的一 点: 进行 多 线程 编程 必须 包含
p t h r e a d . h头文件, 在用 g c c命令进行编译链接时,
必需使用- -l p t h r e a d编译选项手动连接 l i b p t h r e a d . a
库。相关函数的原型如下所示 ] 。 5 6 武 汉 工 业 学 院 学 报 2 0 1 2年
( 1 ) 线程创建
i n t p t h r e a d—
c r e a t e( p t h r e a d—t p t i d 。 e o n s t
p t h r e a d —
at l r —
t a t l r.
v o i d ( s t a r t — r t n ) ( v o i d $) , v o i d
a r g ) 功能: 创建子线程
( 2 ) 线程退出
v o i d p t h r e a d — e x i t ( v o i d{ r v a l — p t r ) 功能: 终止调
用的线程
( 3 ) 线程等待
i n t p t hr e a d — j o i n( p t h r e a d — t p t i d , v o i d r v a l —
p t r ) 功能: 阻塞调用线程, 直到指定的线程终止
( 4 ) 线程异常处理函数
v o i d p t h r e a d—
c l e a n up—
p u s h ( v o i d(}r t n ) ( v o i d
) , v o i d a r s ) 功能: 将清除函数压人到清除栈
v o i d p t h r e a d—
c l e a n u p— p o p ( i n t e x e c u t e ) 功能: 将
清除函数弹出清除栈
1 . 2 . 2 线程池技术
在 l i n u x系统中, 采用多线程机制可以实现服务
器的并发请求, 但对于高并发服务器而言, 这里面存
在一个致命的安全隐患 1 。因为系统每创建一个
线程, 都会为该线程分配一定的系统资源, 所以一个
进程创建的子线程数是有限制的。如果在同一时刻
有大量的客户端并发请求服务器, 这时服务器的主
线程就不断地创建子线程处理连接到来的客户端,
这样系统的资源就慢慢消耗殆尽, 如果此时还有其
他客户端请求服务器, 这时服务器就没有额外资源
来创建线程来处理这个客户端到来的连接, 这时候
就会引发系统异常, 甚至造成整个服务器系统崩溃。
对此本文提出了线程池的解决方案, 使高并发
的服务器在有限资源的 l i n u x系统中得到实现。在
服务器的主线程中预先创建含有限个任务线程的线
程池, 一旦有客户请求到来就启动这些任务线程来
处理客户端到来的连接。超出部分的客户就先在任
务队列中等待, 等任务线程处理完任务后成为空闲
的任务线程, 空闲出来的任务线程就可以转而执行
等待队列中的任务。线程池工作原理如图2所示。
主线程: 初始化线程池结构体变量。在初始化线
程池变量时一次性创建并且启动m个任务线程的线
程池。线程池变量中有一个记录任务链表节点数的
变量 / 7 , , 当主线程向线程的任务链表头( H) 中抛人一
任务节点就让任务链表节点数加 1 , 同时调用 p t h r e a d
—
c o n d _
s i g n a l 函数唤醒空闲挂起的任务线程。
主线程
初始化线程池 P t h r e a d c r e a t e
任务线程池
创建 m个活动线程的线程池
空闲挂起等
待的线程
正在执行任
务的线程
取出一个任务节点
H I 任务链表 I T
图 2 线程池工作流程 图
任务线程池: 任务线程是在线程池结构体变量
初始化时启动的线程。任务线程池中的任务线程如
果检测到任务链表中的任务节点数不为零就从任务
链表尾( T ) 取出任务节点并执行相应的任务, 同时
让任务链表中的任务节点数减 1 。如果任务链表中
的任务数为零, 就调用 p t h r e a d — c o n d — w a i t 使任务线
程挂起, 等待主线程向任务链表中抛人一个任务并
且调用 p t h r e a d _ e o n d — s i g n a l 再次唤醒空闲挂起的任
务线程执行任务。
1 . 3 i i n u x 2 . 6内核的I / o复用e p o l l 机制
1 . 3 . 1 e p o l l 机制的工作原理
在 l i n u x系统下开发高并发 T C P连接的服务器
程序时, 必须要选用合适的 I / O技术和 I / 0分派机
制。并发的服务器设计在很长一段时间内使用的是
I / 0技术中的s e l e c t 机制。
但是 s e l e c t 机制存在着两点致命的缺陷: 第一,
s e l e c t 是采用的轮询的机制, 其工作效率与监听的事
件数成反比。第二, s e l e c t 监听的事件的数量是有明
显限制的。由于存在这两个“ 瓶颈” , s e l e c t 监听机
制并不能实现真正意义上的高并发服务器。
在 l i n u x 2 . 6以上版本的新内核中提出来 e p o l l
监听机制。e p o l l 机制的工作原理: 它无须遍历整个
被侦听的描述符集, 如果注册在 e p o l l 等待队列中的
s o c k e t 文件描述符事件状态发生了变化, 内核就直
接将这些事件放到 e v e n t s 数组中直接返回, 这点明
显不同与 s e l e c t 机制的轮询策略。因此它的这种触
发机制, 就不会随着监听事件数的增加而效率显剧
下降。e p o l l 中所监听的事件数没有限制, 它只与系
统的资源有关。
1 . 3 . 2 e p o l l 机制的编程函数
e p o l l 的相关编程函数的声 明在头文件 s y s /
e p o l 1 . h头文件中。其编程函数的原型如下。 3期 梁明刚, 陈西曲: L i n u 】 【 下基于 e p o l l +线程池高并发服务器实现研究 5 7
( 1 ) i n t e p o l l _ c r e a t e ( i n t s i z e )
功能: 创建一个 e p o l l 文件描述符。
( 2 ) i n t e p o l l — c t l ( i n t e p f d , i n t 0 p , i n t f d , s t r u c t
e p o l l e n t}e v )
功能: 控制 e p o l l 文件描述符上的事件, 包括事
件添加、 删除以及修改。
( 3 ) i n t e p o l l — w a i t ( i n t e p f d , s t r u e t e p o l l — e v e n t
e v e n ~, i n t m a x , i n t t i m e o u t )
功能: 等待注册在 e p o n文件描述符上的事件的产
生。·旦e p o n文件描述符注册的事件的状态发生了变
化, 就 事件用e v e n ~事件数组提取出来进行处理。
2 基于线程池 +e p o l l 技术高并发
服务器实现
前面已经讲述了基于套接字的客户端/ 服务器
的T C P网络应用程序编写的框架模型、 l i n u x 下多线
程编程和I / 0复用技术中的e p o l l 机制。由分析可
主线 程
初始化线程池 ( 互斥锁、条件变量) 、创建
e p o l l 文件描述符
创建 T C P 套接字并将其设置成非阻塞的状
态注册到e p o l l 等待队列中
知, 传统多线程并发服务器存的一些问题归根到底
是由于系统资源有限造成的。本文给出在资源有限
的 l i n u x系统下基于线程池和 e p o l l 机制的高并发服
务器详细算法如下图3所示。
2 . 1 算法的工作原理
该算法主要是实现主线程和线程池中的任务线
程之问的协同工作。主线程和任务线程池中的线程
的工作过程如下。
主线程: 第一步, 调用一个线程的初始化函数来
初始化线程池结构体变量中的互斥锁变量和条件变
量, 以及创建一个包含 m个活动线程的任务线程
池。第二 步, 调 用 e p o f l—c r e a t e函数来创建一个
e p o l l f d的文件描述符。第三步, 调用 s o c k e t 相关函
数来创建监听套接字 l i s t e n f d 。第四步, 调用 e p o l l —
c d函数将监听套接字 l i s t e n f d注册到e p o l l 事件的等
待队列中。第五步, 在一个“ 死循环” 中, 调用调用
e p o l l _ w a i t 阻塞等待注册在 e p o l l 上的 s o c k f d事件的
含m个活动线程的线程池
否
T h r e a d 2 1 …… 【 T h r e a d
任务链表是否存在
等待着的任务
将套接字绑定到特定的P地址和端口上 利用条件变量等待,
使线程挂起等待唤醒
t S J ~ l E J e p o
.
1 l _
阻 塞 等 待 注 册 柳” 上 的I s o ck f d 事件 l L— — 一
舾
~ j e l i s t e n f d嘴 接 > / 是
将 a c c e p t 返回连接套接字设置成非阻塞的
模式并注册9 ] e p o l l 等待队列中
是
取出任务节点、跟客户
端完成业务信息交互
关闭连接s o c k e t
向任务链表中添加一个任
务,唤醒线程池中的空闲线
程
图3 e p o l l +线程池 高并发服务算法 5 8 武 汉 工 业 学 院 学 报 2 0 1 2钜
发生, 依次处理到来的事件, 如果到来的的事件是监
听s o c k f d事件, 就调用 a c c e p t 函数来产生连接套接
字 c o n n f d , 并且将这个 c o n n f d也设置成非阻塞的状
态注册到 e p o l l 的事件等待的队列中, 如果到来的事
件是 c o n n f d事件就表明有已经连接的客户端的通
信数据到来, 就向任务线程池中抛人一个任务。并
且调用 p t h r e a d — c o n d — s i g n a l 函数来唤醒空闲的任务
线程来处理相关的数据通信。
线程池: 每一个任务线程都在一个 w h i l e的“ 死
循环” 中不断的检测任务链表中是否有任务节点,
如果没有任务节点, 就调用 p t h r e a d — c o n d — w a i t 函数
将该线程设置成为空闲阻塞等待的状态, 等待任务
链表中有任务节点后唤醒该空闲的任务线程来处理
任务。如果任务链表中存在着任务节点, 就取出任
务作相应的任务处理。通信完毕后就调用 c l o s e函
数关闭相应的连接套接字。
2 . 2 高并发通信系统编程实例
下面我们结合上面讲述的线程池 +e p o H机制
的高并发服务器的算法, 给出一个具体的 l i n u x下用
C语言编写的通信实例。服务器和客户端实现的功
能如下。
服务器: 先初始化一个含有 2个活动的任务线
程的线程池, 创建 e p o l l 文件描述符, 然后, 将监听套
接字加入到 e p o H事件等待队列中, 当有客户端连接
到来时, 就显示连接客户端的点分十进制的 I P地
址, 然后将 a c c e p t 返回的连接套接字注册到 e p o H等
待队列中。当已经连接的客户有数据要发送的时
候, 就向线程池任务链表中添加一个任务节点, 并唤
醒空闲的任务线程进行信息的接收, 并将接收到信
息打印显示, 随后将接受到的信息原样返回给客户
端。客户端: 建立 T C P连接套接字, 与服务器进行
连接。连接成功则显示 c o n n e c t s u c e s s f u l l y , 然后提
示用户输入等待发送的信息, 随后接收服务器返回
的信息并打印出来。
3 结果及分析
为了体现服务器并发请求和线程池处理多任务
的功能, 将线程池中的线程的活动情况实时打印出
来, 用2个活动的线程处理 3个客户并发请求。在
同一台虚拟机下, 先启动 1个终端运行服务器程序,
随后启动 3个终端运行客户端程序, 第一个客户端
向服务器发送球类的信息, 第二个客户端向服务器
发送动物类的信息, 第三个客户端向服务器发送家
具信 息。运行 程序 使用本 机的 回路地址 1 2 7 .
0 . 0 . 1 。实验的结果截图如图4 一图7所示。
图4 服务器截图
图5 客 户端 1截图
图 6 客户端 2截 图
图 7 客 尸端 3截 图
从上面的客户端和服务器的截图可知, 服务器:
创建一个含有 2个活动线程的线程池, 打印出这 2
个任务线程的线程 I D, 并且使这2个活动线程处于
等待状态。当3个客户端请求到来时, 就分别打印
出这三个客户端的的 I P地址。随后实时的打印客
户端发送的数据, 以及线程池中任务线程的工作状
态。客户端: 当第一个客户端向服务器发送球类数
据的同时第二个客户端也可以向服务器发送动物类
的数据, 但是这时第i个客户端向服务器端发送数 3期 粱明刚, 陈西曲: L j x下基于 e p o l l +线程池高并发服务器实现研究 5 9
据就不能被打印出来, 因为这个时候两个活动的线
程都处于繁忙的状态, 所以就无法处理第三个客户
端到来的任务请求, 故这个任务请求只能是保存在
任务链表中。当第一个客户端将数据处理完后, 任
务线程池就有空闲的线程来处理第三个客户到来的
任务请求, 可进行相应的数据通信, 并且将其通信的
信息打印输出。因为这里客户端数多于线程池中活
动线程数, 但是服务器和客户端之间仍然可以高效
稳定地进行通信。由此可知, 线程池和 e p o l l 机制巧
妙的结合能开发出可靠稳定高并发服务器程序。
4 结束语
本文通过介绍线程池技术和 e p o l l 多路复用的
I / 0机制, 揭示了传统并发服务器存在的一些问题。
针对这些问题, 提出了基于 e p o l l +线程池技术高并
发服务的详细算法。这种算法可以大大提高服务器
并发量, 很好克服由于系统的资源限制而导致系统
异常的问题。本文最后给出一个 l i n u x 下基于这种
算法的通信实例, 以及相应的实验结果。从结果分
析可知, 基于这种算法的高并发服务器是完全有可
以实现的。
参考文献 :
[ 1 ] 谢希仁. 计算机网络[ M] . 北京: 电子工业出
版社 . 2 0 0 9 .
[ 2 ]
[ 3 ]
[ 4 ]
孙鑫, 余安萍. VC++深入详解[ M] . j 匕 京: 电
子 工业 出版社 , 2 0 0 6 .
Ri c h a r d S t e v e n s W . S t e p h e n A Ra g o .UNI X 环
境高级编程[ M] . 尤晋元, 张亚英, 戚正伟. 北
京 : 人 民邮电出版社 , 2 0 0 6 .
刘新强, 曾兵义. 用线程池解决服务器的并发
请求的方案设计 [ J ] . 现代 电子技术, 2 0 1 1
( 8) .
( 上接第 5 3页)
向敏感性, 提高了配准精度, 使检测可靠性较高; ③
制作高质量的样本不占用检测时间。
算法有待改进之处: 当待测图像的对比度不高
时, 应先增强图像再进行检测。同时, 阈值 的选
取会影响实验结果。
4 . 2 实验结果
实验采集 P C B图像的分辨率为8 0 0 d p i , 两像素
之间的距离约为3 1 , 而 P C B板中导电区的导线宽
约为 1 0 0| L m, 要将影响P C B线路导通的缺陷处检出,
故将其连通区规模控制为至少3点, 只有高于三点的
点集中程度才能构成缺陷。按照本文所提出的检测
方法, 能检测出短路、 断路、 毛刺、 缺口等缺陷。检测
一
块 8 0×1 0 0 m m的 P C B板。所花费的时间是 3 0
m s 。图5为检测到待测板的毛刺、 短路缺陷。
图 5 待测板缺 陷
5 结束语
缺陷检测算法研究作为印刷电路板 自动光学检
测系统开发的一个主要内容, 研究 目标可归纳为提
高系统的实时性和精度, 这就要求利用缺陷算法快
速准确的搜索到缺陷处, 本文结合边缘梯度矢量提
出了一种仅用轮廓点检测缺陷实现方法, 实验表明:
该算法是一个计算量小、 实现简单、 检测精度和准确
性较高的算法, 能够满足工业应用的 A O I 系统的实
时性要求。
参考文献 :
[ 1 ] 刘国忠, 李运生, 周玺, 等. 基于分层参考比对
法印刷电路板 自动检测技术[ J ] . 制造业自动
化 , 2 0 1 0 , 3 2 ( 1 0 ) : 6 — 1 0 .
[ 2 ] 范小涛, 夏雨人. 一种基于图像处理 P C B检测
算法研究[ J ] . 计算机工程与应用, 2 0 0 4, 4 0
( 1 3 ) : 9 1 - 9 3 .
[ 3 ] 贾永红. 数字图像处理[ M ] . 武汉 : 武汉大学
出版社 ,2 0 0 3 +
[ 4 ] 何伟, 李薇, 张玲. 基于计算机 图像处理的电
路印刷板缺陷检测[ J 】 . 计算机测量与控制,
2 0 0 7 , 1 5 ( 1 0 ) : 1 2 9 5 — 1 2 9 7 .
[ 5 ] 胡涛. 基于轮廓对比的 P C B裸板缺陷检测算
法研究[ D] . 武汉: 华中科技大学, 2 0 0 9 .
如果觉得《Linux下基于epoll+线程池高并发服务器实现研究》对你有帮助,请点赞、收藏,并留下你的观点哦!