Pau*_*uli 5 c sockets linux multithreading server
嗨,我正在使用TCP在C语言的Linux上编写服务器.服务器必须处理多个连接(大约5000个连接).5000是最大值,但平均值应该是大约500-1000.我想知道什么是更好地用于处理客户端连接和监听.如果最好为每个客户端使用一个线程或使用select()函数.
1)线程 - 每个客户端都有自己的线程.线程正在侦听客户端的请求并对其进行处理.
选择功能 - 一个带选择的循环,其中所有请求都在处理中.(类似于这个http://www.binarytides.com/multiple-socket-connections-fdset-select-linux/)
如果我使用线程,它将需要大量的内存和CPU性能.因此,我更喜欢使用select,但我不确定select是否可以处理如此多的连接,以及它是否会减慢来自服务器的响应(存在必须通过客户端套接字的循环).那么对于这么多客户使用select是否可以呢?
我正在寻找我的答案但是,我还没有找到它,或者我只是不知道要搜索什么.所以请不要生气.
通常,线程非常昂贵:每个线程都需要其调用堆栈(通常为兆字节)并在调度程序中使用任务.所以常见的建议是最多拥有几十个线程(可能使用一些线程池).可能一百个线程可能是合理的(在一些功能强大的服务器上),但是数千个线程可能不合理:即使空闲线程在某种程度上也是昂贵的.
因此,我建议使用像一个多路复用呼叫民意调查(2) (优于select通常对文件描述符的数量,内建的大小硬编码限制fd_set).您可以另外使用线程池来提供活动连接(或请求).
实际上,你所指的是C10K问题.你也可以使用epoll(7).
几个事件循环库提供了一些有用的基础结构:libev,libevent,来自GTK的Glib,......
顺便说一句,您可以使用混合方法:使用线程池的进程池(可能在不同的计算机上运行).
请注意,一些编译器提供分离电池堆,和够程中的围棋语言的目的是使许多" 绿色线程 ".
| 归档时间: |
|
| 查看次数: |
2929 次 |
| 最近记录: |