线程是在进程中受到调度的一条执行流。每个运行中的进程至少包含一个线程,而多线程进程则包含多条可以并发推进的执行流。
进程利用率 · 第 3 课
进程线程
了解 Linux 线程如何共享进程资源,以及如何使用 ps 检查线程。
进程与线程
同一进程中的线程共享虚拟地址空间和打开的文件描述符等资源。每个线程仍拥有自己的执行状态,包括寄存器和栈。共享让通信更高效,但也意味着一个线程未同步的修改可能影响其他线程。
不同进程通常拥有各自独立的地址空间,并通过明确的进程间通信机制交换数据。这两种设计都不会天然更快或更安全;取舍取决于工作负载和实现方式。
同一进程中的线程通常共享哪项资源?
线程标识符
Linux 把每个线程表示为拥有自己线程 ID 的可调度任务。线程组首进程的 ID 通常显示为进程 ID,而所有成员共享一个线程组 ID。不同工具会使用 PID、TID、LWP 和 SPID 等标签;应检查工具的字段定义,不要假定所有标签含义相同。
每个线程独立维护什么?
使用 ps 列出线程
使用明确的输出字段,可以避免含义模糊的默认布局:
$ ps -eLo pid,tid,psr,stat,comm
在 procps ps 中,-L 显示线程,-e 选择所有进程。pid 标识线程组,tid 标识单个线程,psr 显示线程上次运行所在的 CPU,stat 报告状态。若只检查一个进程,可以使用:
$ ps -L -p 1234 -o pid,tid,stat,pcpu,comm
线程列表只是快照。线程可能在下一刻退出或改变状态。
哪个命令会使用明确字段列出 PID 1234 所属的线程?
解读线程活动
单个线程的高 CPU 使用率可能被进程级平均值掩盖。应把线程级 CPU 样本与应用日志、栈跟踪和性能剖析工具结合起来。不了解暂停、权限和服务影响时,不要对生产任务附加调试器或发送信号。
为什么不应把 ps 线程列表视为永久状态?
课程已完成
你已完成 进程线程
现在,你可以区分进程资源与每个线程独有的执行状态。
认识到每个进程至少包含一个线程。
识别同一进程中线程共享的资源。
使用
ps -L明确列出进程 ID 和线程 ID。将线程输出视为快照,并与其他证据相互印证。