免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: iw1210
打印 上一主题 下一主题

[C] 只用select不用epoll,还要让服务器达到要求的并发能力,开多线程好还是开多进程好? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2013-01-23 18:28 |只看该作者
iw1210 发表于 2013-01-23 18:26
你的意思说在一个进程里,不管开多少线程,给每个select的传入的文件描述符总数大于FD_SETSIZE也不行? ...


是描述符的数值太大不行

论坛徽章:
0
12 [报告]
发表于 2013-01-23 18:30 |只看该作者
JohnBull 发表于 2013-01-23 18:28
是描述符的数值太大不行


每个线程里的select都传入不超过1000个描述符还大么?

论坛徽章:
0
13 [报告]
发表于 2013-01-23 18:35 |只看该作者
select接受最大描述符数量是对进程的限制,而不是对线程的限制?

论坛徽章:
0
14 [报告]
发表于 2013-01-23 18:37 |只看该作者
iw1210 发表于 2013-01-23 18:30
每个线程里的select都传入不超过1000个描述符还大么?


描述符的数值不能太大……

你用过select吗?第一个参数什么意思?

论坛徽章:
0
15 [报告]
发表于 2013-01-23 18:39 |只看该作者
An  fd_set is a fixed size buffer.  Executing FD_CLR() or FD_SET() with
a value of fd that is negative or is equal to or larger than FD_SETSIZE
will result in undefined behavior.

论坛徽章:
0
16 [报告]
发表于 2013-01-23 18:44 |只看该作者
回复 15# JohnBull

这个我知道,所以想用多个线程分担一下啊


   

论坛徽章:
0
17 [报告]
发表于 2013-01-23 18:58 |只看该作者
本帖最后由 zimang 于 2013-01-23 18:59 编辑

回复 12# iw1210


    select 1024 fd a process.

论坛徽章:
0
18 [报告]
发表于 2013-01-23 22:00 |只看该作者
本帖最后由 一刀。 于 2013-01-23 22:02 编辑

用多进程是可以的,listen之后,fork出10个进程,然后再select、accept,accept的套接字要设置为非阻塞方式,一旦有连接上来,10个进程都试图去accept,除了抢先执行的那个进程accept返回套接字,其他进程都返回-1,errno设置为EAGAIN或EWOULDBLOCK,如果是这个错误码,就继续select。

论坛徽章:
0
19 [报告]
发表于 2013-01-24 16:54 |只看该作者
多进程,两种方法参考:
1.主进程 accept,通过unix socket传递fd给子进程,主进程要同时对子进程作负载平衡
2.多个进程通过进程锁try_lock 对listen fd作select监听accept,这个select也同时监听其它fd的读写

论坛徽章:
0
20 [报告]
发表于 2013-01-24 17:52 |只看该作者
回复 1# iw1210


    你先了解一下epool,你会发现比select好多了,2G内存就能支持13万多的文件描述符,而且是事件触发式的比select的性能好。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP