Windows 或 Linux 系统可以有多少个线程?
我正在编写一个多线程可移植代码,它应该检查系统中的最大线程数。
Windows 或 Linux 系统可以有多少个线程?
我正在编写一个多线程可移植代码,它应该检查系统中的最大线程数。
我很确定,如果您真的“需要知道这一点”,那么您的设计就很糟糕。所有现代操作系统都可以支持数千个线程。
这些限制通常更多地是关于可用内存和 CPU 资源,而不是“你可以在系统 X 中创建多少线程”——换句话说,如果你的线程确实做了一些事情,并且实际上使用的内存不止一点点,系统就会运行在创建理论最大线程数之前内存不足。
例如,在我的机器/proc/sys/kernel/threads-max
上超过 250000 - 我的机器有 16GB 的内存,所以每个线程大约有 64KB。那就是如果所有内存实际上都可用于线程......其中一些将是内核代码、文件系统缓冲区等。
因此,在任何实际情况下,内存将成为您的限制,而不是系统可以支持的理论线程数。
对于 Windows,TechNet 有一篇 Mark Russinovich推动 Windows 的极限:进程和线程的文章。本文还链接到testlimit工具,该工具可让您在系统上进行试验。
TL;DR 版本取决于 Windows 版本,您运行的是 32 位还是 64 位 Windows,以及您的应用程序是 32 位还是 64 位,对于 32 位程序,您是否正在链接您的程序作为“大地址感知”(和 /3GB NTLDR 选项)。它也可能取决于ASLR。这取决于你是使用默认的线程堆栈保留大小,还是调整它。
在没有 /3GB 开关的 32 位系统上运行的 32 位非大地址感知进程和默认的 1meg 堆栈保留将被限制为最多 2048 个线程,但在此之前您很可能会达到内存限制.
对于具有调整堆栈大小的 64 位进程,您可能期望使用 2GB ram 达到 40-50k 线程。
无论如何,如果您甚至接近达到 32 位限制,那么您就是在做错事(TM)。您不想在每个请求中使用带有线程的阻塞 I/O - 查看异步 I/O 和线程池(以及在这些之上构建的所有花哨的抽象)。
Linux,这很容易。cat /proc/sys/kernel/threads-max
窗户,更少。基本上,这取决于您拥有多少内存/在每个线程的堆栈上分配了多少 - 请参阅Windows Server 2003 中的最大线程数是多少?; 但基本上<1000