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