一个进程最多可以创建线程的数目
2015-12-25 18:02
375 查看
1,在x86平台32位系统,系统占用2GB地址空间,用户方式2GB。如果使用VS,链接程序开关/SACK 或者/F可以设置线程堆栈大小,默认分配一个线程的堆栈大小是1MB,当CreateThread参数的StackSize大小与链接程序设置的不一致时,采用的方法是谁大用谁的,所以用4KB修改当然不会有改变!理论上最大线程数=2GB/1MB=2048。
实际上这个用户方式的2GB并不会全部用作线程堆栈。首先程序的代码和数据、进程环境块、线程环境块、空指针区域等等也需要占用一定的地址空间;再者2GB只是虚拟内存,如果非分页内存被用完,就无法再创建线程,这个与特定机器有关,所以不同机器上做最大线程数测试得到的数字可能不一样。
2,操作系统给一个系统进程提供的空间是2GB ,而一个线程堆栈的空间默认在启动的时候是1MB 那么启动完2000后,基本上就有2GB了,你可以减小默认堆栈的大小。
3,默认情况下,一个线程的栈要预留1M的内存空间而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程
但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小。你也可以通过连接时修改默认栈大小,将其改的比较小,这样就可以多开一些线程。如将默认栈的大小改成512K,这样理论上最多就可以开4096个线程。即使物理内存再大,一个进程中可以起的线程总要受到2GB这个内存空间的限制。比方说你的机器装了64GB物理内存,但每个进程的内存空间还是4GB,其中用户态可用的还是2GB。如果是同一台机器内的话,能起多少线程也是受内存限制的。每个线程对象都要站用非页面内存,而非页面内存也是有限的,当非页面内存被耗尽时,也就无法创建线程了。
如果物理内存非常大,同一台机器内可以跑的线程数目的限制值会越来越大。
在Windows下写个程序,一个进程Fork出2000个左右线程就会异常退出了,为什么?
这个问题的产生是因为windows32位系统,一个进程所能使用的最大虚拟内存为2G,而一个线程的默认线程栈StackSize为1024K(1M),这样当线程数量逼近2000时,2000*1024K=2G(大约),内存资源就相当于耗尽。
4,默认每线程1MB堆栈的话,只能开2048线程(如果你的其它系统资源足够的话)。要想开更多线程,只能修改每个线程的堆栈,但实际中是不推荐这样做的,因为如果你的线程因为一些工作因为线程堆栈不够的话,会导致整个进程崩溃.修改堆栈的方法好像只在XP或以上系统有效,windows 2000中不支持。
实际上这个用户方式的2GB并不会全部用作线程堆栈。首先程序的代码和数据、进程环境块、线程环境块、空指针区域等等也需要占用一定的地址空间;再者2GB只是虚拟内存,如果非分页内存被用完,就无法再创建线程,这个与特定机器有关,所以不同机器上做最大线程数测试得到的数字可能不一样。
2,操作系统给一个系统进程提供的空间是2GB ,而一个线程堆栈的空间默认在启动的时候是1MB 那么启动完2000后,基本上就有2GB了,你可以减小默认堆栈的大小。
3,默认情况下,一个线程的栈要预留1M的内存空间而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程
但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小。你也可以通过连接时修改默认栈大小,将其改的比较小,这样就可以多开一些线程。如将默认栈的大小改成512K,这样理论上最多就可以开4096个线程。即使物理内存再大,一个进程中可以起的线程总要受到2GB这个内存空间的限制。比方说你的机器装了64GB物理内存,但每个进程的内存空间还是4GB,其中用户态可用的还是2GB。如果是同一台机器内的话,能起多少线程也是受内存限制的。每个线程对象都要站用非页面内存,而非页面内存也是有限的,当非页面内存被耗尽时,也就无法创建线程了。
如果物理内存非常大,同一台机器内可以跑的线程数目的限制值会越来越大。
在Windows下写个程序,一个进程Fork出2000个左右线程就会异常退出了,为什么?
这个问题的产生是因为windows32位系统,一个进程所能使用的最大虚拟内存为2G,而一个线程的默认线程栈StackSize为1024K(1M),这样当线程数量逼近2000时,2000*1024K=2G(大约),内存资源就相当于耗尽。
4,默认每线程1MB堆栈的话,只能开2048线程(如果你的其它系统资源足够的话)。要想开更多线程,只能修改每个线程的堆栈,但实际中是不推荐这样做的,因为如果你的线程因为一些工作因为线程堆栈不够的话,会导致整个进程崩溃.修改堆栈的方法好像只在XP或以上系统有效,windows 2000中不支持。
相关文章推荐
- angularjs自定义表单验证email
- Androin 常用组件下拉框日期选择器、时间选择器、RadioButton、CheckBox使用
- 敏捷软件测试
- js-面试题1
- 一个简单的自定义通信协议(socket)
- NSOperationQueue应用
- mac编译Android版本ffmpeg的x86_64架构库
- 最简单的扫描生成二维码
- Linux的压缩命令
- rename命令
- 分布式系统基础及MogileFS
- 【归纳】读书与心智——心智工具箱
- ios NSCharacterSet使用讲解
- Android 给scrollView添加毛玻璃效果的标题栏
- 解析提高PHP执行效率的50个技巧
- [Lua]mac 上安装lua
- Duplicate id, tag null, or parent id 0x0 with another fragment 解决方案
- 【LEETCODE】190-Reverse Bits
- 懒加载、plist文件数据加载、图片显示
- Android Studio导入第三方类库的方法