一个Windows或Linux系统可以有多少线程?
我正在编写一个多线程可移植代码,它应该检查系统中的最大线程数。
发布于 2013-08-21 08:10:00
对于Windows,TechNet有一篇由Mark 推送Windows的限制:进程和线程撰写的文章。本文还链接到试验极限工具,它允许您在系统上进行实验。
TL;DR版本取决于Windows版本,您运行的是32位还是64位,您的应用程序是32位还是64位,对于32位程序,您是否将程序链接为“大地址感知”(以及/3GB NTLDR选项)。它也可能依赖于ASLR。这取决于您是使用默认的线程堆栈保留大小,还是调整它。
在没有/3GB开关的32位系统上运行的32位非大入口进程和默认的1 1meg堆栈保留将被限制在最多2048个线程上,但很可能会在此之前达到内存限制。
对于具有调整堆栈大小的64位进程,您可能期望使用2GB内存的线程达到40-50k。
无论如何,如果你甚至接近32位限制,你就做错了(TM)。您不希望使用每个请求都有一个线程的阻塞I/O --查看异步I/O和线程池(以及构建在这些抽象之上的所有高级抽象)。
发布于 2013-08-20 10:40:12
我很肯定,如果你真的“需要知道这一点”,你的设计是不好的。所有现代操作系统都可以支持几千个线程。
限制通常更多地是关于可用内存和CPU资源,而不是“您可以在system中创建多少线程”--换句话说,如果您的线程实际上做了一些事情,并且实际使用的内存超过了少量内存,那么在理论上最大线程数被创建之前,系统将耗尽内存。
例如,在我的机器上,/proc/sys/kernel/threads-max
超过250000 --我的机器有16 so的内存,所以每个线程大约有64 so。如果所有的内存都能用在线程上.其中一些将是内核代码、文件系统缓冲区等。
因此,在任何实际情况下,内存都将是您的限制,而不是系统可以支持的理论线程数。
发布于 2013-08-20 08:26:45
Linux,很简单。cat /proc/sys/kernel/threads-max
窗户,没那么简单。基本上,这取决于您在每个线程的堆栈上有多少ram /分配了多少-请参阅Windows Server 2003中的最大线程数是多少?;但基本上是<1000
https://stackoverflow.com/questions/18330189
复制相似问题