『壹』 linux下查看線程數的幾種方法
1、 cat /proc/${pid}/status2、pstree -p ${pid}3、top -p ${pid} 再按H 或者直接輸入 top -bH -d 3 -p ${pid}top -H手冊中說:-H : Threads toggle
加上這個選項啟動top,top一行顯示一個線程。否則,它一行顯示一個進程。4、ps xH手冊中說:H Show threads as if they were processes
這樣可以查看所有存在的線程。5、ps -mp 手冊中說:m Show threads after processes
這樣可以查看一個進程起的線程數。
『貳』 linux中一個進程的最大線程數量是多少
一、linux系統支持的最大進程數
限制1:既然系統使用pid_t表示進程號,那麼最大進程數不能超過pid_t類型的最大值吧
限制2:使用命令ulimit -u查看系統中限制的最大進程數,我的機器上是65535。/etc/security/limits.conf裡面是硬限制,ulimit -u是軟限制,內核參數kernel.pid_max也做了限制。
限制3:受系統資源限制,創建一個新進程會消耗系統資源,最主要的就是內存,有人做過測試,在創建6千多個進程時,程序運行得很慢,通過vmstat命令觀察,發現swap內存的置入置出很頻繁,可以判斷是由於內存不足,使用虛擬內存,導致頻繁的IO操作,讓測試代碼變得很慢,所以創建過多進程時,系統的內存是重要衡量的一個方面。
二、單進程最大線程數
linux 系統中單個進程的最大線程數有其最大的限制 PTHREAD_THREADS_MAX,這個限制可以在 /usr/include/bits/local_lim.h 中查看,對 linuxthreads 這個值一般是 1024,對於 nptl 則沒有硬性的限制,僅僅受限於系統的資源, 這個系統的資源主要就是線程的 stack 所佔用的內存,用 ulimit -s 可以查看默認的線程棧大小,一般情況下,這個值是 8M。
可以寫一段簡單的代碼驗證最多可以創建多少個線程
[cpp]
int main()
{
int i = 0;
pthread_t thread;
while (1) {
if (pthread_create(&thread, NULL, foo, NULL) != 0)
return;
i ++;
printf("i = %d\n", i);
}
}
試驗顯示,在 linuxthreads 上最多可以創建 381 個線程,之後就會返回 EAGAIN
在 nptl 上最多可以創建 382 個線程,之後就會返回 ENOMEM
這個值和理論完全相符,因為 32 位 linux 下的進程用戶空間是 3G(32位下進程可定址4G,3G為用戶空間,1G為內核空間) 的大小,也就是 3072M,用 3072M 除以 8M 得 384,但是實際上代碼段和數據段等還要佔用一些空間,這個值應該向下取整到 383,再減去主線程,得到 382。
那為什麼 linuxthreads 上還要少一個線程呢?這可太對了,因為 linuxthreads 還需要一個管理線程
為了突破內存的限制,可以有兩種方法
1) 用 ulimit -s 1024 減小默認的棧大小
2) 調用 pthread_create 的時候用 pthread_attr_getstacksize 設置一個較小的棧大小
要注意的是,即使這樣的也無法突破 1024 個線程的硬限制,除非重新編譯 C 庫
『叄』 linux 下怎樣獲取當前活著的線程數
三種方法:
1。 使用top命令,具體用法是 top -H
加上這個選項,top的每一行就不是顯示一個進程,而是一個線程。
2。 使用ps命令,具體用法是 ps -xH
這樣可以查看所有存在的線程,也可以使用grep作進一步的過濾。
3。 使用ps命令,具體用法是 ps -mq PID
這樣可以看到指定的進程產生的線程數目。
更進一步,其實一些系統監控工具,在本質上也是讀取的系統產生的文件罷了。比如說進程這個事情,
現在假設有進程號為 5000 的進程,查看這個進程的所有具體信息,在哪查看呢?
看看這個目錄吧,/proc/5000/ 這裡面有你所有想要的。其實stat代表著當前的一些信息。
使用ps命令來查看進程的時候,進程狀態分別對應的含義如下:
D 不可中斷睡眠 (通常是在IO操作) 收到信號不喚醒和不可運行, 進程必須等待直到有中斷發生
R 正在運行或可運行(在運行隊列排隊中)
S 可中斷睡眠 (休眠中, 受阻, 在等待某個條件的形成或接受到信號)
T 已停止的 進程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信號後停止運行
W 正在換頁(2.6.內核之前有效)
X 死進程 (未開啟)
Z 僵屍進程 進程已終止, 但進程描述符存在, 直到父進程調用wait4()系統調用後釋放BSD風格的
< 高優先順序(not nice to other users)
N 低優先順序(nice to other users)
L 頁面鎖定在內存(實時和定製的IO)
s 一個信息頭
l 多線程(使用 CLONE_THREAD,像NPTL的pthreads的那樣)
+ 在前台進程組
『肆』 linux 一個 進程 最多 多少個 線程
以下是對在linux環境下一個進程最多能有多少個線程進行了介紹,需版要的朋友可以過權來參考下 默認情況下: 主線程+輔助線程 +<253個自己的線程<=255 含主線程和一個輔助線程,最多255個,即你自己只能生成253個線程。 據說可以設置線程數目: 據說是可以設置的,但本人還沒有驗證!不知道可否。 在你的shell中鍵入limit命令,裡面有descriptor的數目,就是你的進程可以創建的最大線程數目。可以通過修改內核文件更改該數目。
『伍』 linux 一個進程 最多開多少線程
32為linux系統最大內存地址4G,0-3GB的給用戶進程(User Space)使用,3-4GB給內核使用
stack size (kbytes, -s) 10240表示線程堆棧大小
3G/10M=最大線程數,但實際會比這個數小一點,因為程序本身占內存,還有些管理線程
可以使用ulimit -s來設置stack size,設置的小一點開辟的線程就多。
同時/usr/include/bits/local_lim.h中的PTHREAD_THREADS_MAX限制了進程的最大線程數
/proc/sys/kernel/threads-max中限制了系統的最大線程數
你自己寫個簡單的代碼就能測試出自己系統最大可以開多少線程
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <stdio.h>
void *foo(void *param)
{
}
int main()
{
int i = 0;
pthread_t thread;
while(1)
{
if(pthread_create(&thread,NULL,foo,NULL) != 0)
break;
i++;
}
printf("i=%d\n",i);
return 0;
}