我们知道在一个进程中,线程数有一个限制,比如1000左右。
如果我想基于多线程创建tcp服务器,
每个线程负责一个连接。
因为有1个进程,所以线程数量有限。
然后它意味着并发连接的数量也有限制。
我的理解是否正确?
如果没有,为什么?
感谢
答案 0 :(得分:1)
我们知道在一个进程中,线程数有一个限制
真
如果我想基于多线程创建tcp服务器,
TCP服务器基于TCP套接字 - 其他任何东西都是实现细节
每个线程负责一个连接。
不要这样做。有关详细信息,请参阅C10K问题的讨论,但基本上不鼓励这样做,因为它的扩展性很差。
由于有1个进程,因此线程数量有限。 那么这意味着并发连接的数量也是有限的。
线程是一种资源。所有资源都是有限的。 套接字也是一种有限的资源。唯一的问题是您的服务器的扩展程度,以及它是否受到不必要的限制的瓶颈。
我的理解是否正确?
你是正确的,系统资源本质上是有限的。 你错误地认为每个客户端的线程对于服务器来说是一个可扩展或合理的设计。它有时用于小型服务器,其中易于编码比可扩展性更重要。
答案 1 :(得分:0)
是的,对操作系统和硬件确定的线程有资源限制。
Maximum number of threads per process in Linux?
永远不要使用每个连接的线程构建一个大规模并行服务器。使用select()或poll()和非阻塞套接字。如果您需要有多个线程处理输入(在一个进程中无法执行此操作之前确实需要很多,并且您不应该进行阻塞调用),然后创建一个大小为您可以使用的处理器核心,并使用它们来处理可用的工作。
有关工作人员池概念的更多详细信息。一个线程可以处理从网络读取所有传入的网络数据并将其丢弃到某处。但是,还有其他工作要处理这些数据。对于简单的聊天服务器类型应用程序,无论有多少个连接,一个线程都可能负责读取数据和处理数据。
但是,如果您必须对收到的每个数据块进行一系列物理计算,则一个线程可能无法处理所有数学并保持与传入网络数据保持同步。在这种情况下,让一个线程将数据从网络中取出并将其放入要处理的数据的同步队列中。然后让一些或两个工作线程从队列中取出数据并以线程安全的方式处理它。
如果您尝试使用数千个线程执行此操作,则会降低自己的速度。他们都会争夺系统资源,你实际上会慢慢进行,因为他们都没有得到他们想要的cpu周期或RAM或CPU缓存。
答案 2 :(得分:0)
嗯,每个线程负责一个连接。是一个非常主观的声明,我想。因为如果一个线程能够处理你的整个请求而没有留在队列中的任何积压,那么一个sigle线程就可以处理多个请求。
操作系统中的所有内容总是会受到限制,无论它的线程,内容或连接或内存有多大,实际上它需要的不仅仅是一个线程的副本来处理你的整个请求几个队列可能与处理线程一起。