3分钟搭建B站UP主视频自动下载器,从此不错过任何精彩内容
2026/6/19 1:35:04
作为操作系统的核心概念之一,进程是程序运行的载体,也是理解 Linux 系统调度、资源管理的基础。本文将从进程定义、PCB 结构、进程与程序的区别,到虚拟内存、进程状态、调度机制,再到fork创建子进程的实操,全面梳理进程的核心知识。
进程是程序的一次运行过程,它会占用系统的 CPU、内存等资源。
而操作系统用于管理进程的核心数据结构是PCB(Process Control Block,进程控制块)—— 每个运行中的进程都对应一个 PCB,存储着进程的关键信息(如 PID、状态、资源限制等)。
PCB 是进程的 “身份证 + 资源清单”,以 Linux 系统为例,其 PCB 包含的关键信息(部分):
很多人会混淆 “进程” 和 “程序”,核心差异如下:
| 维度 | 程序 | 进程 |
|---|---|---|
| 存在形式 | 永久(存储在磁盘的二进制文件) | 临时(运行时才存在,结束后销毁) |
| 状态变化 | 无(静态文件) | 有(就绪、运行、阻塞等状态切换) |
| 资源占用 | 不占用系统资源 | 占用 CPU、内存等资源 |
| 与其他实体的关系 | 无 | 进程间会竞争系统资源 |
| 运行方式 | 一个程序可运行多次,生成多个进程 | 一个进程对应一个程序的一次运行 |
Linux 中,进程的内存空间是虚拟地址空间,通过地址映射表与物理内存关联。这样做的核心目的是:
进程的虚拟地址空间通常分为多个段:
malloc申请的内存);根据运行特性,进程可分为 3 类:
sshd、nginx),通常在系统启动时运行,等待特定事件触发。进程在生命周期中会在多个状态间切换,Linux 中典型的进程状态包括:
状态切换的触发条件:
Linux 是多任务操作系统,但 CPU 核心数有限,因此需要进程调度来决定 “下一刻哪个进程运行”。
常见的调度算法:
在 Linux 中,创建新进程的核心函数是fork(),它会复制当前进程(父进程)的 PCB、地址空间等资源,生成一个新进程(子进程)。
c
运行
#include <stdio.h> #include <sys/types.h> #include <unistd.h> int main() { pid_t pid = fork(); if (pid > 0) { // 父进程逻辑 printf("父进程PID:%d,子进程PID:%d\n", getpid(), pid); } else if (pid == 0) { // 子进程逻辑 printf("子进程PID:%d,父进程PID:%d\n", getpid(), getppid()); } else { perror("fork失败"); return 1; } return 0; }运行结果(示例):
plaintext
父进程PID:1234,子进程PID:1235 子进程PID:1235,父进程PID:1234ps aux查看所有进程);kill -9 PID强制终止进程)。以上就是 Linux 进程的核心知识,从概念到实操覆盖了进程的生命周期、管理、调度等关键环节。