1. 进程基础概念
1.1 进程的定义
进程(Process)是操作系统对正在运行的程序的一种抽象,是系统进行资源分配和调度的独立单位。从内核视角看,进程是程序在某个数据集合上的一次执行活动,是动态的、有生命周期的实体。
核心定义:进程是操作系统为正在执行的程序提供的运行环境,包含程序代码、当前活动(通过程序计数器的值表示)、相关数据集合以及执行上下文。
1.2 进程与程序的区别
进程和程序是两个紧密相关但本质不同的概念。下表从多个维度对比二者的差异:
| 对比维度 | 程序(Program) | 进程(Process) |
|---|---|---|
| 本质 | 静态的指令集合,存储在磁盘上 | 动态的执行实体,存在于内存中 |
| 生命周期 | 长期存在,可永久保存 | 短暂存在,从创建到终止 |
| 资源占用 | 仅占用磁盘存储空间 | 占用 CPU、内存、I/O 等系统资源 |
| 对应关系 | 一个程序可对应多个进程 | 一个进程只能对应一个程序 |
| 并发性 | 不具备并发执行能力 | 多个进程可并发执行 |
记忆要点:程序是菜谱(静态),进程是炒菜的过程(动态)。同一个菜谱可以同时被多个厨师使用,对应一个程序可以产生多个进程。
1.3 进程的组成
一个进程在内存中由三个核心部分组成:
- 进程控制块(PCB,Process Control Block):内核中用于描述进程状态和管理进程的数据结构,是进程存在的唯一标识。包含进程 ID(PID)、状态、程序计数器、CPU 寄存器、内存限制、打开文件列表等信息。
- 代码段(Text Segment):存放可执行程序的机器指令,通常为只读,防止程序被意外修改。
- 数据段(Data Segment):包含全局变量、静态变量以及动态分配的堆空间(Heap)和栈空间(Stack)。
关键理解:PCB 是进程在内核中的“身份证”,内核通过 PCB 感知和管理进程。没有 PCB,进程就不存在。代码段和数据段是进程在用户空间的实际内容。
1.4 进程的状态模型
1.4.1 三态模型
三态模型是进程状态的最基本抽象,包含三种核心状态:
- 就绪(Ready):进程已获得除 CPU 之外的所有资源,等待调度器分配 CPU。
- 运行(Running):进程正在 CPU 上执行指令。
- 阻塞(Blocked / Waiting):进程因等待某事件(如 I/O 完成、信号量)而暂停执行。
1.4.2 五态模型
五态模型在三态基础上增加了创建(New)和终止(Terminated)两个状态,更完整地描述了进程的完整生命周期:
| 状态 | 描述 | 典型操作 |
|---|---|---|
| 创建(New) | 进程正在被创建,尚未进入就绪队列 | 分配 PCB、加载代码和数据 |
| 就绪(Ready) | 进程已就绪,等待 CPU 调度 | 放入就绪队列 |
| 运行(Running) | 进程正在 CPU 上执行 | 执行指令、处理中断 |
| 阻塞(Blocked) | 进程等待某事件发生 | 放入阻塞队列 |
| 终止(Terminated) | 进程执行完毕或被强制结束 | 回收资源、销毁 PCB |
实战视角:在 Linux 内核中,进程状态定义在
include/linux/sched.h 头文件中,使用 TASK_RUNNING(就绪+运行)、TASK_INTERRUPTIBLE(可中断阻塞)、TASK_UNINTERRUPTIBLE(不可中断阻塞)、EXIT_ZOMBIE(僵尸态)等宏表示。五态模型是理解这些内核状态的基础。
1.5 本章小结
- 进程是动态的执行实体,程序是静态的指令集合,二者有本质区别。
- 进程由 PCB、代码段、数据段三部分组成,PCB 是进程存在的唯一标识。
- 三态模型(就绪、运行、阻塞)是进程调度的核心抽象。
- 五态模型(创建、就绪、运行、阻塞、终止)完整描述了进程的完整生命周期。