Windows 和 linux 最大线程数

Posted

技术标签:

【中文标题】Windows 和 linux 最大线程数【英文标题】:Windows and linux max threads 【发布时间】:2013-08-20 08:19:52 【问题描述】:

Windows 或 Linux 系统可以有多少个线程?

我正在编写一个多线程可移植代码,它应该检查系统中的最大线程数。

【问题讨论】:

参见***.com/questions/344203/… 和***.com/questions/481900/… 分别适用于 Linux 和 Windows。 顺便说一句,我们在这里谈论多少线程?如果您打算拥有少于一打或两打线程,那么您就可以了。无需检查限制。相反,您应该做的只是检查生成线程是否成功。你真的不需要事先知道。 如果您期望接近极限,那么您的设计可能是错误的...... @SpongeBobFan:嗯,并非总是如此。如果您的线程正在执行任何阻塞 IO,则 CPU 内核处于空闲状态,等待阻塞 IO 完成。例如,使用异步 IO 将允许操作系统执行不同的线程。 这样的问题应该会自动添加一个指向If you have to ask, you're probably doing something wrong的链接! 【参考方案1】:

我很确定,如果您真的“需要知道这一点”,那么您的设计就是糟糕的。所有现代操作系统都可以支持数千个线程。

这些限制通常更多地是关于可用内存和 CPU 资源,而不是“你可以在系统 X 中创建多少线程”——换句话说,如果你的线程确实做了一些事情,并且实际上使用的内存不止一点点,那么在创建理论上的最大线程数之前,系统将耗尽内存。

例如,在我的机器上/proc/sys/kernel/threads-max 超过 250000 - 我的机器有 16GB 的内存,所以每个线程大约有 64KB。也就是说,如果所有内存实际上都可用于线程......其中一些将是内核代码、文件系统缓冲区等。

所以实际上,内存将是您的限制,而不是系统可以支持的理论线程数。

【讨论】:

【参考方案2】:

对于 Windows,TechNet 有一篇由 Mark Russinovich Pushing the Limits of Windows: Processes and Threads 撰写的文章。该文章还链接到 testlimit 工具,该工具可让您在自己的系统上进行试验。

TL;DR 版本取决于 Windows 版本,您运行的是 32 位还是 64 位 Windows,以及您的应用程序是 32 位还是 64 位,对于 32 位程序,您是否'将您的程序链接为“大地址感知”(和 /3GB NTLDR option)。它也可能取决于ASLR。这取决于你是使用默认的线程堆栈保留大小,还是调整它。

在没有 /3GB 开关的 32 位系统上运行的 32 位非大地址感知进程以及默认的 1meg 堆栈保留将被限制为最多 2048 个线程,但您很可能会占用内存在此之前的限制。

对于具有调整堆栈大小的 64 位进程,您可能会期望使用 2GB 内存达到 40-50k 线程。

无论如何,如果您甚至接近达到 32 位限制,那么您就是在做错事(TM)。您不希望每个请求都使用带有线程的阻塞 I/O - 查看异步 I/O 和线程池(以及基于它们构建的所有花哨的抽象)。

【讨论】:

【参考方案3】:

Linux,很简单。 cat /proc/sys/kernel/threads-max

Windows,更少。基本上这取决于你有多少内存/你在每个线程的堆栈上分配了多少 - 请参阅What's the maximum number of threads in Windows Server 2003?;但基本上

【讨论】:

/proc/sys/kernel/threads-max 是全局线程限制,不能被视为每个进程的限制。例如,如果它说 20000 并且当前全球有 19999 个线程,则您的进程根本无法生成除主线程之外的任何线程。 @NikosC。是的,但他确实特别询问了系统限制。 @MartinJames 一个公平的观点,引用的链接来自 2009 年,基本观点是(实际的)线程数比其他任何东西都受到内存限制。

以上是关于Windows 和 linux 最大线程数的主要内容,如果未能解决你的问题,请参考以下文章

Linux最大线程数限制及当前线程数查询

windows一个进程中的最大线程数与哪些因素有关

Linux 系统开启最大线程数 调优

如何配置最大工作线程数

WINDOWS操作系统中可以允许最大的线程数

浅谈linux下进程最大数最大线程数进程打开的文件数