neilhappy 发表于 2013-04-15 10:37

关于select,poll,epoll的最大并发数

   请问大家:为什么select的并发会限制为一个进程所能打开的最大文件数,而poll,epoll则被限制为系统可以打开的总的文件数。是因为poll和epoll使用自定义的struct来存储fd吗? 但我感觉这与select直接存储fd在本质上是一样的。poll用struct pollfd的一个属性来存储fd,而epoll用struct epoll_event中的data这个union变量的fd来存储文件描述符,这与select直接存储文件描述符在本质上有什么区别呢?为什么select就被限制在单进程所能打开的最大文件数而poll,epoll就没有这个限制呢?

linux_c_py_php 发表于 2013-04-15 13:58

看fd_set是个什么你就懂了。

neilhappy 发表于 2013-04-15 22:09

回复 2# linux_c_py_php #ifdef FD_SETSIZE
#define        __DARWIN_FD_SETSIZE        FD_SETSIZE
#else /* !FD_SETSIZE */
#define        __DARWIN_FD_SETSIZE        1024
#endif /* FD_SETSIZE */
#define        __DARWIN_NBBY                8                                /* bits in a byte */
#define __DARWIN_NFDBITS        (sizeof(__int32_t) * __DARWIN_NBBY) /* bits per mask */
#define        __DARWIN_howmany(x, y)        ((((x) % (y)) == 0) ? ((x) / (y)) : (((x) / (y)) + 1)) /* # y's == x bits? */

__BEGIN_DECLS
typedef        struct fd_set {
        __int32_t        fds_bits;
} fd_set;
__END_DECLS
这段代码中的fds_bits的数组大小的定义我看不懂,能不能麻烦你讲一下。
   

linux_c_py_php 发表于 2013-04-15 22:12

这你也看不懂吗- -。。。

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

neilhappy 发表于 2013-04-16 08:51

回复 4# linux_c_py_php

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

wansbest 发表于 2013-04-20 00:40

上面所有的宏定义最终都是为了计算出1024bit需要多少个__int32_t,得到之后定义一个fd_set类型,这个数据类型事实就是一个数组,总共有1024bit。每一个fd在fd_set占一个

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

neilhappy 发表于 2013-04-20 16:42

回复 6# wansbest

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

dafa2007 发表于 2013-04-24 09:31

neilhappy 发表于 2013-04-15 22:09 static/image/common/back.gif
回复 2# linux_c_py_php 这段代码中的fds_bits的数组大小的定义我看不懂,能不能麻烦你讲一下。

修改 FD_SETSIZE的大小或者是修改__DARWIN_FD_SETSIZE的大小就可以了!
页: [1]
查看完整版本: 关于select,poll,epoll的最大并发数