一、什么是 Linux 进程?

进程(Process)是 Linux 系统中正在运行的程序实例,是操作系统进行资源分配和调度的基本单位。每个进程都有独立的地址空间、文件描述符和运行状态,多个进程可以并发执行,共同完成复杂任务。

二、为什么需要学习 Linux 进程?

学习 Linux 进程管理有以下几个好处:

  • 理解系统运行机制:知道程序如何被加载、运行和退出。
  • 排查系统问题:通过查看进程状态定位 CPU、内存占用异常。
  • 提升开发能力:掌握进程创建、通信与调度,写出更高效的程序。
  • 便于运维管理:熟练使用进程管理命令,保障服务稳定运行。

三、进程的基本概念

1. 进程与程序的区别

程序是存储在磁盘上的静态文件,进程是程序被加载到内存后动态运行的实例。同一个程序可以启动多个进程,每个进程拥有独立的运行环境。

2. 进程的状态

Linux 进程主要有以下几种状态:

  • 运行态(R):正在运行或处于可运行队列中。
  • 睡眠态(S):可中断睡眠,等待某个事件或资源。
  • 不可中断睡眠(D):等待 I/O 完成,通常不可被信号打断。
  • 停止态(T):被暂停,可通过信号恢复。
  • 僵尸态(Z):进程已结束,但父进程尚未回收其资源。

3. 进程的 PID 与 PPID

每个进程都有唯一的进程号(PID),以及记录其父进程的父进程号(PPID)。通过 PID 可以精确管理单个进程,通过 PPID 可以了解进程间的父子关系。

四、进程管理常用命令

1. 查看进程

使用 ps 命令查看当前系统中的进程信息:

# 查看当前终端下的进程
ps

# 查看所有进程的详细信息
ps -ef

# 查看指定进程,支持模糊匹配
ps -ef | grep nginx

使用 top 命令动态监控系统进程,实时查看 CPU、内存占用情况:

top

2. 终止进程

使用 kill 命令向进程发送信号,默认发送 SIGTERM(15)请求正常退出:

# 正常终止指定 PID 的进程
kill 1234

# 强制终止进程
kill -9 1234

# 按进程名终止
pkill nginx

3. 前后台切换

# 后台运行程序
./myapp &

# 查看后台任务
jobs

# 将后台任务切换到前台
fg %1

五、进程创建与退出

在 Linux 中,进程通过 fork() 系统调用创建子进程,子进程是父进程的副本。随后通常调用 exec() 系列函数加载新的程序。进程退出时返回退出码,父进程通过 wait() 回收子进程资源,避免产生僵尸进程。

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main() {
    pid_t pid = fork();
    if (pid == 0) {
        // 子进程
        printf("子进程 PID: %d\n", getpid());
    } else if (pid > 0) {
        // 父进程
        wait(NULL);
        printf("父进程 PID: %d\n", getpid());
    }
    return 0;
}

六、进程间通信(IPC)

进程间通信是 Linux 多进程编程的核心内容,常见方式包括:

  • 管道(Pipe):用于父子进程或兄弟进程间单向传输数据。
  • 消息队列(Message Queue):以消息为单位进行数据交换。
  • 共享内存(Shared Memory):多个进程共享同一块内存区域,效率最高。
  • 信号(Signal):用于异步通知进程某个事件发生。
  • 套接字(Socket):支持不同主机之间的进程通信。

七、总结

Linux 进程是系统运行的核心概念。通过掌握进程的状态、管理命令、创建退出机制以及进程间通信方式,可以更深入地理解操作系统的工作原理,也为后续学习多线程、并发编程打下坚实基础。建议在虚拟机或云服务器上多动手实践,逐步熟悉各类进程管理命令。

Logo

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

更多推荐