Appearance
进程、线程与调度
进程和线程
- 进程(process):运行中的程序实例,拥有独立虚拟地址空间、打开文件、句柄等资源,是资源隔离的重要边界。
- 线程(thread):进程内的一条执行流,拥有自己的程序计数器、寄存器、栈和线程局部存储;同一进程的线程共享代码、堆、全局数据和多数进程资源。操作系统通常以线程作为实际调度实体。
| 对比 | 进程 | 线程 |
|---|---|---|
| 地址空间 | 通常隔离 | 同进程内共享 |
| 创建/切换 | 资源和页表等状态更多,开销通常较大 | 上下文较少,通常更轻量 |
| 通信 | 管道、共享内存、Socket、消息队列等 IPC | 可直接共享内存,但需同步 |
| 隔离性 | 一个进程崩溃通常不直接破坏其他进程 | 一个线程越界/崩溃常导致整个进程受影响 |
并发与并行
- 并发(concurrency):多个任务在同一时间段推进;单核可通过时间片交替实现。
- 并行(parallelism):多个任务在同一时刻由多个硬件执行单元同时执行。
并发关注结构和任务协作;并行关注真实的同时执行与吞吐提升。多核程序可同时具备二者。
用户态与内核态
CPU 通过特权级别保护系统资源:
- 用户态:应用运行的受限模式,不能直接执行特权指令、操作页表或直接管理硬件。
- 内核态:操作系统内核运行的高特权模式,可管理硬件、内存、调度和文件系统。
状态切换常由以下事件触发:
- 系统调用:如
read、write、open,应用通过受控入口请求内核服务; - 异常:如缺页、除零、非法指令;
- 中断:如网卡、磁盘、时钟产生的外部事件;
- 调度:时钟中断或阻塞事件使内核选择其他可运行线程。
用户态/内核态切换不等同于进程或线程上下文切换;系统调用返回原线程时可能没有发生任务切换。
常见调度算法
| 算法 | 特点 | 问题/适用点 |
|---|---|---|
| 先来先服务 FCFS | 按到达顺序执行 | 简单,但长任务会造成护航效应 |
| 最短作业优先 SJF | 优先预计运行最短的作业 | 平均等待时间低;长任务可能饥饿,且难精确预测时长 |
| 最短剩余时间 SRTF | SJF 的抢占式版本 | 新短任务可抢占;长任务仍可能饥饿 |
| 优先级调度 | 按优先级选择 | 低优先级可能饥饿,可用 aging 提升等待者优先级 |
| 时间片轮转 RR | 轮流执行固定时间片 | 适合分时交互;时间片过大退化 FCFS,过小切换开销高 |
| 多级反馈队列 MLFQ | 多个优先级队列,按行为动态迁移 | 兼顾交互和吞吐,是通用系统常见思路 |
进程间通信(IPC)
| 方式 | 特征 |
|---|---|
| 匿名管道 | 内核缓冲区字节流,常用于有亲缘关系的进程,通常单向 |
| 命名管道 FIFO | 有路径名,可用于无亲缘进程,仍是字节流 |
| 消息队列 | 以消息为单位传递,可带类型/优先级 |
| 共享内存 | 多进程映射同一物理页,数据通路最快,但必须额外同步 |
| 信号 | 异步通知某事件,携带信息有限,不适合传大量数据 |
| Socket | 可跨主机,也可本机 UNIX domain socket;接口通用 |
| 信号量/进程共享锁 | 主要用于协调对共享资源的访问,而非承载大量数据 |
条件变量、互斥锁常用于线程同步;在支持进程共享属性和共享内存时,也可被用于进程间同步。