爲何要知道某個進程開啓了多少線程?
好奇,這個很重要php
性能調優ios
概念澄清
這裏所說的線程指的是內核級別的線程,不是用戶態線程,所謂用戶態線程是指不依賴操做系統而是在用戶態下實現的執行流調度。程序員
這裏的線程個數指的是進程運行時的線程個數,這個數值會隨着線程的建立和銷燬而動態變化。微信
本文主要關注Linux平臺。app
背景知識與原理
/proc/{pid}性能
/proc/{pid}下記錄了每一個進程運行時的全部關鍵信息,那這些信息是誰來生成的呢,答案是Linux內核。ui
Linux內核在執行你寫的程序時,將全部關鍵信息寫到了/proc/{pid}下,所以你能夠經過查看這個目錄下的信息來或者進程的運行時行爲,這對於那些好奇內核是如何運行程序的同窗是很是重要的。spa
你能夠把這個目錄下的信息理解爲Linux內核在執行你寫的程序時所打印的Log。經過該Log你就能夠知道進程開啓了多少線程了。操作系統
進程號:pid.net
Linux內核在執行程序時須要爲每一個進程分配一個id,相似於身份證號的做用,用於識別進程,所以想獲取某個進程開啓了多少線程首先必需要知道是進程id。
實驗開始
實驗一:最簡單的狀況
咱們來看一下最簡單的helloworld程序有多少線程:
#include <iostream>
#include <unistd.h>
int main()
{
std::cout<<"helloworld";
sleep(1000); //保持進程不退出
return 0;
}
接下來編譯運行:
$ g++ s.cpp -o helloworld
$ ./helloworld &
[1] 125626
咱們能夠發現,該helloworld進程的進程號是125626,有了進程號咱們就能夠查看該進程開啓多少線程了。運行以下命令:
$ cat /proc/125626/status | grep Threads
Threads: 1
能夠看到,和咱們的預期是同樣的,該helloworld進程僅有開啓了一個線程。
實驗二:稍複雜的狀況
在這個實驗中,咱們動態建立線程:
#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;
}
在這個程序當中,咱們動態建立了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/{pid}/status | grep Threads" 能夠動態查看進行運行時的線程個數。
One more thing...
若是你喜歡該文章,歡迎關注個人微信公共帳號,碼農的荒島求生,獲取更多計算機內功的知識。
計算機內功決定程序員職業生涯高度
本文分享自微信公衆號 - 碼農的荒島求生(escape-it)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。