数量多线程的TCP服务器的并发连接

问题描述:

我们知道,在一个进程,线程数量有限制,像1000左右数量多线程的TCP服务器的并发连接

如果我想创建一个基于多线程TCP服务器,

每个线程负责一个连接。

由于有1个进程,线程数量是有限的。

那么它意味着并发连接的数量也是有限的。

我的理解是否正确?

如果不是,为什么?

谢谢

+0

我不知道你建议的线程数量的固定限制的种类(系统资源将施加一个限制,但它的unlikey恰好为1000)。也就是说,如果你想有效地支持大量的并发连接,你应该考虑使用更少的线程,每个线程使用'select'来等待来自多个套接字中的任何一个线程。 – simonc 2013-05-13 09:25:59

+0

你的意思是,在每个线程中,创建一个int connfd [n]。然后对于我(1,n):connfd [i] = accept()。然后选择(connfd [n])?有没有示例源代码?谢谢! – user1944267 2013-05-13 10:37:31

+1

我链接的旧[C10K](http://www.kegel.com/c10k.html)页面讨论了I/O策略和框架。 – Useless 2013-05-13 12:36:47

是的,线程的资源限制是由您的操作系统和硬件决定的。

Maximum number of threads per process in Linux?

你从来没有建立使用每个连接一个线程大规模并行服务器。使用select()或poll()和非阻塞套接字。如果您需要有多个线程处理输入(在一个进程中无法执行此操作之前确实需要很多线程,并且不应该进行阻塞调用),然后创建一个大小约为可用的处理器核心,并在可用时处理工作。

关于工人池概念的更多细节。一个线程可以处理从网络中读取所有传入的网络数据并将其扔到某个地方。但是,还有其他工作要处理这些数据。对于简单的聊天服务器类型的应用程序,不管有多少连接,一个线程可能负责读取数据和处理数据。但是,如果您必须对接收到的每个数据块进行一堆物理计算,则一个线程可能无法处理所有数学算法并保持与传入网络数据保持最新状态。在这种情况下,有一个线程将数据从网络中取出并放入要处理的数据的同步队列中。然后有少数或两个工作线程将数据从队列中取出并以线程安全的方式进行处理。

如果您尝试使用数千个线程执行此操作,您会放慢速度。他们都会争夺系统资源,并且由于他们中的任何一个都没有获得他们想要的CPU周期或RAM或CPU高速缓存,实际上你会进展得更慢。

http://en.wikipedia.org/wiki/Thread_pool_pattern

+0

什么是处理器内核?你的意思是数字CPU?那么通常它是1或2 – user1944267 2013-05-13 10:33:31

+0

http://en.wikipedia.org/wiki/Multi-core_processor-基本上我的意思是一个很小的数字 xaxxon 2013-05-13 11:13:37

+0

好的,它通常很小。像2或4。所以,你的意思是:在每个线程中,创建一个套接字描述符数组:int connfd [n]。然后对于我(1,n):connfd [i] = accept()。然后选择(connfd [n])?有没有示例源代码? – user1944267 2013-05-13 11:32:40

好,每个线程负责一个连接。是一个非常主观的陈述,我想。因为如果一个线程能够处理整个请求,并且没有留在队列中的任何积压,那么一个单线程就可以处理多个请求。

无论操作系统的线程,通道或连接或内存有多大,操作系统中的所有内容总是会受到限制,真正需要的不仅仅是线程的组合来处理您的整个请求的队列可能与tose处理线程一起。

+0

人们使用这种方法的最大原因是通常是因为他们想在处理输入时进行阻塞呼叫。对于低性能,低连接数的系统,这是一种处理连接的简单方法,无需担心如何确保无阻塞。由于阻塞,无论处理过程如何简单,单个线程都无法处理流量 - 即使它只有两个连接。 – xaxxon 2013-05-14 03:28:08

我们知道,在一个进程,线程数量有限制

如果我想创建一个基于多线程TCP服务器,

TCP服务器基于TCP套接字 - 其他任何东西都是实现细节

每个线程负责一个连接。

不要这样做。有关详情,请参阅C10K问题的讨论,但从本质上来说,这是特别不鼓励的,因为它的规模很差。

由于有1个进程,线程数量是有限的。 然后它意味着并发连接的数量也是有限的。

线程是资源。所有资源都是有限的。 插座也是有限的资源。唯一的问题是你的服务器性能如何,以及是否存在不必要的限制的瓶颈。

我的理解是否正确?

系统资源本质上受到限制是正确的。 你错在认为每个客户端线程都是服务器的可扩展或合理的设计。它有时用于易于编码比可伸缩性更重要的小型服务器。