一個進程能運行多少線程

        記錄瞬間windows

對於Linux來講:

咱們都知道進程的概念,它是CPU分配資源的載體,是程序運行的實例;也知道線程的概念,它是程序執行的最小單元,是進程中的一個實體用來執行程序,一個進程中有多個線程。服務器

既然如此,咱們能夠想象,一個系統中的進程數量確定是有上限的,否則系統資源就會不夠用了,一樣的道理,一個進程中的線程資源也是有上限的。那進程和線程的上限究竟是多大呢?spa

Linux中最多能夠有多少個進程?
一.Linux中有一個命令能夠幫助咱們查看系統中的進程上限操作系統

[pigff@izbp13yd4r85qvk53t04mbz ~]$ ulimit -u
4096.net

這屬於軟限制,是能夠改變的。也就是說在個人機器上最多能夠有4096個進程,可是我能夠經過改變這個參數的值來修改對於進程數量的軟限制,好比說用下面的命令將軟限制改到5120。線程

 ulimit -u 5120設計

 二.咱們用pid_t來表示一個進程的pid,所以能表示的進程的範圍必定不會超過pid_t類型的大小對象

[pigff@izbp13yd4r85qvk53t04mbz ~]$ cat /proc/sys/kernel/pid_max
32768blog

pid_t實際上就是一個short類型變量,固然這裏能表示的範圍只是進程id最多表示到這麼多,這只是一個理論值,實際上,因爲內存等系統資源的限制,根本不會同時有這麼多的進程存在。進程

一個進程中最多能夠有多少個線程?
在上一篇文章Linux中線程佔用內存中,咱們知道了建立一個線程會佔用多少內存,這取決於分配給線程的調用棧大小,能夠用ulimit -s命令來查看大小(通常常見的有10M或者是8M)。咱們還知道,一個進程的虛擬內存是4G,在Linux32位平臺下,內核分走了1G,留給用戶用的只有3G,因而咱們能夠想到,建立一個線程佔有了10M內存,總共有3G內存可使用。因而可想而知,最多能夠建立差很少300個左右的線程。

所以,進程最多能夠建立的線程數是根據分配給調用棧的大小,以及操做系統(32位和64位不一樣)共同決定的。
---------------------
原文:https://blog.csdn.net/lvyibin890/article/details/82255047

對於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個數必定的狀況下)。

相關文章
相關標籤/搜索