背景介绍
最近工作中需要测试一个线程资源占用100%的异常场景,但是自己对于Linux的进程,线程之间的关系不是很了解。
目录
- 进程
- 线程
- 进程与线程的关系
- 环境上线程查看
进程
进程是资源申请的基本单位,单进程的程序执行效率在大部分场景都是偏低的,跟批处理一样,必须要等到预先资源都满足了才能去执行之后的任务,最重要的是所有的事情都是由这一个进程自己做。
Linux中查看 ???
线程
线程是存在于进程中的一些程序,既享有自己独立的空间,也有公共的资源访问空间。目前都是多线程编程,效率提升肯定是大的,CPU使用率会比单线程使用率更高。比如在dds通信协议中就有发端线程、收端线程、服务发现线程、.....(一共好像有9个线程)
Linux中检查系统支持的最大线程数量: cat /proc/sys/kernel/threads-max
进程与线程的关系
进程一般作为资源所有者,而线程则作为资源使用者角色,在Linux系统中对于单个进程中可以创建多少的线程是没有做限制,最大可以创建到系统所支持的最大数量。
线程创建函数
#include<stdio.h>
#include<pthread.h>
#include<errno.h>
#include<string.h>
void *thread(void *vargp){
while(1){
usleep(10);
}
}
int main(int argc, char argv*)
{
int err = 0, count = 0;
pthread_t tid;
while(count < 4000){
err = pthread_create(&tid, NULL, thread, NULL);
count++;
printf("count = %d\n", count);
}
sleep(1000000000000); //线程存活时间
printf("create thread error : %s \n", strerror(errno));
printf("Maximum number of thread within a Process is : %d\n", count);
return 0;
}
环境上线程查看
检查环境上线程数量 ps -H

当前环境上一共有161个线程,2个处于运行状态,159个处于休眠,无异常线程。
具体线程查看 ps h -Led

可以查看到所有的进程的线程,不过没有具体显示某个进程中线程的名字,这个一般加结合-o user参数用作统计环境上总线程使用:ps -h -Led -o user | wc -l
进程中线程名查看 ps -T -p <PID>

可以看到所有的线程名称,mysqld作为父进程创建了后续所有线程
小结
对于线程的理解,需要自己动手做实验验证自己的理解是否正确,cat /proc/sys/kernel/threads-max 我看见有些博客都是写的用户所支持的最大线程数量,我自己经过验证,先用root登录环境,然后启动threads-max的90%,然后再登录我另外一个账户xf,这时候服务器已经明显感觉到处理巨慢,然后以xf去创建线程,发现只能创建几百个,root + xf的线程数量是小于thread-max的。由此thread-max是环境上的总线程(目前的理解)。
浙公网安备 33010602011771号