1. 程序与进程
1.1 程序(Program)
程序是存放在磁盘上的指令和数据的有序集合,通常以文件形式存在。它是静态的,是代码和数据的物理载体。
1.2 进程(Process)
进程是执行一个程序所分配的资源的总称,是程序的一次执行过程。它是动态的,具有生命周期,包括创建、调度、执行和消亡。
核心区别:
- 程序是静态的代码文件,进程是动态的执行实体
- 一个程序可以对应多个进程(如同时打开多个浏览器窗口)
- 进程拥有系统分配的资源(内存、CPU时间片、文件描述符等)
2. 进程的内存布局
一个进程在内存中通常包含以下几个部分:
2.1 代码段(Text Segment)
- 存放程序执行代码的区域
- 大小在程序运行前就已确定
- 通常是只读的,防止程序意外修改自身指令
- 可能包含一些只读的常数变量(如字符串常量)
2.2 数据段(Data Segment)
- 存放程序中已初始化的全局变量和静态变量
- 在程序加载时分配并初始化
2.3 BSS段(Block Started by Symbol)
- 存放程序中未初始化的全局变量和静态变量
- 在程序加载时分配,但初始值全为0或空指针
- 不占用磁盘空间,只在内存中分配
2.4 堆(Heap)
- 用于动态内存分配的区域
- 当调用
malloc、calloc、realloc等函数时,从堆中分配内存 - 当调用
free函数时,将内存释放回堆 - 堆的大小可以动态增长或缩减
- 需要程序员手动管理内存分配和释放
2.5 栈(Stack)
- 存放函数调用时的局部变量、函数参数、返回地址等
- 不包括
static声明的变量(这类变量在数据段中) - 采用"先进后出"(LIFO)原则,适合保存/恢复调用现场
- 由系统自动管理,函数调用时压栈,返回时弹栈
注意:代码段、数据段、BSS段属于程序本身的内容,在程序加载时确定;而堆和栈是在进程运行时动态管理的。
3. 进程控制块(PCB)
进程控制块是操作系统管理进程的核心数据结构,每个进程都有一个对应的PCB。
3.1 PCB包含的主要信息:
- 进程标识符(PID):唯一标识一个进程
- 进程状态:运行、就绪、阻塞等
- 程序计数器:下一条要执行的指令地址
- CPU寄存器:进程切换时需要保存的寄存器值
- CPU调度信息:进程优先级、调度队列指针等
- 内存管理信息:基址寄存器、界限寄存器、页表等
- 记账信息:CPU使用时间、时间限制等
- I/O状态信息:分配给进程的I/O设备列表、打开文件列表等
3.2 PCB的作用:
- 作为进程存在的唯一标志
- 保存进程切换时的现场信息
- 提供进程调度所需的信息
- 实现进程间的通信和同步
4. 进程类型
4.1 交互式进程(Interactive Processes)
- 在shell下启动,与用户交互
- 可以在前台运行(占用终端),也可以在后台运行
- 示例:文本编辑器、终端命令等
4.2 批处理进程(Batch Processes)
- 与终端无关,通常被提交到作业队列中顺序执行
- 不需要用户交互,自动完成任务
- 示例:编译任务、数据分析任务等
4.3 守护进程(Daemon Processes)
- 系统启动时启动,一直在后台运行
- 不与任何终端关联,为系统或其他进程提供服务
- 通常以"d"结尾,如
httpd、sshd、cron等 - 生命周期长,直到系统关闭
5. 进程状态
进程在其生命周期中会经历多种状态变化:
5.1 运行态(Running)
- 进程正在CPU上执行
- 单核CPU任一时刻只有一个进程处于运行态
5.2 就绪态(Ready)
- 进程已准备好运行,等待CPU调度
- 具备运行条件,只差CPU资源
5.3 阻塞态(Blocked/Waiting)
- 进程在等待某个事件的发生或某种系统资源
- 可中断睡眠:可以被信号唤醒(如等待用户输入)
- 不可中断睡眠:不能被信号唤醒(如等待磁盘I/O完成)
5.4 停止态(Stopped)
- 进程被暂停执行,通常由信号(如SIGSTOP)引起
- 收到继续信号(如SIGCONT)后可恢复运行
- 常用于调试或作业控制
5.5 僵尸态(Zombie)
- 进程已终止,但其PCB尚未被父进程回收
- 占用系统资源(PID),但不再执行
- 父进程应调用
wait()或waitpid()来回收僵尸进程
5.6 死亡态(Dead/Terminated)
- 进程已完全终止,所有资源已被释放
- PCB已被回收,进程不复存在
6. 进程状态转换
创建 → 就绪 ↔ 运行 → 终止 ↑ ↓ └── 阻塞- 创建:新进程被创建,进入就绪态
- 调度:就绪态进程被调度器选中,进入运行态
- 时间片用完:运行态进程时间片用完,回到就绪态
- 等待事件:运行态进程需要等待I/O等事件,进入阻塞态
- 事件发生:阻塞态进程等待的事件发生,回到就绪态
- 终止:运行态进程执行完毕或被杀死,进入终止态