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)

  • 用于动态内存分配的区域
  • 当调用 malloccallocrealloc 等函数时,从堆中分配内存
  • 当调用 free 函数时,将内存释放回堆
  • 堆的大小可以动态增长或缩减
  • 需要程序员手动管理内存分配和释放

2.5 栈(Stack)

  • 存放函数调用时的局部变量、函数参数、返回地址等
  • 不包括 static 声明的变量(这类变量在数据段中)
  • 采用"先进后出"(LIFO)原则,适合保存/恢复调用现场
  • 由系统自动管理,函数调用时压栈,返回时弹栈

注意:代码段、数据段、BSS段属于程序本身的内容,在程序加载时确定;而堆和栈是在进程运行时动态管理的。

3. 进程控制块(PCB)

进程控制块是操作系统管理进程的核心数据结构,每个进程都有一个对应的PCB。

3.1 PCB包含的主要信息:

  1. 进程标识符(PID):唯一标识一个进程
  2. 进程状态:运行、就绪、阻塞等
  3. 程序计数器:下一条要执行的指令地址
  4. CPU寄存器:进程切换时需要保存的寄存器值
  5. CPU调度信息:进程优先级、调度队列指针等
  6. 内存管理信息:基址寄存器、界限寄存器、页表等
  7. 记账信息:CPU使用时间、时间限制等
  8. I/O状态信息:分配给进程的I/O设备列表、打开文件列表等

3.2 PCB的作用:

  • 作为进程存在的唯一标志
  • 保存进程切换时的现场信息
  • 提供进程调度所需的信息
  • 实现进程间的通信和同步

4. 进程类型

4.1 交互式进程(Interactive Processes)

  • 在shell下启动,与用户交互
  • 可以在前台运行(占用终端),也可以在后台运行
  • 示例:文本编辑器、终端命令等

4.2 批处理进程(Batch Processes)

  • 与终端无关,通常被提交到作业队列中顺序执行
  • 不需要用户交互,自动完成任务
  • 示例:编译任务、数据分析任务等

4.3 守护进程(Daemon Processes)

  • 系统启动时启动,一直在后台运行
  • 不与任何终端关联,为系统或其他进程提供服务
  • 通常以"d"结尾,如 httpdsshdcron
  • 生命周期长,直到系统关闭

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. 进程状态转换

创建 → 就绪 ↔ 运行 → 终止
         ↑      ↓
         └── 阻塞
  1. 创建:新进程被创建,进入就绪态
  2. 调度:就绪态进程被调度器选中,进入运行态
  3. 时间片用完:运行态进程时间片用完,回到就绪态
  4. 等待事件:运行态进程需要等待I/O等事件,进入阻塞态
  5. 事件发生:阻塞态进程等待的事件发生,回到就绪态
  6. 终止:运行态进程执行完毕或被杀死,进入终止态
Logo

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

更多推荐