操作系统基础
目录
1 概述 {#1}
操作系统(Operating System, OS)是管理计算机硬件与软件资源的系统软件,是用户程序与硬件之间的桥梁。对 AI 工程师而言,操作系统知识贯穿始终:多进程训练、显存管理、文件 I/O、容器隔离、分布式调度都建立在 OS 概念之上。
核心职责:
资源管理(CPU/内存/存储/设备)
+ 进程与线程调度
+ 内存分配与虚拟内存
+ 文件系统
+ 并发与同步
+ 安全与保护
2 操作系统的角色 {#2}
2.1 三种视角
| 视角 | 说明 |
|---|---|
| 资源管理器 | 分配 CPU、内存、存储、设备给程序 |
| 虚拟机 | 向上层程序提供抽象的、友好的执行环境 |
| 守护者 | 隔离进程、保护系统安全 |
2.2 内核与用户态
- 内核态(Kernel Mode):可执行特权指令,管理硬件;
- 用户态(User Mode):运行普通程序,受保护;
- 通过系统调用(syscall)从用户态进入内核态。
应用程序 ──► 系统调用 ──► 内核 ──► 硬件
3 进程与线程 {#3}
3.1 进程(Process)
进程是运行中的程序的实例,包含:
- 代码段、数据段、堆、栈;
- 程序计数器、寄存器状态;
- 文件描述符、环境变量。
进程间相互隔离(虚拟地址空间独立),通信需通过 IPC(进程间通信):管道、消息队列、共享内存、Socket。
3.2 线程(Thread)
线程是进程内的执行单元,共享进程的地址空间:
- 创建/切换开销比进程小;
- 同一进程的线程共享内存,天然便于数据共享;
- 多线程需处理并发安全(锁、原子操作)。
3.3 进程状态
新建 → 就绪 → 运行 → 阻塞
↑ │
└──────┘
- 就绪:等待 CPU;
- 运行:占用 CPU;
- 阻塞:等待 I/O 或事件。
4 CPU 调度 {#4}
4.1 调度目标
- 公平性:每个进程都有机会;
- 响应时间短(交互式);
- 吞吐量高(批处理);
- 低开销、低饥饿。
4.2 常见算法
| 算法 | 特点 |
|---|---|
| FCFS(先来先服务) | 简单,可能出现护航效应 |
| SJF(最短作业优先) | 平均等待最短,需预知运行时间 |
| 时间片轮转 (RR) | 轮流分配时间片,响应快 |
| 优先级调度 | 高优先级先执行,可能饥饿 |
| 多级反馈队列 | 综合多种策略,现代 OS 常用 |
4.3 与 AI 的关系
- 训练任务常按”大作业”批处理调度;
- GPU 集群调度器(Kubernetes/Slurm)本质上是”进程+资源”调度在集群层面的扩展(见
ai-infrastructure.md)。
5 内存管理 {#5}
5.1 虚拟内存
虚拟内存(Virtual Memory)让每个进程拥有独立的、看似连续的地址空间:
虚拟地址 → 页表 (Page Table) → 物理地址
- 分页(Paging):内存按固定大小页(如 4KB)管理;
- 页表:记录虚拟页到物理页的映射;
- TLB:页表的高速缓存,加速地址转换。
5.2 页面置换
物理内存不足时需换出页面:
- FIFO、LRU、Clock 等算法;
- 缺页(Page Fault):访问未驻留页时触发磁盘加载。
5.3 与 AI 的关系
- GPU 显存管理借鉴了分页思想(如 vLLM 的 PagedAttention);
- 大模型推理中的 KV Cache 管理本质是”内存分页”问题(见
inference-implementation.md); - 显存不足时可换出到 CPU/SSD(Offloading,见
edge-on-device.md)。
6 文件系统 {#6}
6.1 层次与抽象
文件系统把存储设备组织为目录树,屏蔽底层磁盘细节:
/ (根目录)
├── home/ 用户目录
├── etc/ 配置文件
├── var/ 日志
├── tmp/ 临时文件
└── data/ 数据集
6.2 关键概念
- inode:保存文件的元数据(权限、大小、数据块位置);
- 路径:绝对路径 / 相对路径;
- 挂载(Mount):把设备接入目录树;
- 软/硬链接:文件引用方式。
6.3 分布式文件系统
大规模训练需要跨节点共享数据:NFS、Lustre、GPFS、对象存储(S3)等(见 ai-infrastructure.md)。
7 并发与同步 {#7}
7.1 竞态条件
多个线程同时访问共享资源可能导致结果不确定,称为竞态条件(Race Condition)。
7.2 同步机制
| 机制 | 作用 |
|---|---|
| 互斥锁 (Mutex) | 保证同时只有一个线程进入临界区 |
| 信号量 (Semaphore) | 控制并发访问数量 |
| 条件变量 | 线程间等待/通知 |
| 原子操作 | 不可分割的读-改-写 |
7.3 死锁
两个或多个进程互相等待对方释放资源而永久阻塞。必要条件:互斥、占有且等待、不可抢占、循环等待。破解方法:破坏任一条件。
7.4 与 AI 的关系
- 多进程数据加载(DataLoader worker)需避免竞态;
- 分布式训练中梯度同步(AllReduce)本质是跨进程并发协调;
- 容器/多租户环境下资源竞争是常见问题。
8 Linux 与 AI 工程 {#8}
8.1 常用命令
nvidia-smi # 查看 GPU 状态
ps aux | grep python # 查看进程
top / htop # 查看 CPU/内存
df -h # 磁盘空间
free -h # 内存使用
kill -9 <pid> # 终止进程
nohup python train.py & # 后台运行
8.2 与 AI 相关的系统概念
- 虚拟内存与显存:PyTorch 的
torch.cuda显存管理、OOM 排查; - 文件系统性能:数据集放在 SSD/NVMe 以加速读取;
- 进程隔离:Docker/容器基于命名空间与 cgroup 实现隔离与资源限制;
- 环境变量:
CUDA_VISIBLE_DEVICES、PYTHONPATH等控制运行环境。
8.3 常见排查
显存不足 → nvidia-smi + 减小 batch / 用梯度累积
CPU 100% → 检查数据加载 worker 数量
磁盘满 → df -h + 清理 checkpoint
死锁 → 检查多进程共享状态与锁
9 参考文献 {#9}
[1] A. Silberschatz, P. B. Galvin, G. Gagne, Operating System Concepts, Wiley.
[2] A. S. Tanenbaum, H. Bos, Modern Operating Systems, Pearson.
[3] B. W. Kernighan, R. Pike, The UNIX Programming Environment, Prentice Hall.
[4] M. Kerrisk, The Linux Programming Interface, No Starch Press.
[5] Linux Kernel Documentation, https://www.kernel.org/doc/
留下评论