[线程]WINDOWS操作系统中可以允许最大的线程数
2017-11-03 00:00
316 查看
摘要:WINDOWS操作系统中可以允许最大的线程数
WINDOWS操作系统中可以允许最大的线程数
默认情况下,一个线程的栈要预留1M的内存空间
而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程
但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小。
你也可以通过连接时修改默认栈大小,将其改的比较小,这样就可以多开一些线程。
如将默认栈的大小改成512K,这样理论上最多就可以开4096个线程。
即使物理内存再大,一个进程中可以起的线程总要受到2GB这个内存空间的限制。
比方说你的机器装了64GB物理内存,但每个进程的内存空间还是4GB,其中用户态可用的还是2GB。
如果是同一台机器内的话,能起多少线程也是受内存限制的。每个线程对象都要站用非页面内存,而非页面内存也是有限的,当非页面内存被耗尽时,也就无法创建线程了。
如果物理内存非常大,同一台机器内可以跑的线程数目的限制值会越来越大。
在Windows下写个程序,一个进程Fork出2000个左右线程就会异常退出了,为什么?
这个问题的产生是因为windows32位系统,一个进程所能使用的最大虚拟内存为2G,而一个线程的默认线程栈StackSize为1024K(1M),这样当线程数量逼近2000时,2000*1024K=2G(大约),内存资源就相当于耗尽。
MSDN原文:
“Thenumberofthreadsaprocesscancreateislimitedbytheavailablevirtualmemory.Bydefault,everythreadhasonemegabyteofstackspace.Therefore,youcancreateatmost2,028threads.Ifyoureducethedefaultstacksize,youcancreatemorethreads.However,yourapplicationwillhavebetterperformanceifyoucreateonethreadperprocessorandbuildqueuesofrequestsforwhichtheapplicationmaintainsthecontextinformation.Athreadwouldprocessallrequestsinaqueuebeforeprocessingrequestsinthenextqueue.”
如何突破2000个限制?
可以通过修改CreateThread参数来缩小线程栈StackSize,例如
#defineMAX_THREADS50000
DWORDWINAPIThreadProc(LPVOIDlpParam){
while(1){
Sleep(100000);
}
return0;
}
intmain(){
DWORDdwThreadId[MAX_THREADS];
HANDLEhThread[MAX_THREADS];
for(inti=0;i<MAX_THREADS;++i)
{
hThread[i]=CreateThread(0,64,ThreadProc,0,STACK_SIZE_PARAM_IS_A_RESERVATION,&dwThreadId[i]);
if(0==hThread[i])
{
DWORDe=GetLastError();
printf("%d\r\n",e);
break;
}
}
ThreadProc(0);
}
服务器端程序设计
如果你的服务器端程序设计成:来一个client连接请求则创建一个线程,那么就会存在2000个限制(在硬件内存和CPU个数一定的情况下)。建议如下:
The"onethreadperclient"modeliswell-knownnottoscalebeyondadozenclientsorso.Ifyou'regoingtobehandlingmorethanthatmanyclientssimultaneously,youshouldmovetoamodelwhereinsteadofdedicatingathreadtoaclient,youinsteadallocateanobject.(SomedayI'llmuseonthedualitybetweenthreadsandobjects.)WindowsprovidesI/Ocompletionportsandathreadpooltohelpyouconvertfromathread-basedmodeltoawork-item-basedmodel.
1.Servemanyclientswitheachthread,andusenonblockingI/Oandlevel-triggeredreadinessnotification
2.Servemanyclientswitheachthread,andusenonblockingI/Oandreadinesschangenotification
3.Servemanyclientswitheachserverthread,anduseasynchronousI/O
默认情况下,一个线程的栈要预留1M的内存空间
而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程
但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小。
你也可以通过连接时修改默认栈大小,将其改的比较小,这样就可以多开一些线程。
如将默认栈的大小改成512K,这样理论上最多就可以开4096个线程。
即使物理内存再大,一个进程中可以起的线程总要受到2GB这个内存空间的限制。
比方说你的机器装了64GB物理内存,但每个进程的内存空间还是4GB,其中用户态可用的还是2GB。
如果是同一台机器内的话,能起多少线程也是受内存限制的。每个线程对象都要站用非页面内存,而非页面内存也是有限的,当非页面内存被耗尽时,也就无法创建线程了。
如果物理内存非常大,同一台机器内可以跑的线程数目的限制值会越来越大。
在Windows下写个程序,一个进程Fork出2000个左右线程就会异常退出了,为什么?
这个问题的产生是因为windows32位系统,一个进程所能使用的最大虚拟内存为2G,而一个线程的默认线程栈StackSize为1024K(1M),这样当线程数量逼近2000时,2000*1024K=2G(大约),内存资源就相当于耗尽。
MSDN原文:
“Thenumberofthreadsaprocesscancreateislimitedbytheavailablevirtualmemory.Bydefault,everythreadhasonemegabyteofstackspace.Therefore,youcancreateatmost2,028threads.Ifyoureducethedefaultstacksize,youcancreatemorethreads.However,yourapplicationwillhavebetterperformanceifyoucreateonethreadperprocessorandbuildqueuesofrequestsforwhichtheapplicationmaintainsthecontextinformation.Athreadwouldprocessallrequestsinaqueuebeforeprocessingrequestsinthenextqueue.”
如何突破2000个限制?
可以通过修改CreateThread参数来缩小线程栈StackSize,例如
服务器端程序设计
如果你的服务器端程序设计成:来一个client连接请求则创建一个线程,那么就会存在2000个限制(在硬件内存和CPU个数一定的情况下)。建议如下:
The"onethreadperclient"modeliswell-knownnottoscalebeyondadozenclientsorso.Ifyou'regoingtobehandlingmorethanthatmanyclientssimultaneously,youshouldmovetoamodelwhereinsteadofdedicatingathreadtoaclient,youinsteadallocateanobject.(SomedayI'llmuseonthedualitybetweenthreadsandobjects.)WindowsprovidesI/Ocompletionportsandathreadpooltohelpyouconvertfromathread-basedmodeltoawork-item-basedmodel.
1.Servemanyclientswitheachthread,andusenonblockingI/Oandlevel-triggeredreadinessnotification
2.Servemanyclientswitheachthread,andusenonblockingI/Oandreadinesschangenotification
3.Servemanyclientswitheachserverthread,anduseasynchronousI/O
相关文章推荐
- WINDOWS操作系统中可以允许最大的线程数
- WINDOWS操作系统中可以允许最大的线程数
- WINDOWS操作系统中可以允许最大的线程数
- WINDOWS操作系统中可以允许最大的线程数
- WINDOWS操作系统中可以允许最大的线程数
- WINDOWS操作系统中可以允许最大的线程数
- WINDOWS操作系统中可以允许最大的线程数
- WINDOWS操作系统中可以允许最大的线程数
- WINDOWS操作系统中可以允许最大的线程数
- WINDOWS操作系统中可以允许最大的线程数
- WINDOWS操作系统中可以允许最大的线程数
- WINDOWS操作系统中可以允许最大的线程数(线程栈预留1M空间)(56篇Windows博客值得一看)
- 远程桌面超过最大允许连接数可以强制登录
- windows 一个进程可以允许最大的线程数
- 假如一个数组存储了一个股票,在一天交易窗口内各时间点的股票价格(正整数),只允许一次买入和一次卖出,请提供一个算法,计算出通过买入和卖出可以得到的最大利润
- linux 修改用户账户可以创建的最大线程数
- 假如一个数组存储了一个股票,在一天交易窗口内各时间点的股票价格(正整数),只允许一次买入和一次卖出,请提供一个算法,计算出通过买入和卖出可以得到的最大利润
- linux下线程优先级(属性) (当前线程的调度策略(是否允许设置优先级)。允许的最大优先级,最小优先级。如何设定优先级)
- hdu6006 Engineer Assignment 状态dp 定义dp[i][s]表示前i个工程状态为s可以执行的最大工程数。s表示前i个工人选走了s状态的工程师。
- android ProgressBar ProgressDialog可以在子线程中更新的原理