Linux 进程和线程基础知识解析
一、进程基础知识
1、简介
进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,也是操作系统结构的基础。它既是程序的执行实例,也是程序在操作系统中的动态表现。简单来说,进程是运行中的程序。程序是死的、静止的,但进程是活的、动态的。当运行一个程序时,操作系统会创建一个进程,并为其分配独立的资源。
2、特点
动态性:进程是动态产生的,随着程序的执行而不断变化,并在执行完毕后动态消亡。
独立性:进程是一个独立的运行实体,拥有自己独立的地址空间和系统资源,如处理器、存储器、I/O设备等。
异步性:由于进程间的相互制约和资源共享,使得进程的执行具有间断性,即进程按各自独立的、不可预知的速度向前推进。
并发性:多个进程可以在同一时间段内并发执行,共享系统资源。
3、表现样式
Process: 运行中的程序的一个副本,是被载入内存的一个指令集合,是资源分配的单位。
进程ID(Process ID,PID)号码被用来标记各个进程
UID、GID、和SELinux语境决定对文件系统的存取和访问权限【/usr/bin/passwd】
通常从执行进程的用户来继承
存在生命周期
4、创建流程
操作系统创建一个新的进程时,会按照以下步骤操作:
为新进程分配一个唯一的进程标识符。此时,主进程表中会添加一个新表项,每个进程一个表项。
为进程分配空间。这包括进程映像中的所有元素。因此,操作系统必须知道私有用户地址空间(程序和数据)和用户栈需要多少空间。默认情况下会根据进程的类型分配这些值,也可以在作业创建时基于用户请求设置这些值;最后,必须为进程控制块分配空间。
初始化进程控制块。进程标识符部分包括进程ID和其他相关的ID,如父进程的ID等;处理器的状态信息大多初始化为0,但程序计数器和系统栈指针除外。进程最初不拥有任何资源,除非显式的请求了这些资源或几层了父进程的资源。
设置正确的链接。例如,若操作系统将每个调度队列都维护为一个链表,则新进程必须放在就绪或就绪/挂起链表中。
创建或扩充其他数据结构。例如,操作系统可因编制账单和或评估性能,为每个进程维护一个记账文件。
5、结构解析
每个进程都有操作系统分配给其的独特资源,包含内存、栈、文件描述符等信息。
进程由程序、数据和进程控制块三部分组成。
程序是进程要执行的指令集合,它通常存储在内存中的代码段中。程序代码是进程执行的基础,由CPU读取指令并执行。
数据是进程在执行过程中需要处理的信息,表示进程正在使用的数据,包括全局变量、局部变量、常量等。数据通常存储在内存中的数据段中,供程序代码在运行时读取和修改。
进程控制块则包含了进程的各种信息和控制信息,是进程存在的唯一标志,用于记录进程的状态和相关信息。PCB中包含了进程的ID(PID)、状态(如就绪、运行、阻塞等)、优先级、输入输出信息等。PCB通常会存储在操作系统内核中,以便操作系统对进程进行管理和调度。
PID:即进程号。操作系内核为每个进程分配的唯一整数标识符,用于唯一标识进程。
状态:进程在生命周期会处于不通状态。包含:就绪状态、运行状态、睡眠状态、跟踪状态、僵尸状态、停止状态等。
优先级:是一个数值,表示进程在系统中的执行顺序,决定了进程的执行优先级和调度策略。实时进程优先级范围是0到MAX_RT_PRIO-1(0-99),普通进程的静态优先级范围是从MAX_RT_PRIO到MAX_PRIO-1(100-139)。
二、线程基础知识
1、简介
线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是操作系统进行CPU 调度和分派的基本单位。一个进程可以包含一个或多个线程,这些线程共享进程的资源,但有自己独立的执行路径。
2、特点
共享性:同一个进程内的所有线程,都共享该进程的所有资源,包含地址空间、文件描述符、全局变量等,仅线程私有资源(栈、计数器、寄存器等)独立。
轻量性:切换时开销较小,因为线程共享进程的内存和资源,只需要切换线程的上下文即可。这使得多线程程序能够更高效地利用系统资源。
依赖性:无法独立存在,必须依附于进程。进程退出,其中的所有线程也会终止。
3、与进程的区别
对比属性 | 进程 | 线程 |
---|---|---|
调度单位 | 早期为调度单位,现为多线程 | 任务调度和执行的基本单位 |
开销 | 开销大,创建、销毁及切换成本高 | 开销小,共享资源,切换成本低 |
通信 | 依靠IPC机制 | 直接共享内存或消息传递 |
包含关系 | 一个进程可以有一个或多个线程 | 一个线程只能属于一个进程 |
资源分配 | 独立资源 | 共享进程的资源 |
独立性 | 高、一个崩溃不影响其他进程 | 低、一个崩溃可能影响整个进程 |
并发并行 | 并发 | 并行 |
三、进程管理工具
1、pstree 命令
该命令以树状图的形式显示进程及其子进程的层次结构,清晰地表达了进程间的父子关系。这种展示方式比简单的列表(如ps命令的输出)更加直观,有助于用户快速理解进程的继承关系。
命令格式
pstree [-acglpsStuZ] [ -h | -H PID ] [ -n | -N type ] [ -A | -G | -U ] [ PID | USER ]
常用选项
-p|--show-pids : 显示PID,包含 -c 选项
一般选项
-a|--arguments : 显示该进程的完整指令及参数
-A|--ascii : 使用 ASCII 字符绘制线条
-c|--compact : 不压缩相同的子树
-h|--highlight-all : 高亮显示当前进程及父进程
-H PID|--highlight-pid=PID : 高亮显示指定进程及父进程
-g|--show-pgids : 显示进程组ID,包含 -c 选项
-G|--vt100 : 使用VT100线条绘制字符
-l|--long : 不要截断长线
-n|--numeric-sort : 根据PID排序显示
-N type|--ns-sort=type : 根据指定规则排序
(cgroup|ipc|mnt|net|pid|user|uts)
-s|--show-parents : 显示父进程
-S|--ns-changes : 显示命名空间
-t|--thread-names : 显示完整线程名称
-T|--hide-threads : 不显示线程
-u|--uid-changes : 显示进程切换
-Z|--security-context : 显示selinux相关信息
查看进程树
显示进程切换
显示指定用户的进程
显示父进程
2、ps 命令
全称是process status,意为进程状态。通过ps命令,用户可以获取当前系统中正在运行的进程的各种详细信息,如进程ID(PID)、进程状态、CPU使用情况、内存占用、运行时间等。可以查看进程当前状态的快照,默认显示当前终端中的进程,Linux系统各进程的相关信息均保存/proc/PID目录下的各文件中。
命令格式
ps [options]
常用选项
a : 选项包括所有终端中的进程
x : 选项包括不链接终端的进程
u : 选项显示进程所有者的信息
一般选项
f|--forest : 选项显示进程树,相当于
k|--sort opt : 对属性排序,属性前加 - 表示倒序(--sort=uid,-ppid,+pid)
o : 属性… 选项显示定制的信息 pid、cmd、%cpu、%mem
L : 显示支持的属性列表
-C cmdlist : 指定命令,多个命令用,分隔
-L : 显示线程
-e : 显示所有进程,相当于-A
-f : 显示完整格式程序信息
-F : 显示更完整格式的进程信息
-H : 以进程层级格式显示进程相关信息
-u userlist|--user userlist : 指定有效的用户ID或名称
-U userlist|--User userlist : 指定真正的用户ID或名称
-g grplist|--group grplist : 指定有效的gid或组名称
-G grplist|--Group grplist : 指定真正的gid或组名称
-p pid : 显示指pid的进程
--ppid pid : 显示属于pid的子进程
-t ttylist : 指定tty,相当于 t
-M : 显示SELinux信息,相当于Z
ps 输出信息
USER : 进程属主
PID : 进程ID
PPID : 父进程ID
%CPU : CPU占用率
%MEM : 内存占用率
VSZ : Virtual memory SiZe,虚拟内存集,线性内存,虚似内存
RSS : ReSident Size,常驻内存集,实际占用物理内存
TTY : 终端
STAT : 进程状态
START : 进程开始时间
TIME : 累计分配给进程的cpu时长
COMMAND : 对应的程序及参数
UID : 进程属主
C : cpu利用率,取整
STIME : 进程开始时间
CMD : 对应的程序及参数
ni : nice值
pri : priority优先级。
rtprio : 实时优先级,不是所有的进程都有实时优先级的。
psr : processor CPU编号
进程状态字段说明
R : running ,运行中
S : interruptable sleeping,可中断的睡眠状态
D : uninterruptable sleeping,不可中断的睡眠状态
T : stopped,停止态
Z : zombie,僵尸态
+ : 前台进程
I : Idle kernel thread,CentOS 8 新特性
L : 内存分页并带锁
N : 低优先级进程
< : 高优先级进程
s : session leader,会话(子进程)发起者
l : 多线程进程
查看当前终端进程
显示所有所有进程,并列出所属用户
详细格式显示所有进程
显示指定列
显示当前用户所拥有的所有进程
查看进程父子关系
查看指定用户的进程
3、top 命令
用于实时显示系统的运行状况,特别是各个进程的资源和性能使用情况。它提供了一个动态更新的视图,帮助系统管理员和用户监控系统的健康状态。
命令格式
top -hv | -bcEHiOSs1 -d secs -n max -u|U user -p pid(s) -o field -w [cols]
常见选项
-n N : 刷新多少次后退出
-d N : 指定刷新时间间隔,默认为3秒
一般选项
-h|v : 显示帮助
-b : 显示全部所有进程
-c : 显示命令信息
-E{k|m|g|t|p|e} : 指定内存显示单位
-H : 线程模式
-1 : 十进制数字1,在首部分别显示每颗CPU信息
-p PID : 显示指定进程的数据
-u|U user : 查看指定用户的进程
-w cols : 指定输出内容显示宽度
交互命令
手动刷新:在top运行时,可以通过输入回车或空格来手动刷新显示。
退出:按q键可以退出top命令。
排序命令
P或Shift+p:按CPU使用率对进程进行排序。默认是降序排列,再次按键则切换为升序。
M或Shift+m:按内存使用量RES对进程进行排序。默认是降序排列,再次按键则切换为升序。在计算机系统中,RES(Resident Set Size)即常驻集大小,是指进程实际占用的物理内存大小
N:按进程ID排序 - 降序。
T:按运行时间TIME或累积时间对任务排序。
o或Shift+o:设置排序的关键字,可以根据需要选择不同的排序依据。
进程操作命令
k:杀死指定的进程。系统会提示输入进程号和要发送的信号,默认信号是SIGTERM。如果要强行杀死进程,可以输入SIGKILL(信号编号为9)。
r:改变某个进程的优先级。需要输入进程号和新的nice值,最后按Enter
显示设置命令
c:切换是否显示每个进程的完整命令行。
f或Shift+f:进入或离开自定义显示字段模式,可以添加或移除显示的列。
d:改变两次屏幕刷新之间的延时时间。
t:显示当前时间、系统运行时间以及空闲/繁忙周期,尤其是图形比例图。
i:开启或关闭忽略闲置(idle)和僵死(zombie)进程的显示。
视图切换命令(0、1、2、3:在不同视图间切换。)
按 0:显示所有 CPU 核心的总占用率。将所有 CPU 核心的使用率合并显示为一个整体,适用于快速查看系统整体 CPU 负载,不关注单个核心的情况。
按 1:显示每个 CPU 核心的占用率(最常用)。将每个 CPU 核心的使用率单独列出,用于排查 CPU 负载是否均衡,或定位某个核心高占用的进程(如多核 CPU 中某核心被压满)。按两次1表示恢复到0的状态。
按 2:切换 SMP(对称多处理)模式显示。当系统启用 SMP 时,控制是否将 CPU 核心分组显示(通常与1配合使用)。该按键在现代系统中使用较少,默认状态下已自动适配多核显示。按两次2表示恢复到0的状态。
按 3:切换 CPU 时间统计方式(用户态 / 内核态)。控制是否突出显示用户态(us)和内核态(sy)的 CPU 时间占比。部分top版本可能不支持该按键,或功能被整合到其他操作中。
查看状态
5秒刷新一次
显示指定用户进程
显示进程具体的命令