背景介绍

  最近工作中需要测试一个线程资源占用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是环境上的总线程(目前的理解)。

posted on 2022-10-15 00:57  南山砺  阅读(119)  评论(0)    收藏  举报