一個進程能運行多少線程


        記錄瞬間

對於Linux來說:

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

既然如此,我們可以想象,一個系統中的進程數量肯定是有上限的,不然系統資源就會不夠用了,同樣的道理,一個進程中的線程資源也是有上限的。那進程和線程的上限到底是多大呢?

Linux中最多可以有多少個進程?
一.Linux中有一個命令可以幫助我們查看系統中的進程上限

[pigff@izbp13yd4r85qvk53t04mbz ~]$ ulimit -u
4096

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

 ulimit -u 5120

 二.我們用pid_t來表示一個進程的pid,因此能表示的進程的范圍一定不會超過pid_t類型的大小

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

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個數一定的情況下)。

通過python檢查相關應用名稱后,殺掉相關的進程

 

#coding:utf-8

import os,sys
import subprocess

name = sys.argv[1]
child = subprocess.Popen(["pgrep", "-f", name,
                         stdout=subprocess.PIPE, shell=False)
res = str(child.communicate()[0])
for pid in (res.replace('\\n', ',').replace("b'", '').replace("'", '').split(',')):
    if len(pid) != 0:
        try:
            os.system("kill -9 " + pid)
        except:
            pass

 


免責聲明!

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



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