没有合适的资源?快使用搜索试试~ 我知道了~
首页linux下的高并发处理select 和epoll
资源详情
资源推荐
1. select()
1.1 函数说明
简述:
确定一个或多个套接口的状态,如需要则等待。
!"
#$ #%&
:是一个整数值,是指集合中所有文件描述符的范围,即所有文件描述符的最大值
加 ',不能错!在 ( 中这个参数的值无所谓,可以设置不正确。
:(可选)指针,指向一组等待可读性检查的套接口。
:(可选)指针,指向一组等待可写性检查的套接口。
!":(可选)指针,指向一组等待错误检查的套接口。
#:%最多等待时间,对阻塞操作则为 )*。
注释:
本函数用于确定一个或多个套接口的状态。对每一个套接口,调用者可查询它的可读性、
可写性及错误状态信息。用 结构来表示一组等待检查的套接口。在调用返回时,这个
结构存有满足一定条件的套接口组的子集,并且 %返回满足条件的套接口的数目。有一
组宏可用于对 的操作,这些宏与 +,*! 软件中的兼容,但内部的表达是完全
不同的。
参数标识等待可读性检查的套接口。如果该套接口正处于监听 %状态,则
若有连接请求到达,该套接口便被标识为可读,这样一个 "%
调用保证可以无阻塞完成。
对其他套接口而言,可读性意味着有排队数据供读取。或者对于 -./01 类型套接口
来说,相对于该套接口的虚套接口已关闭,于是 $%
或 $#%
操作均能无阻塞完成。
如果虚电路被“优雅地”中止,则 $%不读取数据立即返回;如果虚电路被强制复位,则
$%将以 (0-))00/ 错误立即返回。如果 ---+2)2)0 选项被设置,则将检
查带外数据是否存在(参见 "%)。
参数标识等待可写性检查的套接口。如果一个套接口正在 %
连接(非
阻塞),可写性意味着连接顺利建立。如果套接口并未处于 %调用中,可写性意味着
%
和 %
调用将无阻塞完成。〔但并未指出这个保证在多长时间内有效,特别是在
多线程环境中〕。
!" 参数标识等待带外数据存在性或意味错误条件检查的套接口。请注意如果设
置了 ---+2)2)0 选项为假 0,则只能用这种方法来检查带外数据的存在与否。对
于 -/01 类型套接口,远端造成的连接中止和 .00230 错误都将被作为意味出错。
如果套接口正在进行连接 %(非阻塞方式),则连接试图的失败将会表现在
!" 参数中。
如果对 、 或 !" 中任一个组类不感兴趣,可将它置为空
)*。
在 头文件中共定义了四个宏来操作描述字集。40/250 变量用于确定一
个集合中最多有多少描述字(40/250 缺省值为 67,可在包含 前用
机密 第 1 页 共 13 页 8/6/21
840/250 来改变该值)。对于内部表示, 被表示成一个套接口的队列,
最后一个有效元素的后续元素为 2)3-.0/。宏为:
1.1.1 FD_CLR(s,*set):从集合 set 中删除描述字 s。
1.1.2 FD_ISSET(s,*set):若 s 为集合中一员,非零;否则为零。
1.1.3 FD_SET(s,*set):向集合添加描述字 s。
1.1.4 FD_ZERO(*set):将 set 初始化为空集 NULL。
# 参数控制 %完成的时间。若 # 参数为空指针,则 %将一直
阻塞到有一个描述字满足条件。否则的话,# 指向一个 #$ 结构,其中指定了
%调用在返回前等待多长时间。如果 #$ 为9::;,则 %立即返回,这可用
于探询所选套接口的状态。如果处于这种状态,则 %调用可认为是非阻塞的,且一切适
用于非阻塞调用的假设都适用于它。举例来说,阻塞钩子函数不应被调用,且 (2)4-( 套
接口实现不应 ,。
返回值:
%调用返回处于就绪状态并且已经包含在 结构中的描述字总数;如果超时
则返回 :;否则的话,返回 -.0/0- 错误,应用程序可通过 (< 0%
获取相应错误代码。
错误代码:
()-/2)2/2204:在使用此 2 之前应首先成功地调用 ( "%。
(0)0/4-():(2)4-( 套接口实现检测到网络子系统失效。
(02)3:超时时间值非法。
(02)/:通过一个 ( += %
来取消一个(阻塞的)调用。
(02)-<0:一个阻塞的 (2)4-( 套接口调用正在运行中。
(0)-/-.:描述字集合中包含有非套接口的元素。
2. epoll
2.1 概述
" 是 !
内核 为处理大批量句柄而作了改进的 ",是 ! 下多路复用 2- 接口 >" 的增强版
本,它能显著减少程序在大量并发连接中只有少量活跃的情况下的系统 * 利用率。
?
?
使用 " 进行高性能网络编程
机密 第 2 页 共 13 页 8/6/21
" 是 ! 下多路复用 2- 接口 >" 的增强版本,它能显著减少程序在大量并发连
接中只有少量活跃的情况下的系统 * 利用率,因为它不会复用文件描述符
集合来传递结果
而迫使开发者每次等待事件之前都必须重新准备要被侦听的文件描述符集合,另一点原因就是
获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核 2- 事件异步唤醒
而加入 , 队列的描述符集合就行了。" 的除了提供 >" 那种 2- 事件的电平
触发($/==)外,还提供了边沿触发(0=/==),这就使得用户空间
程序有可能缓存 2- 状态,减少 " >"" 的调用,提高应用程序
效率。
2.1.1 优点
支持一个进程打开大数目的 socket 描述符
最不能忍受的是一个进程所打开的 4 是有一定限制的,由 40/250 设置,
默认值是 @:7A。对于那些需要支持的上万连接数目的 21 服务器来说显然太少了。这时候你
一是可以选择修改这个宏然后重新编译内核,不过资料也同时指出这样会带来网络效率的下降,
二是可以选择多进程的解决方案(传统的 " 方案),不过虽然 ! 上面创建进程的代
价比较小,但仍旧是不可忽视的,加上进程间数据同步
远比不上线程间同步的高效,所以也不
是一种完美的方案。不过 " 则没有这个限制,它所支持的 4 上限是最大可以打开文件的
数目,这个数字一般远大于 @:7A举个例子,在 '<+ 内存的机器上大约是 ': 万左右,具体
数目可以 >">,>>8B# ! 察看,一般来说这个数目和系统内存
关系很大。
IO 效率不随 FD 数目增加而线性下降
传统的 >" 另一个致命弱点就是当你拥有一个很大的 集合,不过由于网
络延时
,任一时间只有部分的 是“活跃”的,但是 >" 每次调用都会线性扫描全
部的集合,导致效率呈现线性下降。但是 " 不存在这个问题,它只会对“活跃”的
进行操作BBB这是因为在内核实现中 " 是根据每个 上面的 C 函数实现的。那么,
只有“活跃”的 才会主动的去调用 C 函数,其他 状态 则不会,在
这点上," 实现了一个“伪”2-,因为这时候推动力在 内核。在一些 C# 中,
如果所有的 基本上都是活跃的BBB比如一个高速 ) 环境," 并不比 >"
有什么效率,相反,如果过多使用 "效率相比还有稍微的下降。但是一旦使用
模拟 () 环境," 的效率就远在 >" 之上了。
使用 ## " 加速内核与用户空间的消息传递。
这点实际上涉及到 " 的具体实现了。无论是 " 还是 " 都需要内核把 4
消息通知给用户空间,如何避免不必要的内存拷贝就很重要,在这点上," 是通过内核于
用户空间 ## " 同一块内存实现的。而如果你想我一样从 @D 内核就关注 " 的话,一定
不会忘记手工 ## " 这一步的。
内核微调
这一点其实不算 " 的优点了,而是整个 ! 平台的优点。也许你可以怀疑 ! 平
台,但是你无法回避 ! 平台赋予你微调内核的能力。比如,内核 />2
协议
栈使用内存
池管理 CE 结构,那么可以在运行时期动态调整这个内存 "(C ")的大
小BBB通过 FFFF>">,>>>= 完成。再比如 函数的
第 @ 个参数(/ 完成 G 次握手的数据包队列长度),也可以根据你平台内存大小动态调整。
机密 第 3 页 共 13 页 8/6/21
剩余12页未读,继续阅读
杨子aaaaaa
- 粉丝: 5
- 资源: 18
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功