免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3942 | 回复: 7
打印 上一主题 下一主题

[Linux] 关于select,poll,epoll的最大并发数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-15 10:37 |只看该作者 |倒序浏览
     请问大家:为什么select的并发会限制为一个进程所能打开的最大文件数,而poll,epoll则被限制为系统可以打开的总的文件数。是因为poll和epoll使用自定义的struct来存储fd吗? 但我感觉这与select直接存储fd在本质上是一样的。poll用struct pollfd的一个属性来存储fd,而epoll用struct epoll_event中的data这个union变量的fd来存储文件描述符,这与select直接存储文件描述符在本质上有什么区别呢?为什么select就被限制在单进程所能打开的最大文件数而poll,epoll就没有这个限制呢?

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2013-04-15 13:58 |只看该作者
看fd_set是个什么你就懂了。

论坛徽章:
0
3 [报告]
发表于 2013-04-15 22:09 |只看该作者
回复 2# linux_c_py_php
  1. #ifdef FD_SETSIZE
  2. #define        __DARWIN_FD_SETSIZE        FD_SETSIZE
  3. #else /* !FD_SETSIZE */
  4. #define        __DARWIN_FD_SETSIZE        1024
  5. #endif /* FD_SETSIZE */
  6. #define        __DARWIN_NBBY                8                                /* bits in a byte */
  7. #define __DARWIN_NFDBITS        (sizeof(__int32_t) * __DARWIN_NBBY) /* bits per mask */
  8. #define        __DARWIN_howmany(x, y)        ((((x) % (y)) == 0) ? ((x) / (y)) : (((x) / (y)) + 1)) /* # y's == x bits? */

  9. __BEGIN_DECLS
  10. typedef        struct fd_set {
  11.         __int32_t        fds_bits[__DARWIN_howmany(__DARWIN_FD_SETSIZE, __DARWIN_NFDBITS)];
  12. } fd_set;
  13. __END_DECLS
复制代码
这段代码中的fds_bits的数组大小的定义我看不懂,能不能麻烦你讲一下。
   

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
4 [报告]
发表于 2013-04-15 22:12 |只看该作者
这你也看不懂吗- -。。。

不就是算1024个比特要多少字节吗。。。

论坛徽章:
0
5 [报告]
发表于 2013-04-16 08:51 |只看该作者
回复 4# linux_c_py_php

1024/sizeof(__int32_t) * __DARWIN_NBBY  是得到1024bit可以存储的__int32_t类型的个数。这样又怎么能说明能打开文件的最大数量呢?
   

论坛徽章:
0
6 [报告]
发表于 2013-04-20 00:40 |只看该作者
上面所有的宏定义最终都是为了计算出1024bit需要多少个__int32_t,得到之后定义一个fd_set类型,这个数据类型事实就是一个数组,总共有1024bit。每一个fd在fd_set占一个

bit,现在应该明白为什么select限制打开的最大fd数是1024了吧!

论坛徽章:
0
7 [报告]
发表于 2013-04-20 16:42 |只看该作者
回复 6# wansbest

原来是这样啊,一个fd只占一个bit。我之前一直认为,文件描述符一遍声明为int,比如 int fd;然后fd在fd_set中也是存储为整型的。
原来fd在fd_set中是存储为bit的。我终于明白了,太感谢你了!

论坛徽章:
0
8 [报告]
发表于 2013-04-24 09:31 |只看该作者
neilhappy 发表于 2013-04-15 22:09
回复 2# linux_c_py_php 这段代码中的fds_bits的数组大小的定义我看不懂,能不能麻烦你讲一下。


修改 FD_SETSIZE的大小或者是修改__DARWIN_FD_SETSIZE  的大小就可以了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP