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

默认情况下,一个线程的栈要预留1M的内存空间 
而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程 
但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小。 
你也可以通过连接时修改默认栈大小,将其改的比较小,这样就可以多开一些线程。 
如将默认栈的大小改成512K,这样理论上最多就可以开4096个线程。

即使物理内存再大,一个进程中可以起的线程总要受到2GB这个内存空间的限制。 
比方说你的机器装了64GB物理内存,但每个进程的内存空间还是4GB,其中用户态可用的还是2GB。

如果是同一台机器内的话,能起多少线程也是受内存限制的。每个线程对象都要站用非页面内存,而非页面内存也是有限的,当非页面内存被耗尽时,也就无法创建线程了。

如果物理内存非常大,同一台机器内可以跑的线程数目的限制值会越来越大。

在Windows下写个程序,一个进程Fork出2000个左右线程就会异常退出了,为什么?

这个问题的产生是因为windows32位系统,一个进程所能使用的最大虚拟内存为2G,而一个线程的默认线程栈StackSize为1024K(1M),这样当线程数量逼近2000时,2000*1024K=2G(大约),内存资源就相当于耗尽。

MSDN原文:

“The number of threads a process can create is limited by the available virtual memory. By default, every thread has one megabyte of stack space. Therefore, you can create at most 2,028 threads. If you reduce the default stack size, you can create more threads. However, your application will have better performance if you create one thread per processor and build queues of requests for which the application maintains the context information. A thread would process all requests in a queue before processing requests in the next queue.”

如何突破2000个限制?

可以通过修改CreateThread参数来缩小线程栈StackSize,例如

#define   MAX_THREADS   50000
 
DWORD   WINAPI   ThreadProc(   LPVOID   lpParam   ){
while(1){
Sleep(100000);
}
return   0;
}
 
int   main()   {
DWORD   dwThreadId[MAX_THREADS];
HANDLE   hThread[MAX_THREADS];
 
for(int   i   =   0;   i   <   MAX_THREADS;   ++i)
{
hThread[i]  = CreateThread(0,  64, ThreadProc, 0, STACK_SIZE_PARAM_IS_A_RESERVATION,   &dwThreadId[i]);
 
if(0   ==   hThread[i])
{
DWORD   e   =   GetLastError();
printf("%d\r\n",e);
break;
}
}
ThreadProc(0);
}

服务器端程序设计

如果你的服务器端程序设计成:来一个client连接请求则创建一个线程,那么就会存在2000个限制(在硬件内存和CPU个数一定的情况下)。建议如下:

The "one thread per client" model is well-known not to scale beyond a dozen clients or so. If you're going to be handling more than that many clients simultaneously, you should move to a model where instead of dedicating a thread to a client, you instead allocate an object. (Someday I'll muse on the duality between threads and objects.) Windows provides I/O completion ports and a thread pool to help you convert from a thread-based model to a work-item-based model.

1. Serve many clients with each thread, and use nonblocking I/O and level-triggered readiness notification
2. Serve many clients with each thread, and use nonblocking I/O and readiness changenotification
3. Serve many clients with each server thread, and use asynchronous I/O

转载于:https://www.cnblogs.com/xutingnuan/p/3781667.html

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

  1. windows调用python_如何在Windows操作系统中从R调用Python?

    我正在寻找一种在Windows操作系统上调用R中的python的方法.因为似乎没有可用的R包(至少没有最近更新的包),我正在寻找如何在R脚本中编写一组命令的线索,然后可以以批处理模式发送蟒蛇. 简而言 ...

  2. 扔掉你 Windows 操作系统中的盗版软件吧

    扔掉你 Windows 操作系统中的盗版软件吧 --Windows 下常用盗版软件的替代免费软件列表 作者:杨文博 <http://blog.solrex.cn> 原文链接:http:// ...

  3. 禁用服务器网络协议怎么设置,如何在Windows操作系统中启用和禁用DHCP?

    原标题:如何在Windows操作系统中启用和禁用DHCP? 无论在公共场所还是家中,WiFi可以为您的计算机提供网络连接.我们出行或者参加会议时需要携带计算机.计算机操作系统具有可操作的DHCP,让大 ...

  4. 安装ao 服务器为空,如何在64位Windows操作系统中安装现场审计实施系统AO2011

    龚泽平 [摘 要]对于医院审计.医保审计等各种需要消耗大量内存的审计工作来讲,64位系统具有更加明显的优势.但是当前国家审计署所研发的现场审计实施系统是基于32为系统的,在一定程度上让计算机软硬件都发 ...

  5. 在计算机窗口中什么中的文件不能被删除,在Windows操作系统中,“回收站”可以恢复(1)上使用键删除的文件或文件夹。在“我的电脑”窗口中,...

    55题库为您解答: 正确答案:B 解析:本题考查Windows操作系统应用的基本知识.在Windows操作系统中,"回收站"可以恢复硬盘上使用Del>键删除的文件或文件夹.& ...

  6. 分享在Windows操作系统中独立安装微软MS Access 2019数据库的实用方法

    文章首发于 码友网 – <分享在Windows操作系统中独立安装微软MS Access 2019数据库的实用方法> 本文为大家分享在Windows操作系统中独立安装微软MS Access ...

  7. windows操作系统中SID是什么??

    SID也就是安全标识符(Security Identifiers),是标识用户.组和计算机帐户的唯一的号码.在第一次创建该帐户时,将给网络上的每一个帐户发布一个唯一的 SID.Windows 2000 ...

  8. Spring boot中最大连接数、最大线程数与最大等待数在生产中的异常场景

    在上周三下午时,客户.业务和测试人员同时反溃生产环境登录进入不了系统,我亲自测试时,第一次登录进去了,待退出后再登录时,复现了客户的问题,场景像是请求连接被拒绝了,分析后判断是spring boot的 ...

  9. Linux 中统计一个进程的线程数

    如果你想看到 Linux 中每个进程的线程数,有以下几种方法可以做到这一点. 方法一: /proc proc 伪文件系统,它驻留在 /proc 目录,这是最简单的方法来查看任何活动进程的线程数. /p ...

最新文章

  1. C# winform 获取当前路径
  2. Unity3D学习笔记(十九):UGUI、Image、Text、Button
  3. Codeforces Round #603 (Div. 2) E. Editor 线段树维护括号序列
  4. [luoguP2801] 教主的魔法(二分 + 分块)
  5. Confluence与Jira安装及后期迁移问题记录
  6. 深度学习多种模型评估指标介绍 - 附sklearn实现
  7. Windows XP刻录机不能刻盘显示函数不正确的解决办法
  8. 基于Swing与JavaFx的音乐播放器——轻音
  9. 保险中介3.0时代:数字化中介在场景中打造核心竞争力
  10. 虚拟机怎么安装操作系统 虚拟机怎么安装win7系统教程
  11. php模板读取工具,打造自己的php半自动化代码审计工具
  12. 山东二本计算机排名大学最新,山东二本大学排名最新
  13. JDK8 日期时间相关 java.time.*
  14. 红色石头十八岁的天空主题曲铃声 红色石头十八岁的天空主题曲...
  15. cart购物车php文件,php购物车实现方法,php购物车实现
  16. 超级好用的在线流程图、脑图、UML制作工具ProcessOn
  17. 刘振亚:以特高压电网引领中国能源互联网建设,以中国能源互联网实现碳减排目标
  18. 自控系统-工业控制系统
  19. icon图标 基础线性图标得设计
  20. 阿里大学开放 11 门免费 Python 视频课程

热门文章

  1. 插入排序:直接插入排序希尔排序
  2. 关于比较两个字节数组是否内容相同
  3. 局域一台打印机突然链接失败,其他能正常连接打印服务器。
  4. ssh框架http后台乱码问题
  5. Java形参的改变不会影响实参
  6. 如何在支付宝成为增加个人服务器,支付宝支付,服务器如何生成支付订单
  7. mysql数据与Hadoop之间导入导出之Sqoop实例
  8. DNS(BIND) 正向解析   反向解析 基本服务的搭建
  9. 听云CTO访谈:解读现代应用性能管理(APM)技术
  10. Package vim is not available, but is referred to by another package.