WINDOWS操作系统中可以允许最⼤的线程数
⼀、线程数计算
1. 默认情况下,⼀个线程的栈要预留1M的内存空间,⽽⼀个进程中可⽤的内存空间只有2G,所以理论上⼀个进程中最多可以开2048个线程 ,
但是内存当然不可能完全拿来作线程的栈,所以实际数⽬要⽐这个值要⼩。
2. 可以通过连接时修改默认栈⼤⼩,将其改的⽐较⼩,这样就可以多开⼀些线程。 如将默认栈的⼤⼩改成512K,这样理论上最多就可以开4096
个线程。 即使物理内存再⼤,⼀个进程中可以起的线程总要受到2GB这个内存空间的限制。 ⽐⽅说你的机器装了64GB物理内存,但每个进程的内存空间还是4GB,其中⽤户态可⽤的还是2GB。
3. 如果是同⼀台机器内的话,能起多少线程也是受内存限制的。每个线程对象都要站⽤⾮页⾯内存,⽽⾮页⾯内存也是有限的,当⾮页⾯内存被
耗尽时,也就⽆法创建线程了。 如果物理内存⾮常⼤,同⼀台机器内可以跑的线程数⽬的限制值会越来越⼤。
⼆、在Windows下写个程序,⼀个进程Fork出2000个左右线程就会异常退出了,为什么?
这个问题的产⽣是因为windows32位系统,⼀个进程所能使⽤的最⼤虚拟内存为2G,⽽⼀个线程的默认线程栈StackSize为1024K(1M),这样当线程数量逼近2000时,2000*1024K=2G(⼤约),内存资源就相当于耗尽。
32位线程默认栈空间⼤⼩是1M,在我的64位的电脑上,32位的程序的最⼤虚拟内存是4G,所以线程数最多是4096个(4G/1M)。
windwos线程数查看
64位的程序虚拟内存可达8T,⽬前来说可以⽀持⼀个巨⼤的线程数。但是受限于实际的物理内存⼤⼩。如果内存限制忽略不计的话,下⾯的表格
可以最⼤线程数:
一个线程可以包含多个进程线程数
附:Win32将低区的2GB留给进程使⽤, ⾼区的2GB则留给系统使⽤。
Linux将⾼位1GB留给内核,低位3GB留给进程。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论