1. 进程与线程:基础概念

1.1 什么是进程?

进程是程序在操作系统中的一次执行过程,是系统进行“资源分配和调度”的基本单位。它包含了程序执行所需的各种资源,如内存空间、文件描述符等。每个进程都有自己独立的内存空间和系统资源,不同进程之间相互隔离。

关键点:

  • 程序是静态的代码文件。
  • 进程是程序运行时的动态形态,是程序的一个副本。
  • 进程拥有完整的生命周期:准备期、运行期、终止期。

1.2 什么是线程?

线程是进程中的一个执行单元,是 CPU 调度和分派的基本单位。

  • 一个进程可以包含多个线程。
  • 这些线程共享进程的内存空间和系统资源
  • 每个线程有自己独立的栈空间和程序计数器。
  • 线程之间可以并发执行,提高程序的执行效率。
  • 在多核 CPU 系统中,每个核心处理的任务单元就是线程。

2. 进程状态详解

Linux 进程有以下几种核心状态,可通过 pstop 命令的 STAT 列查看:

状态码 内核宏定义 含义
R TASK_RUNNING 可执行态(正在运行或在运行队列中等待)
S TASK_INTERRUPTIBLE 可中断的睡眠状态(等待事件完成,可被信号唤醒)
D TASK_UNINTERRUPTIBLE 不可中断的睡眠状态(通常等待硬件 I/O,不能被信号唤醒)
T TASK_STOPPED 暂停状态(进程被信号暂停,如 SIGSTOP
Z TASK_ZOMBIE 僵死态(进程已终止,但父进程尚未回收其资源)

状态字符补充说明(在 STAT 列可能伴随出现):

  • <:高优先级进程
  • N:低优先级进程
  • s:会话首进程(顶级进程)
  • +:进程位于前台进程组

3. 进程查看方法

3.1 图形化工具

gnome-system-monitor

3.2 命令行工具详解

ps 命令

最常用的进程查看工具,有三种风格:UNIX、BSD、GNU。

常用组合:

ps ax                     # 显示所有进程(与终端相关+无关)
ps aux                    # BSD风格:显示所有进程的详细信息(用户、CPU、内存等)
ps -ef                    # UNIX风格:显示完整格式的所有进程
ps -ejHps axjf        # 显示进程树(层级关系)
ps -o pid,comm,ni,pri,pcpu,ppid,stat,user,group # 显示指定字段

ps aux 输出字段说明:

  • USER:进程所有者
  • PID:进程ID
  • %CPU:CPU使用百分比
  • %MEM:内存使用百分比
  • VSZ:虚拟内存大小 (KB)
  • RSS:常驻内存大小 (KB)
  • TTY:关联的终端
  • STAT:进程状态(见第2节)
  • START:进程启动时间
  • TIME:累计占用CPU时间
  • COMMAND:启动命令
pgrep 命令

根据条件过滤进程ID。

pgrep -u uid          # 按用户ID查找
pgrep -U username     # 按用户名查找
pgrep -t tty          # 按终端查找
pgrep -l              # 同时列出进程名
pgrep -a              # 列出完整命令行
pidof 命令

根据进程名查找PID。

pidof vim
top 命令

动态实时查看系统进程和资源使用情况。

启动与常用内部指令:

top -d 5              # 每5秒刷新一次
top -b -n 2           # 以批次模式运行,输出2次后退出

top 运行时快捷键:

  • P:按 CPU 使用率排序
  • M:按内存使用率排序
  • T:按累计 CPU 时间排序
  • k:终止指定进程
  • u:仅显示指定用户的进程
  • s:更改刷新延迟(秒)
  • q:退出

top 信息区解读:

  • load average: 0.75, 0.53, 0.41:系统1分钟、5分钟、15分钟的平均负载。
  • %Cpu(s):
    • us:用户空间占用CPU百分比
    • sy:内核空间占用CPU百分比
    • ni:调整过nice值的进程占用百分比
    • id:空闲CPU百分比
    • wa:等待I/O的CPU时间百分比
    • hi/si:处理硬/软中断的时间百分比
    • st:被虚拟机偷走的时间(虚拟化环境)

4. 进程的前后台调用

  • 命令 &:直接在后台启动进程。
  • <Ctrl>+<Z>:将当前前台进程挂起(暂停)并放入后台。
  • jobs:查看当前Shell中的所有后台作业。
  • fg [%作业号]:将后台作业调至前台运行。
  • bg [%作业号]:将后台挂起的作业继续运行(仍在后台)。

5. 进程优先级管理

5.1 优先级范围

Linux 进程优先级范围是 0-139

  • 0-99:实时优先级(由内核控制,数值越高优先级越高)。
  • 100-139:静态优先级(用户可控,对应 nice 值 -20 到 19)。
  • 在这里插入图片描述

5.2 调整优先级

nice 值:-20(最高优先级)到 19(最低优先级)。

nice -n -5 command      # 以高优先级(nice值为-5)启动新进程
renice -n -5 43331      # 更改已运行进程(PID 43331)的nice值为-5
```![请添加图片描述](https://i-blog.csdnimg.cn/direct/cc100fedd6b5428ca8797b3ca7c0729e.png)
同时,还有当开启进程时任何指定优先级,输入下方命令可以在开启的同时设定其优先级。![请添加图片描述](https://i-blog.csdnimg.cn/direct/bb28b6e98dd1479898e326f54edd39b2.png)

[root@localhost Desktop]# nice -n -5 firefox &`top``ps` 中:
- **PR** 列:进程优先级(显示为内核视角的优先级数字)。
- **NI** 列:nice值(用户可调部分)。

## 6. 进程信号(Signal)的使用

信号是一种软件中断,用于进程间通信或控制进程行为。

### 6.1 常用信号

| 信号名称 | 信号编号 | 默认行为 | 描述与触发方式 |
| :--- | :--- | :--- | :--- |
| **SIGHUP** | 1 | 终止进程 | 终端断开连接时发送。常用于让守护进程重新加载配置。 |
| **SIGINT** | 2 | 终止进程 | 用户在终端按下 `Ctrl+C` 时发送给前台进程。 |
| **SIGQUIT** | 3 | 终止并生成核心转储 | 用户在终端按下 `Ctrl+\` 时发送。 |
| **SIGTERM** | 15 | 终止进程 | **默认的终止信号**,请求进程正常退出。 |
| **SIGKILL** | 9 | 强制终止进程 | **不可被捕获、阻塞或忽略**。用于强制杀死无响应的进程。 |
| **SIGSTOP** | 19 | 暂停进程 | **不可被捕获、阻塞或忽略**。暂停进程执行。 |
| **SIGCONT** | 18 | 继续执行 | 恢复被 `SIGSTOP` 暂停的进程。 |

### 6.2 信号控制工具示例
```bash
kill -9 1234                 # 向PID 1234发送SIGKILL(9)信号
kill -SIGTERM 1234           # 向PID 1234发送SIGTERM(15)信号
killall -9 process_name      # 按进程名批量发送SIGKILL信号
pkill -9 -u username         # 按条件(如用户)发送信号

在这里插入图片描述
在这里插入图片描述

7. Systemd 守护进程管理

7.1 什么是守护进程?

守护进程(Daemon)是一种在后台持续运行不与终端直接交互的特殊进程。通常在系统启动时自动运行,为系统提供各种服务(如Web服务器、日志服务)。

7.2 Systemd 简介

Systemd 是现代 Linux 系统的初始化系统和服务管理器,取代了传统的 SysVinit。

7.3 核心管理命令 systemctl

systemctl start servicename      # 启动服务
systemctl stop servicename       # 停止服务
systemctl restart servicename    # 重启服务
systemctl reload servicename     # 重新加载配置(不重启)
systemctl status servicename     # 查看服务状态
systemctl enable servicename     # 设置开机自启
systemctl enable --now servicename # 设置开机自启并立即启动
systemctl disable servicename    # 禁用开机自启
systemctl mask servicename       # 冻结服务(禁止启动)
systemctl unmask servicename     # 解冻服务

systemctl list-units             # 查看所有单元当前状态
systemctl list-unit-files        # 查看所有单元的开机启动状态
systemctl list-dependencies servicename # 列出服务的依赖关系

systemctl set-default multi-user.target   # 设置默认运行级别为无图形界面
systemctl set-default graphical.target    # 设置默认运行级别为图形界面
systemctl get-default                     # 查看当前默认运行级别

7.4 系统运行级别(Target)

Systemd 使用 target 替代传统的运行级别:

  • multi-user.target:无图形界面的多用户模式(对应传统级别 3)。
  • graphical.target:图形界面的多用户模式(对应传统级别 5)。
  • rescue.target:救援模式(单用户,对应传统级别 1)。
  • poweroff.target / reboot.target:关机/重启。

9. 进程间通信(IPC)实战示例

进程间通信(IPC)是多个进程之间交换数据与同步操作的机制。

9.1 管道(Pipe)

管道是最简单的 IPC 方式,适用于有亲缘关系(如父子进程)的进程间通信。管道是单向的,数据从一端写入,从另一端读取。

9.2 消息队列(Message Queue)

消息队列允许进程通过消息链表进行通信,消息具有类型标识,支持不同进程间的异步通信。

9.3 共享内存(Shared Memory)

共享内存允许多个进程访问同一块内存区域,是速度最快的 IPC 方式,但需要进程自行处理同步问题。

9.4 IPC 方式对比

IPC 方式 特点 适用场景 同步要求
管道 简单、单向、有亲缘关系 父子进程间简单通信 内核自动同步
消息队列 消息类型、异步、跨进程 需要消息分类的通信 内核提供队列同步
共享内存 最快、直接内存访问 大数据量、高性能通信 需进程自行同步(如信号量)

8. 总结

Linux 进程管理是系统运维和开发的基础。掌握进程的状态、查看命令(ps, top)、控制方法(前后台、信号 kill)、优先级调整(nice, renice)以及现代服务管理工具(systemctl),能够帮助您有效地监控系统、优化性能、排查故障并确保关键服务的稳定运行。建议在实际环境中多加练习,将这些命令和概念融会贯通。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐