/proc/{pid}下記錄了每一個進程運行時的全部關鍵信息,那這些信息是誰來生成的呢,答案是Linux內核。ios
Linux內核在執行你寫的程序時,將全部關鍵信息寫到了/proc/{pid}下,所以你能夠經過查看這個目錄下的信息來或者進程的運行時行爲,這對於那些好奇內核是如何運行程序的同窗是很是重要的。程序員
你能夠把這個目錄下的信息理解爲Linux內核在執行你寫的程序時所打印的Log。經過該Log你就能夠知道進程開啓了多少線程了。微信
Linux內核在執行程序時須要爲每一個進程分配一個id,相似於身份證號的做用,用於識別進程,所以想獲取某個進程開啓了多少線程首先必需要知道是進程id。性能
咱們來看一下最簡單的helloworld程序有多少線程:spa
#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進程僅有開啓了一個線程。code
在這個實驗中,咱們動態建立線程:進程
#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秒。編譯運行:ip
$ 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" 能夠動態查看進行運行時的線程個數。
若是你喜歡該文章,歡迎關注個人微信公共帳號,碼農的荒島求生,獲取更多計算機內功的知識。
計算機內功決定程序員職業生涯高度