為什麼要知道某個程序開啟了多少執行緒?
好奇,這個很重要
效能調優
概念澄清
這裡所說的執行緒指的是核心級別的執行緒,不是使用者態執行緒,所謂使用者態執行緒是指不依賴作業系統而是在使用者態下實現的執行流排程。
這裡的執行緒個數指的是程序執行時的執行緒個數,這個數值會隨著執行緒的建立和銷毀而動態變化。
本文主要關注linux平台。
背景知識與原理
/proc/
/proc/下記錄了每個程序執行時的所有關鍵資訊,那這些資訊是誰來生成的呢,答案是linux核心。
linux核心在執行你寫的程式時,將所有關鍵資訊寫到了/proc/下,因此你可以通過檢視這個目錄下的資訊來或者程序的執行時行為,這對於那些好奇核心是如何執行程式的同學是非常重要的。
你可以把這個目錄下的資訊理解為linux核心在執行你寫的程式時所列印的log。通過該log你就可以知道程序開啟了多少執行緒了。
程序號:pid
linux核心在執行程式時需要為每個程序分配乙個id,類似於身份證號的作用,用於識別程序,因此想獲取某個程序開啟了多少執行緒首先必須要知道是程序id。
實驗開始
實驗一:最簡單的情況
我們來看一下最簡單的helloworld程式有多少執行緒:
#include
#include
intmain()
接下來編譯執行:
$ g++ s.cpp -o helloworld
$ ./helloworld &[1
]125626
我們可以發現,該helloworld程序的程序號是125626,有了程序號我們就可以檢視該程序開啟多少執行緒了。執行如下命令:
我們可以發現,該helloworld程序的程序號是125626,有了程序號我們就可以檢視該程序開啟多少執行緒了。執行如下命令:
可以看到,和我們的預期是一樣的,該helloworld程序僅有開啟了乙個執行緒。
實驗二:稍複雜的情況
在這個實驗中,我們動態建立執行緒:
#include
#include
void
*func
(void
* arg)
intmain()
return0;
}
在這個程式當中,我們動態建立了10個執行緒,每建立乙個執行緒sleep10秒,每個執行緒sleep10000秒。編譯執行:
$ g++ s.cpp -o helloworld
$ ./helloworld &[1
]125667
$ cat /proc/
125667
/status | grep threads
threads:
2$ cat /proc/
125667
/status | grep threads
threads:
2$ cat /proc/
125667
/status | grep threads
threads:
3$ cat /proc/
125667
/status | grep threads
threads:
4$ cat /proc/
125667
/status | grep threads
threads:
5$ cat /proc/
125667
/status | grep threads
threads:
6$ cat /proc/
125667
/status | grep threads
threads:
10
可以看到,當用cat檢視執行緒數的時候程序已經建立了兩個執行緒,如果快速檢視兩次,發現執行緒資料都是2,但是隔一段時間後(超過10s)會發現執行緒數為3,到最後執行緒數為10,符合我們的預期。
結論通過命令 「cat /proc//status | grep threads」 可以動態檢視進行執行時的執行緒個數。
one more thing…
如何檢視程序開啟了哪些檔案
有許多情況下,我們需要檢視乙個程序當前開啟了哪些檔案,反過來我們也希望知道某乙個檔案正在被哪些程序所讀寫。在linux下有許多有用的工具可以幫我們完成這兩個工作,下面介紹這兩個工具 lsof與fuser。fuser find files or sockets user 格式 fuser 選項 fna...
如何檢視程序開啟了哪些檔案
有許多情況下,我們需要檢視乙個程序當前開啟了哪些檔案,反過來我們也希望知道某乙個檔案正在被哪些程序所讀寫。在linux下有許多有用的工具可以幫我們完成這兩個工作,下面介紹這兩個工具 lsof與fuser。fuser find files or sockets user 格式 fuser 選項 fna...
檢視程序開啟了哪些檔案
檢視程序開啟了哪些檔案 sudo lsof p pid 如果是分析乙個你不太了解的程序,這個命令比較有用。可以使用lsof p pid grep tcp檢視程序中的 tcp 連線資訊。檢視檔案被哪個程序使用 使用這個命令檢視乙個檔案被哪些程序正在使用sudo lsof path to file,示例...