C/C++多线程编程基础


C/C++多线程编程基础

1.基础问题

  • 某个线程崩溃,会导致进程退出吗?或者说进程中某个线程崩溃,是否会对其他线程造成影响?

答:一般来说,每个线程都是独立执行的单位,每个线程都有自己的上下文堆栈,一个线程的的崩溃不会对其他线程造成影响。但是通常情况下,一个线程崩溃会产生一个进程内的错误,例如,在 Linux 操作系统中,可能会产生一个 Segment Fault 错误,这个错误会产生一个信号,操作系统默认对这个信号的处理就是结束进程,整个进程都被销毁了,这样的话这个进程中存在的其他线程自然也就不存在了。

  • 排查 Linux 进程 CPU 使用率过高问题?

在实际开发中,有时候由于我们的程序逻辑不当问题,会导致某个线程空转(如无限空循环),进而引起该进程占用 CPU 使用率过高。这不仅会造成我们的系统卡顿,也是对 CPU 资源的一种浪费。那如何定位和排查引起 CPU 使用率过高的线程呢?

在 Linux 下我们可以综合使用 pstack 和 top 命令来排查此类问题。

2.基础命令

  • pstack

Linux 系统中可以通过 pstack 来命令查看一个进程的线程数量和每个线程的调用堆栈情况。

pstack pid

pid 设置为要查看的进程的 id 即可。

  • top

可以查看cpu高的进程,找到占用cpu最大的进程号,然后使用:

top -p pid

观察指定pid的CPU和内存以及负载情况。

现在有如下信息:

top - 19:30:05 up  6:15,  1 user,  load average: 0.85, 0.71, 0.61
Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
%Cpu(s):  8.1 us,  2.9 sy,  0.0 ni, 87.8 id,  0.0 wa,  0.0 hi,  1.1 si,  0.0 st
KiB Mem : 20412976 total, 10960136 free,  5416592 used,  4036248 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used. 14315608 avail Mem 

第一行是任务队列信息

任务队列信息 含义
9:30:05 当前时间
6:15 min 用户在线时间
1users 在线用户数
load average: 0.85, 0.71, 0.61 系统负载,即任务队列的平均长度。1分钟前、5分钟前、15分钟前平均负载

第二行为进程的信息

进程信息 含义
Tasks: 1 total 进程总数
0 running 正在运行的进程数
1 sleeping 睡眠的进程数
0 stopped 停止的进程数
0 zombie 僵尸进程数

第三行为cpu信息

cpu信息 含义
8.1 us 用户空间占用CPU百分比
2.9% sy 内核空间占用CPU百分比
0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比
87.8% id 空闲CPU百分比
0.0% wa 等待输入输出的CPU时间百分比
0.0% hi 硬件中断
1.1% si 软件中断
0.0%st 实时

第四、五行为内存信息。

物理内存信息 含义
Mem: 20412976 total 物理内存总量
5416592 used 使用的物理内存总量
10960136 free 空闲内存总量
4036248 buffers/cache 用作内核缓存的内存量
交换区信息 含义
Swap: 2097148 total 交换区总量
0k used 使用的交换区总量
2097148 free 空闲交换区总量
14315608 cached 缓冲的交换区总量

那如何通过top命令定位问题进程中每个线程占用cpu情况?

使用-H,top 命令的 -H 选项的作用是显示每个一个进程的各个线程运行状态(线程模式)。

例如:

top -p 2085 -H

由上图明显可以发现,线程PID 2085 CPU占用率最高,接下来定位该线程的代码是否出现异常导致cpu占用过高。

结合上述的pstack,例如:

pstack 2085

在 pstack 输出的各个线程中,只要逐一对照我们的程序源码来梳理下该线程中是否有大多数时间都处于空转的逻辑,然后修改和优化这些逻辑就可以解决 CPU 使用率过高的问题了,一般情况下,不工作的线程应尽量使用锁对象让其挂起,而不是空转,这样可以提高系统资源利用率。


更多内容,订阅公众号

文章作者: light-city
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 light-city !
评论
  目录