windows 一個進程可以允許最大的線程數


默認情況下,一個線程的棧要預留1M的內存空間 
而一個進程中可用的內存空間只有2G,所以理論上一個進程中最多可以開2048個線程 
但是內存當然不可能完全拿來作線程的棧,所以實際數目要比這個值要小。 
你也可以通過連接時修改默認棧大小,將其改的比較小,這樣就可以多開一些線程。 
如將默認棧的大小改成512K,這樣理論上最多就可以開4096個線程。 

即使物理內存再大,一個進程中可以起的線程總要受到2GB這個內存空間的限制。 
比方說你的機器裝了64GB物理內存,但每個進程的內存空間還是4GB,其中用戶態可用的還是2GB。


如果是同一台機器內的話,能起多少線程也是受內存限制的。每個線程對象都要站用非頁面內存,而非頁面內存也是有限的,當非頁面內存被耗盡時,也就無法創建線程了。 

如果物理內存非常大,同一台機器內可以跑的線程數目的限制值會越來越大。  

在Windows下寫個程序,一個進程Fork出2000個左右線程就會異常退出了,為什么?

這個問題的產生是因為windows32位系統,一個進程所能使用的最大虛擬內存為2G,而一個線程的默認線程棧StackSize為1024K(1M),這樣當線程數量逼近2000時,2000*1024K=2G(大約),內存資源就相當於耗盡。

如果你的服務器端程序設計成:來一個client連接請求則創建一個線程,那么就會存在2000個限制(在硬件內存和CPU個數一定的情況下)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM