01. 基本概念
进程与线程的基本概念
进程(Process)
定义:进程是程序在计算机上的一次执行过程,是系统进行资源分配和调度的基本单位。
特征:
- 动态性:进程是程序的执行过程,具有生命周期
- 并发性:多个进程可以同时存在和运行
- 独立性:进程是独立的资源分配单位
- 结构性:进程由程序、数据和进程控制块组成
进程的组成:
- 程序段:存放程序代码
- 数据段:存放程序运行时的数据
- 进程控制块(PCB):存放进程的管理信息
进程控制块(PCB)
PCB 的作用:PCB 是操作系统管理进程的核心数据结构,包含进程的所有管理信息。
PCB 的主要内容:
-
进程标识信息:
- 进程 ID(PID)
- 父进程 ID(PPID)
- 用户 ID(UID)
-
处理机状态信息:
- 通用寄存器内容
- 程序计数器(PC)
- 程序状态字(PSW)
- 栈指针
-
进程调度信息:
- 进程状态
- 进程优先级
- 调度队列指针
- 其他调度参数
-
进程控制信息:
- 程序和数据地址
- 进程同步和通信机制
- 资源清单
- 链接指针
线程(Thread)
定义:线程是进程内的一个执行单元,是 CPU 调度的基本单位。
特征:
- 轻量级:线程的创建、撤销和切换开销小
- 共享性:同一进程内的线程共享进程的资源
- 并发性:多个线程可以并发执行
- 独立性:每个线程有独立的程序计数器和栈
线程与进程的关系:
进程
├── 代码段(共享)
├── 数据段(共享)
├── 文件描述符(共享)
├── 线程1
│ ├── 程序计数器
│ ├── 寄存器集合
│ └── 栈
├── 线程2
│ ├── 程序计数器
│ ├── 寄存器集合
│ └── 栈
└── ...
进程与线程的区别
特征 | 进程 | 线程 |
---|---|---|
资源分配 | 独立的内存空间 | 共享进程的内存空间 |
创建开销 | 大(需要分配内存) | 小(共享已有资源) |
切换开销 | 大(需要切换内存空间) | 小(只需切换寄存器) |
通信方式 | 进程间通信(IPC) | 共享内存、全局变量 |
并发性 | 进程级并发 | 线程级并发 |
独立性 | 完全独立 | 相对独立 |
多线程模型
1. 用户级线程(ULT)
特点:
- 线程管理由用户程序完成
- 操作系统不知道线程的存在
- 线程切换不需要内核参与
优点:
- 线程切换开销小
- 调度算法灵活
- 可移植性好
缺点:
- 一个线程阻塞会影响整个进程
- 无法利用多核 CPU
2. 内核级线程(KLT)
特点:
- 线程管理由操作系统内核完成
- 内核为每个线程分配资源
- 线程切换需要内核参与
优点:
- 可以充分利用多核 CPU
- 一个线程阻塞不影响其他线程
- 调度更加公平
缺点:
- 线程切换开销大
- 系统资源消耗多
3. 混合模型
特点:
- 结合用户级线程和内核级线程的优点
- 用户级线程映射到内核级线程
- 提供更好的性能和灵活性
实现方式:
- 多对多模型:多个用户线程映射到多个内核线程
- 一对一模型:每个用户线程对应一个内核线程
- 多对一模型:多个用户线程映射到一个内核线程
进程状态
基本状态
-
就绪状态(Ready):
- 进程已获得除 CPU 外的所有资源
- 等待 CPU 调度执行
- 在就绪队列中排队
-
运行状态(Running):
- 进程正在 CPU 上执行
- 占用 CPU 资源
- 同一时刻只能有一个进程处于运行状态
-
阻塞状态(Blocked):
- 进程等待某个事件或资源
- 无法被 CPU 调度
- 在阻塞队列中等待
状态转换
就绪状态 ←→ 运行状态 ←→ 阻塞状态
↑ ↓ ↓
└───────────┴───────────┘
转换条件:
- 就绪 → 运行:CPU 调度器选择该进程执行
- 运行 → 就绪:时间片用完或被更高优先级进程抢占
- 运行 → 阻塞:进程请求 I/O 操作或等待资源
- 阻塞 → 就绪:等待的事件发生或资源可用
进程控制
进程创建
创建方式:
- 系统初始化:系统启动时创建系统进程
- 用户请求:用户通过命令或程序创建进程
- 进程派生:现有进程创建子进程
创建过程:
- 分配 PCB
- 分配内存空间
- 初始化 PCB
- 将进程加入就绪队列
进程撤销
撤销方式:
- 正常结束:进程执行完毕
- 异常结束:进程执行出错
- 外部干预:被其他进程或用户终止
撤销过程:
- 释放进程占用的资源
- 释放 PCB
- 通知父进程
进程切换
切换时机:
- 时间片用完
- 更高优先级进程就绪
- 当前进程阻塞
- 当前进程结束
切换过程:
- 保存当前进程的上下文
- 更新 PCB 信息
- 选择下一个要执行的进程
- 恢复新进程的上下文
- 跳转到新进程执行