為什么要知道某個進(jìn)程開啟了多少線程倔喂?
好奇
性能調(diào)優(yōu)
概念澄清
這里所說的線程指的是內(nèi)核級別的線程谷市,不是用戶態(tài)線程,所謂用戶態(tài)線程是指不依賴操作系統(tǒng)而是在用戶態(tài)下實現(xiàn)的執(zhí)行流調(diào)度郁妈。
這里的線程個數(shù)指的是進(jìn)程運行時的線程個數(shù)猩系,這個數(shù)值會隨著線程的創(chuàng)建和銷毀而動態(tài)變化。
本文主要關(guān)注Linux平臺兆蕉。
背景知識與原理
- /proc/{pid}
/proc/{pid}下記錄了每個進(jìn)程運行時的所有關(guān)鍵信息羽戒,那這些信息是誰來生成的呢,答案是Linux內(nèi)核虎韵。
Linux內(nèi)核在執(zhí)行你寫的程序時易稠,將所有關(guān)鍵信息寫到了/proc/{pid}下,因此你可以通過查看這個目錄下的信息來或者進(jìn)程的運行時行為包蓝,這對于那些好奇內(nèi)核是如何運行程序的同學(xué)是非常重要的驶社。
你可以把這個目錄下的信息理解為Linux內(nèi)核在執(zhí)行你寫的程序時所打印的Log。通過該Log你就可以知道進(jìn)程開啟了多少線程了测萎。
- 進(jìn)程號:pid
Linux內(nèi)核在執(zhí)行程序時需要為每個進(jìn)程分配一個id亡电,類似于身份證號的作用,用于識別進(jìn)程硅瞧,因此想獲取某個進(jìn)程開啟了多少線程首先必須要知道是進(jìn)程id份乒。
實驗開始
- 實驗一:最簡單的情況
我們來看一下最簡單的helloworld程序有多少線程:
#include <iostream>
#include <unistd.h>
int main()
{
std::cout<<"helloworld";
sleep(1000); //保持進(jìn)程不退出
return 0;
}
接下來編譯運行:
$ g++ s.cpp -o helloworld
$ ./helloworld &
[1] 125626
我們可以發(fā)現(xiàn),該helloworld進(jìn)程的進(jìn)程號是125626腕唧,有了進(jìn)程號我們就可以查看該進(jìn)程開啟多少線程了或辖。運行如下命令:
$ cat /proc/125626/status | grep Threads
Threads: 1
可以看到,和我們的預(yù)期是一樣的枣接,該helloworld進(jìn)程僅有開啟了一個線程颂暇。
- 實驗二:稍復(fù)雜的情況
在這個實驗中,我們動態(tài)創(chuàng)建線程:
#include <pthread.h>
#include <unistd.h>
void* func(void* arg) {
sleep(10000);
}
int main()
{
pthread_t id;
for (int i=0;i<10;i++) {
pthread_create(&id,NULL, func,NULL);
sleep(10);
}
return 0;
}
在這個程序當(dāng)中但惶,我們動態(tài)創(chuàng)建了10個線程耳鸯,每創(chuàng)建一個線程sleep10秒湿蛔,每個線程sleep10000秒。編譯運行:
$ g++ s.cpp -lpthread -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
可以看到县爬,當(dāng)用cat查看線程數(shù)的時候進(jìn)程已經(jīng)創(chuàng)建了兩個線程煌集,如果快速查看兩次,發(fā)現(xiàn)線程數(shù)據(jù)都是2捌省,但是隔一段時間后(超過10s)會發(fā)現(xiàn)線程數(shù)為3,到最后線程數(shù)為10碉钠,符合我們的預(yù)期纲缓。
結(jié)論
通過命令 "cat /proc/{pid}/status | grep Threads" 可以動態(tài)查看進(jìn)行運行時的線程個數(shù)。
One more thing...
如果你喜歡該文章喊废,歡迎關(guān)注我的微信公共賬號祝高,碼農(nóng)的荒島求生,獲取更多計算機(jī)內(nèi)功的知識污筷。
計算機(jī)內(nèi)功決定程序員職業(yè)生涯高度