操作系统
计算机科学的基石,也是理解一切上层技术的前提。
很多人学操作系统是为了面试,但学进去之后会发现:为什么 Java 的线程创建需要调用 OS 的线程?为什么 Redis 能用单线程支撑几十万的 QPS?为什么 NIO 比传统 I/O 高效?这些问题的答案,都藏在操作系统里。
操作系统的本质是资源管理——管理 CPU、内存、磁盘、网络这些硬件资源,为上层应用提供统一、便捷、安全的接口。理解了这套机制,你就理解了整个计算机系统的运转逻辑。
这篇文章系列覆盖进程与线程、内存管理(虚拟内存、分页、分段)、文件系统、I/O 模型、进程间通信、同步与锁、操作系统调度,以及 Linux 常用命令与实践,帮你从「会用」到「懂原理」的跨越。
模块速览
操作系统的知识体系可以分为四个核心模块,每个模块都深刻影响着上层技术的表现。
| 方向 | 核心内容 |
|---|---|
| 进程与线程 | 进程 vs 线程、进程状态转换、进程间通信(IPC)、线程同步 |
| 内存管理 | 虚拟内存、分页/分段、页面置换算法(LRU/FIFO/Clock)、内存碎片 |
| I/O 与文件系统 | 阻塞/非阻塞/异步 I/O、零拷贝、Direct I/O、文件系统(inode/ext4) |
| Linux 实践 | 进程查看(top/ps)、内存分析(free/vmstat)、I/O 分析(iostat/iotop) |
学习路径建议
第一阶段:进程与线程(1 周)
→ 进程与线程的本质区别:什么是资源分配单位 vs 执行单位
→ 进程状态转换:新建、就绪、运行、阻塞、终止
→ 进程间通信:管道、消息队列、共享内存、信号量、Socket
→ 线程同步:互斥锁、读写锁、条件变量、信号量
→ 经典问题:哲学家就餐、生产者消费者、死锁的必要条件与处理
第二阶段:内存管理(1 周)
→ 虚拟内存:为什么需要虚拟内存?地址翻译过程
→ 分页机制:页表结构、多级页表、快表(TLB)
→ 页面置换算法:LRU 的实现(双向链表 + HashMap)、LFU、Clock 算法
→ 内存碎片:内碎片 vs 外碎片、伙伴系统
→ 常见面试题:JVM 为什么要分代回收?操作系统如何管理堆内存?
第三阶段:I/O 与文件系统(1 周)
→ 五种 I/O 模型:阻塞 I/O、非阻塞 I/O、I/O 多路复用、信号驱动 I/O、异步 I/O
→ epoll 的原理:红黑树 vs 就绪链表 vs 回调机制
→ 零拷贝:mmap + write、sendfile、DMA 辅助拷贝
→ 文件系统:inode 结构、目录项、硬链接与软链接
→ 磁盘调度算法:FCFS、SCAN、C-SCAN、LOOK
第四阶段:Linux 性能分析(1 周)
→ 进程管理:ps、top、htop、pidstat 的用法
→ 内存分析:free、vmstat、pmap、cgroup 内存限制
→ I/O 分析:iostat、iotop、strace、lsof
→ 网络分析:netstat、ss、tcpdump、wireshark
→ 实战:模拟一次 CPU 飙升的排查全过程几个绕不开的经典问题
问题一:进程和线程的本质区别是什么?
这个问题看似简单,但能答出深度的人不多。
从资源角度:进程是资源分配的基本单位,拥有独立的地址空间(代码段、数据段、堆、栈);线程是 CPU 调度的基本单位,同一进程的线程共享地址空间。
从开销角度:创建/切换进程需要切换页表、刷新 TLB、切换内核态栈;线程切换只需切换寄存器和栈,开销远小于进程。
从通信角度:进程间通信(IPC)需要借助操作系统提供的机制(管道、消息队列、共享内存、Socket);同一进程的线程天然共享内存,通信更简单,但也更容易出错(需要加锁)。
问题二:为什么 Redis 用单线程还能那么快?
这个问题考的是对 I/O 模型的深刻理解。
Redis 所谓的「单线程」指的是网络 I/O 和命令执行是单线程的,而不是整个 Redis 是单线程的(后台有持久化、过期删除等线程)。
Redis 快的原因在于:
- 基于内存:内存操作本身极快
- 单线程避免了锁竞争:没有锁的开销,也没有线程切换的开销
- I/O 多路复用:用 epoll 监听大量连接,收到请求后才处理
- 高效的数据结构:Redis 内部使用动态字符串(SDS)、压缩列表、跳表等经过优化的数据结构
面试的核心逻辑
操作系统面试,核心考察三个层次:
第一层:概念清晰。 进程和线程的区别?虚拟内存解决了什么问题?什么是死锁?
第二层:原理理解。 页面置换算法 LRU 是怎么实现的?epoll 的底层数据结构是什么?上下文切换做了什么?
第三层:联系实际。 线上服务器内存不足怎么排查?Redis 为什么用单线程?JVM 的 GC 和 OS 的内存管理有什么关系?
"操作系统的面试,最怕的是『只背结论,不讲原理』。能说出分页机制为什么能解决内存碎片的问题,比单纯说『分页是把内存分成固定大小的块』高出一个层次。"
