为何要知道某个进程开启了多少线程?
好奇,这个很重要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源创计划”,欢迎正在阅读的你也加入,一块儿分享。