当前位置: 首页 > news >正文

Linux进程管理:从基础到实战

在 Linux 系统编程中,进程(Process) 是操作系统进行资源分配和调度的基本单位。理解进程的概念是掌握系统编程、多任务处理、并发编程的基础。


目录

一、什么是进程?

定义:

二、进程的生命周期

示例:查看当前系统中的进程

三、进程的状态(STAT)

四、进程的父子关系与进程树

示例:查看进程树

关键概念:

五、进程标识符(PID 和 PPID)

示例:查看当前 shell 的 PID 和 PPID

六、前台进程与后台进程

示例:将进程放入后台运行

七、进程的优先级(Nice 值)

查看 nice 值:

设置 nice 值启动进程:

修改已有进程的 nice 值:

八、进程相关的系统调用(C语言接口)

九、第一个 C 程序:演示 fork() 创建进程

示例代码:process_example.c

编译并运行:

十、总结知识点图解(知识树状图)

十一、课后练习建议


一、什么是进程?

定义:

进程是一个程序的执行实例,包括:

  • 程序代码(Text Segment)
  • 当前活动(如寄存器的状态、程序计数器等)
  • 数据段(Data Segment)
  • 堆栈(Stack)
  • 打开的文件、信号处理函数等资源

简单来说:一个正在运行的程序就是一个进程。


二、进程的生命周期

一个进程从创建到终止,会经历以下几个阶段:

+-------------------+
|     创建进程      |   fork()
+-------------------+|v
+-------------------+
|    运行/就绪状态  |
+-------------------+|v
+-------------------+
| 阻塞(等待I/O等) |
+-------------------+|v
+-------------------+
|     终止或退出    | exit(), _exit()
+-------------------+

示例:查看当前系统中的进程

ps aux

输出示例(简化):

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.2 168944  9348 ?        Ss   09:00   0:01 /sbin/init
user1     1234  0.1  0.5 500000 20000 ?        Sl   09:10   0:02 /usr/bin/vim

各列含义简要说明:

列名含义
USER进程所有者
PID进程 ID
%CPU占用 CPU 百分比
%MEM占用内存百分比
VSZ虚拟内存使用量(KB)
RSS实际物理内存使用量(KB)
TTY控制终端
STAT进程状态
START进程启动时间
TIME占用 CPU 时间总和
COMMAND启动命令

三、进程的状态(STAT)

Linux 中进程常见的状态有以下几种:

状态字符含义
R (Running)正在运行或准备运行
S (Sleeping)可中断的睡眠状态(等待某事件)
D (Disk Sleep)不可中断的睡眠(通常在 I/O)
Z (Zombie)僵尸进程(已结束但未被回收)
T (Stopped)被停止(如收到 SIGSTOP)
X (Dead)已死亡(不会出现在 ps 中)

四、进程的父子关系与进程树

每个进程都有一个父进程(除了 init/systemd),通过 fork() 创建子进程。

示例:查看进程树

pstree

输出示例:

systemd─┬─NetworkManager───2*[{NetworkManager}]├─login───bash└─sshd───bash───vim

关键概念:

  • 父进程(Parent Process):创建其他进程的进程。
  • 子进程(Child Process):由父进程创建的进程。
  • 僵尸进程(Zombie Process):子进程结束后,父进程没有调用 wait() 或 waitpid() 获取其退出状态,该子进程变成僵尸进程。
  • 孤儿进程(Orphan Process):父进程先于子进程结束,子进程成为孤儿进程,由 init(PID=1)接管。

五、进程标识符(PID 和 PPID)

  • PID(Process ID):进程的唯一标识号。
  • PPID(Parent Process ID):父进程的 PID。

示例:查看当前 shell 的 PID 和 PPID

echo "Current PID: $$"
echo "Parent PID: $PPID"

输出示例:

Current PID: 12345
Parent PID: 11111

你也可以使用 ps 查看详细信息:

ps -p 12345 -o pid,ppid,comm

六、前台进程与后台进程

  • 前台进程:占用终端,用户可以直接交互。
  • 后台进程:不占用终端,通常用于长时间运行的任务。

示例:将进程放入后台运行

sleep 100 &   # 在后台运行

查看后台进程:

jobs

七、进程的优先级(Nice 值)

Linux 使用 nice 值 来控制进程的优先级,默认值为 0,范围为 -20(最高优先级)到 19(最低优先级)。

查看 nice 值:

ps -l

设置 nice 值启动进程:

nice -n 10 sleep 100 &

修改已有进程的 nice 值:

renice 5 -p 12345

八、进程相关的系统调用(C语言接口)

这些是 Linux 编程中最常用的系统调用:

系统调用功能描述
fork()创建子进程
exec() 系列替换当前进程为新程序
wait()等待子进程结束
exit()终止当前进程
getpid()获取当前进程的 PID
getppid()获取父进程的 PID

九、第一个 C 程序:演示 fork() 创建进程

示例代码:process_example.c

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>int main() {pid_t pid;printf("Before fork: This is the parent process (PID: %d)\n", getpid());pid = fork();  // 创建子进程if (pid < 0) {fprintf(stderr, "Fork failed\n");return 1;} else if (pid == 0) {// 子进程printf("This is the child process (PID: %d), Parent PID: %d\n", getpid(), getppid());} else {// 父进程printf("This is the parent process again (PID: %d), Child PID: %d\n", getpid(), pid);}return 0;
}

编译并运行:

gcc process_example.c -o process_example
./process_example

输出示例(顺序可能不同):

Before fork: This is the parent process (PID: 12345)
This is the parent process again (PID: 12345), Child PID: 12346
This is the child process (PID: 12346), Parent PID: 1

注意:由于父进程和子进程是并发执行的,所以输出顺序可能不确定。


十、总结知识点图解(知识树状图)

进程的概念
│
├── 什么是进程?
│   ├── 程序的执行实例
│   └── 包含代码、数据、堆栈、资源等
│
├── 进程生命周期
│   ├── 创建 → 运行 → 阻塞 → 终止
│   └── fork(), exec(), exit()
│
├── 进程状态(STAT)
│   ├── R/S/D/Z/T/X
│
├── 进程关系与进程树
│   ├── 父进程与子进程
│   ├── 僵尸进程 vs 孤儿进程
│   └── pstree 命令查看树结构
│
├── 进程标识符
│   ├── PID(当前进程ID)
│   └── PPID(父进程ID)
│
├── 前台进程 vs 后台进程
│   ├── jobs, &, fg, bg
│
├── 进程优先级(nice)
│   ├── nice, renice 命令
│
└── 进程相关系统调用(C语言)├── fork()├── exec()├── wait()├── exit()├── getpid()└── getppid()

十一、课后练习建议

  1. 使用 ps 命令查找当前运行的所有 bash 进程。
  2. 写一个 Shell 脚本,在后台运行多个 sleep 命令,并使用 jobs 查看它们的状态。
  3. 编写一个 C 程序,使用 fork() 创建两个子进程,分别打印不同的信息。
  4. 尝试使用 nice 和 renice 修改某个进程的优先级。
http://www.lryc.cn/news/580335.html

相关文章:

  • 60天python训练计划----day59
  • 数据结构:数组:插入操作(Insert)与删除操作(Delete)
  • 深度学习4(浅层神经网络)
  • 【深度学习】神经网络剪枝方法的分类
  • 由coalesce(1)OOM引发的coalesce和repartition理解
  • C++ 网络编程(15) 利用asio协程搭建异步服务器
  • Linux——进程(下)
  • android studio 配置硬件加速 haxm
  • spring中 方法上@Transation实现原理
  • C++20中的counting_semaphore的应用
  • C++ 模板参数匹配、特化
  • AtCoder AT_abc413_c [ABC413C] Large Queue 题解
  • Oracle 数据库——企业级核心系统
  • MySQL(118)如何使用SSL进行加密连接?
  • mysql的备份与恢复(使用mysqldump)
  • pyinstaller打包教程
  • TCP数据的发送和接收
  • 闲庭信步使用SV搭建图像测试平台:第三十一课——基于神经网络的手写数字识别
  • Ubuntu基础(监控重启和查找程序)
  • 模块三:现代C++工程实践(4篇)第一篇《C++模块化开发:从Header-only到CMake模块化》
  • Redis的编译安装
  • LabVIEW电阻率测试
  • LinkedList剖析
  • Kafka消息积压全面解决方案:从应急处理到系统优化
  • idea的使用小技巧,个人向
  • 类图+案例+代码详解:软件设计模式----适配器模式
  • 【电赛培训】运算放大器、滤波器
  • 使用 C++/OpenCV 和 MFCC 构建双重认证智能门禁系统
  • 堆的简单介绍
  • 智链万物:人工智能驱动的产业智能化革命