Select和epoll的区别
来源:互联网 发布:ubuntu tty 编辑:程序博客网 时间:2024/04/30 21:15
当一个节点和多个节点建立连接时,如何高效的处理多个连接的数据,下面具体分析两者的区别。
1. select函数
函数原型:int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
参数介绍:(1)nfds -- fdset集合中最大描述符值加1
(2)fdset -- 一个位数组,其大小限制为_FD_SETSIZE(1024)
位数组的每一位代表的是其对应的描述符是否需要被检查。
(3)readfds -- 读事件文件描述符数组
(4 )writefds -- 写事件文件描述符数组
(5)exceptfds -- 错误事件文件描述符数组
(6)timeout -- 超时事件,该结构被内核修改,其值为超时剩余时间。
对应内核:select对应于内核中的sys_select调用,sys_select首先将第二三四个参数指向的fd_set拷贝到内核,然后对每个被SET的描 述符调用进行poll,并记录在临时结果中(fdset),如果有事件发生,select会将临时结果写到用户空间并返回;当轮询一遍后没有任何事件发生时,如果指定了超时时间,则select会睡眠到超时,睡眠结束后再进行一次轮询,并将临时结果写到用户空间,然后返
2. select/poll特点
3.1 所用到的函数:
select 最不能忍受的是一个进程所打开的FD是有一定限制的,由FD_SETSIZE设置,默认值是2048。对于那些需要支持的上万连接数目的IM服务器来说显然太少了。这时候可以:
传统的select/poll另一个致命弱点就是当你拥有一个很大的socket集合,不过由于网络延时,任一时间只有部分的socket是"活跃"的,但是select/poll每次调用都会线性扫描全部的集合,导致效率呈现线性下降。
<4>内核微调
这一点其实不算epoll的优点了,而是整个linux平台的优点。也许你可以怀 疑linux平台,但是你无法回避linux平台赋予你微调内核的能力。比如,内核TCP/IP协议栈使用内存池管理sk_buff结构,那么可以在运行 时期动态调整这个内存pool(skb_head_pool)的大小--- 通过echo XXXX>/proc/sys/net/core/hot_list_length完成。再比如listen函数的第2个参数(TCP完成3次握手 的数据包队列长度),也可以根据你平台内存大小动态调整。更甚至在一个数据包面数目巨大但同时每个数据包本身大小却很小的特殊系统上尝试最新的NAPI网 卡驱动架构。
转自:http://blog.csdn.net/mafuli007/article/details/7233304
- Select和epoll的区别
- Select和epoll的区别
- Select和epoll的区别
- select和epoll的区别
- Select和epoll的区别
- select和epoll的区别
- Select和epoll的区别
- Select和epoll的区别
- epoll 和 select 的区别
- select和Epoll的区别
- epoll和select的区别
- epoll和select的区别
- epoll和select的区别
- Select和epoll的区别
- select和epoll的区别
- select 和 epoll的区别
- select和epoll的区别
- epoll和select的区别
- 用BCB做一个自己的Color Dector --- 实时显示鼠标所在位置的像素值
- 产品经理之复审原型
- gradle学习(19)-log系统
- 对pair的sort
- automake 安装及使用
- Select和epoll的区别
- 几个页面跳转以及传值(通知传值)
- 【C++ Primer】【学习笔记】【第十章】关联容器之:map类型
- 数据结构课程设计03
- LeetCode--Sort Colors
- [汉诺塔][第二阶段-汉诺塔入门][HDOJ-2077]汉诺塔IV
- visualgo动态学习数据结构
- 比特币网络的弱点(三)
- java.lang.ClassNotFoundException: org.slf4j.LoggerFactory异常处理