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) 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 完成、信号量)而暂停执行。
进程三态模型 就绪(Ready) 运行(Running) 阻塞(Blocked) 调度 时间片耗尽 / 抢占 等待事件 事件完成

1.4.2 五态模型

五态模型在三态基础上增加了创建(New)和终止(Terminated)两个状态,更完整地描述了进程的完整生命周期:

状态 描述 典型操作
创建(New) 进程正在被创建,尚未进入就绪队列 分配 PCB、加载代码和数据
就绪(Ready) 进程已就绪,等待 CPU 调度 放入就绪队列
运行(Running) 进程正在 CPU 上执行 执行指令、处理中断
阻塞(Blocked) 进程等待某事件发生 放入阻塞队列
终止(Terminated) 进程执行完毕或被强制结束 回收资源、销毁 PCB
进程五态模型 创建(New) 就绪(Ready) 运行(Running) 阻塞(Blocked) 终止(Terminated) 创建完成 调度 时间片耗尽 等待事件 事件完成 执行完毕
实战视角:在 Linux 内核中,进程状态定义在 include/linux/sched.h 头文件中,使用 TASK_RUNNING(就绪+运行)、TASK_INTERRUPTIBLE(可中断阻塞)、TASK_UNINTERRUPTIBLE(不可中断阻塞)、EXIT_ZOMBIE(僵尸态)等宏表示。五态模型是理解这些内核状态的基础。

1.5 本章小结

  • 进程是动态的执行实体,程序是静态的指令集合,二者有本质区别。
  • 进程由 PCB、代码段、数据段三部分组成,PCB 是进程存在的唯一标识。
  • 三态模型(就绪、运行、阻塞)是进程调度的核心抽象。
  • 五态模型(创建、就绪、运行、阻塞、终止)完整描述了进程的完整生命周期。