操作系统
操作系统是硬件资源的"代理",把 CPU、内存、磁盘这些稀缺资源抽象成进程、文件、套接字等易用接口。它解决的痛点有两层:安全——程序直接操作硬件会互相踩踏,两个进程同时写同一块内存,数据就乱了;效率——CPU 空闲时没人调度就白烧电,内存空着却不给需要的程序用。操作系统在硬件之上加一层抽象与管理,让每个程序以为自己独占一台机器。
提示
理解操作系统的统一视角是"资源管理":CPU 资源对应进程与线程,内存资源对应虚拟内存,存储资源对应文件系统,I/O 设备对应驱动与中断。所有机制都围绕"资源怎么分配、怎么隔离、怎么回收"展开。
内核与用户态
操作系统分两层:内核(Kernel) 是常驻内存的核心程序,拥有对硬件的全部权限;用户态 是普通程序运行的环境,权限受限。程序不能直接访问硬件,必须通过系统调用(如 read、write、fork)请求内核代劳——这是安全隔离的根基:用户程序出 Bug 最多崩自己,碰不到别的进程和硬件。
系统调用有代价:每次调用要切换特权级、保存上下文,所以"减少系统调用次数"(如 Nginx 的批量 epoll、Netty 的零拷贝)是高性能服务的常见优化方向。
中断是机制的另一半:硬件(键盘、网卡)需要 CPU 时主动打断当前程序,CPU 保存现场、执行中断处理程序、再恢复现场。没有中断,CPU 只能靠轮询等设备,白白浪费算力。
核心组成
操作系统按管理对象分为五大子系统,各自解决一类资源问题:
| 子系统 | 管理对象 | 核心机制 | 要解决的痛点 |
|---|---|---|---|
| 进程管理 | CPU 时间 | 进程与线程、调度、同步互斥 | 谁先用 CPU、多程序不互相干扰 |
| 内存管理 | 内存空间 | 虚拟内存、分页、页面置换 | 内存不够用、进程间隔离 |
| 文件系统 | 磁盘存储 | 文件组织、目录、inode | 数据断电不丢、按名存取 |
| 设备管理 | I/O 设备 | 中断、DMA、驱动 | 慢速设备不拖垮 CPU |
| 网络协议栈 | 网络接口 | 套接字、TCP/IP | 进程间跨机器通信 |
五大子系统中最贴近日常开发的是前两个:进程与线程 拆解了进程与线程的本质区别(资源分配单位 vs 调度单位)、四种调度算法和锁/信号量/条件变量三种同步手段——并发编程的底层约束都来自这里;内存管理 用具体数字走了一遍虚拟地址转换(虚拟地址 → 页表 → 物理地址),对比了 FIFO/LRU/时钟三种页面置换算法,解释了抖动与 OOM 的成因。
文件系统解决"数据断电不丢、按名存取":磁盘按块组织,文件系统的职责是把字节流映射到磁盘块,并提供目录(文件名 → inode 的映射)让用户按名存取。inode 是文件元数据的载体(权限、属主、数据块位置),硬链接是多个目录项指向同一 inode、软链接是指向路径的独立文件——具体机制在 inode与链接 有完整讲解,Linux目录结构 展示了实际系统的目录树。
实操视角
本目录收录原理层知识。操作系统在具体系统上的表现——Linux 的进程模型、内存布局、文件权限与目录结构——见 Linux 系列笔记;程序员的 I/O 视角(阻塞、非阻塞、多路复用)见 IO模型;启动流程见 Linux启动流程。
与上层的关系
操作系统是所有上层技术的隐形地基:
- JVM 是跑在操作系统上的"软件虚拟机",它自己管理内存(堆、垃圾回收),但线程的调度、文件读写最终仍要交给操作系统——JVM 的
-Xmx参数限制的是进程内堆大小,进程本身的虚拟地址空间由操作系统分配 - 数据库的 事务 依赖操作系统提供的磁盘持久化与锁原语,事务的"崩溃恢复"最终落在"操作系统保证写入不丢"的假设上
- 网络应用的性能瓶颈往往不在业务代码,而在系统调用、上下文切换和内存拷贝的开销——Netty 的零拷贝优化本质是减少这些操作系统层面的损耗
操作系统内核有一条清晰的知识主线:进程与线程(生命周期、调度、同步)→ 内存管理(虚拟内存、分页)→ 文件系统 → I/O。这条主线向下由 计算机组成原理 提供硬件支撑(中断、特权级、MMU),向上与 Java并发编程 呼应——锁、线程池最终都要映射到操作系统的原语上。
在 计算机科学 的知识地图中,操作系统位于硬件(计算机组成原理)与软件(算法、数据结构)之间:向上支撑编程语言运行时,向下管理硬件资源,是连接理论与工程的关键一层。