- 文档
- 教程
- 知识库
【免费下载链接】CS-Base
图解计算机网络、操作系统、计算机组成、数据库,共 1000 张图 + 50 万字,破除晦涩难懂的计算机基础知识,让天下没有难懂的八股文!🚀 在线阅读:https://xiaolincoding.com
导读
操作系统常被称为计算机世界的「Super Man」——它默默为程序完成了大量精妙工作,以至于我们几乎察觉不到它的存在。本指南基于 CS-Base 仓库《图解系统》的 学习心得章节,为你梳理一套经过验证的操作系统学习路线:先掌握内存管理 → 进程管理 → 文件系统管理 → 输入输出设备管理四大模块的主线,再深入调度算法、上下文切换、页缓存等核心高地,最后配合经典视频与书籍完成从入门到深化的闭环。读完本文,你将建立起可落地的学习计划,并能借助仓库内 16W 字 + 400 张图的图解章节逐一攻克每个知识点。
为什么操作系统值得认真学?
操作系统为了我们做了非常厉害的事情,正是因为它的存在,我们才能在多任务环境下安心地写代码、跑程序,而无需关心 CPU 如何切换进程、内存如何分配回收、文件如何落盘。通过学习操作系统,不仅能深刻体会到计算机科学家设计思想的精妙,很多思想(如缓存、分层、调度、隔离)还可以直接迁移到日常开发工作中。
CS-Base 仓库的《图解系统》正是围绕这一目标展开的:根据 os/README.md,整个系列共有16W 字 + 400 张图,系统图解了操作系统的进程管理、内存管理、文件系统、设备管理、网络系统五大结构,其中进程管理和网络系统篇幅最多。它既适合小白入门,也可以作为面试突击手册——操作系统是面试的高频考点,而这份图解系列把「厚厚的书」拆解成一张张图、一个个直击重点的章节。
学习主线:四大模块与推荐学习顺序
学操作系统,最重要的不是盲目翻书,而是按模块有主次地推进。原文档明确推荐的学习顺序是:
- 内存管理—— 最重要、最难,也和其他模块关联性最大的模块,先把它搞定,后续模块会轻松很多;
- 进程管理—— 承接内存管理的地址空间概念,理解进程、线程与调度;
- 文件系统管理—— 理解数据如何持久化、如何组织与索引;
- 输入输出设备管理—— 理解设备中断、驱动与 I/O 的底层协作。
这一顺序在仓库目录结构中也能得到印证:os/3_memory/ 排在 os/4_process/、os/6_file_system/、os/7_device/ 之前,且内存管理章节既讲解虚拟内存的来历(为什么要有虚拟内存?),又延伸到 malloc 分配(malloc 是如何分配内存的?)与内存回收(内存满了,会发生什么?)。
内存管理:一切的地基
内存管理是理解整个操作系统工作的起点。核心问题是:为什么要有虚拟内存?单片机时代 CPU 直接操作物理地址,两个程序同时运行会互相覆盖数据而立刻崩溃。操作系统的解法是为每个进程分配独立的一套「虚拟地址」,并通过 CPU 芯片中的内存管理单元(MMU)完成虚拟地址到物理地址的映射(详见 为什么要有虚拟内存?)。
映射关系有两种经典方案:
- 内存分段:按程序的逻辑分段(代码段、数据段、栈段、堆段)分离,但会产生外部内存碎片,且内存交换时需要整段写入磁盘,效率低;
- 内存分页:把虚拟和物理内存空间切成固定大小的页(Linux 下每页
4KB),通过页表映射,解决了外部碎片问题,同时交换时只需换出少数几个页,效率高。
分页方案进一步衍生出两个必须掌握的子主题:
- 多级页表:单级页表在 32 位环境下每个进程需要约
4MB内存存页表,100 个进程就是400MB。利用局部性原理,二级分页在只有 20% 页表项被用到时,页表占用可压缩到约0.804MB;64 位系统则演化为 PGD/PUD/PMD/PTE 四级分页; - TLB(转址旁路缓存):多级页表换来空间节约,却增加了地址转换的时间开销。于是 CPU 芯片中加入 TLB 缓存最常访问的页表项,CPU 寻址先查 TLB,命中率极高。
进程管理:调度与切换的艺术
进程是运行中的程序,是资源分配的单位;线程是进程内的一条执行流程,是CPU 调度的单位(详见 进程、线程基础知识)。学习本模块时重点理解:
- 进程状态机:运行、就绪、阻塞三基本状态,加上创建、结束,以及换出到外存后的挂起状态,构成完整的七态变迁;
- PCB(进程控制块):进程存在的唯一标识,通过链表把相同状态的进程组织成就绪队列、阻塞队列;
- 上下文切换:进程切换发生在内核态,既要切换用户空间资源(虚拟内存、栈、全局变量),又要切换内核空间资源(内核堆栈、寄存器),开销大;而同一进程内的线程切换无需切换虚拟内存(详见下文专门小节)。
文件系统管理:一切皆文件
文件系统负责把用户的文件持久化到磁盘。Linux 最经典的一句话是「一切皆文件」——普通文件、目录、块设备、管道、socket 都统一交给文件系统管理(详见 文件系统全家桶)。核心概念有三个:
- 索引节点(inode):记录文件元信息(inode 编号、大小、权限、时间戳、数据在磁盘的位置),是文件的唯一标识,存储于磁盘;
- 目录项(dentry):记录文件名与索引节点指针,由内核维护、缓存在内存,一个文件可有多个别名(硬链接);
- 逻辑块:磁盘读写最小单位是
512B的扇区,文件系统把多个扇区组成4KB的逻辑块,提高读写效率。
输入输出设备管理:中断驱动的世界
以 键盘敲入 A 字母时,操作系统期间发生了什么? 为例,I/O 设备管理贯穿「硬件中断 → 内核中断处理 → 驱动 → 用户态响应」的完整链路,是理解软中断(参考 什么是软中断?)与设备驱动协作的绝佳入口。
一个贯穿始终的核心理念:虚拟 = 向下屏蔽差异,向上提供统一
学习过程中会遇到很多「虚拟」概念,如虚拟内存、虚拟文件系统。它们的本质是一样的:向下屏蔽差异,向上提供统一的东西,以方便程序员使用。
以仓库中的两个典型章节为例:
- 虚拟内存:屏蔽了物理内存碎片化、进程间地址冲突等差异,向上为每个进程提供统一、连续、独立的 4GB(32 位)地址空间,程序员只关心自己的虚拟地址即可(为什么要有虚拟内存?);
- 虚拟文件系统(VFS):文件系统种类众多(磁盘文件系统 Ext2/3/4、XFS,内存文件系统
/proc、/sys,网络文件系统 NFS、SMB 等),操作系统在用户层与文件系统层之间引入 VFS 中间层,定义统一的数据结构和标准接口,程序员无需了解底层文件系统原理(文件系统全家桶)。
理解这一点后,再遇到任何「虚拟 XX」,都可以先问:它屏蔽了什么差异?向上提供了什么统一接口?这能帮你快速抓住本质。
值得深挖的三大知识高地
原文档特别强调,学习过程中应重视三个「现象级」知识点背后的设计动机,仓库中均有对应图解章节展开。
1. 调度算法:数据结构与算法的魅力
操作系统里到处是调度算法,重要的是理解「因为什么问题而引入新算法」的演进过程(详见 进程调度/页面置换/磁盘调度算法):
- 进程调度(CPU 调度):从先来先服务(FCFS,对长作业有利、不适合 I/O 繁忙型)、最短作业优先(SJF,易致长作业饥饿)、高响应比优先(HRRN,用「响应比 = (等待时间 + 要求服务时间) / 要求服务时间」权衡长短作业),到时间片轮转(RR,时间片通常
20ms~50ms为合理折中)、最高优先级(HPF)、多级反馈队列(综合 RR 与 HPF,多级队列 + 优先级越高时间片越短 + 新进程反馈抢占); - 页面置换:从最佳置换(OPT,用「未来」评判,只作衡量基准,实际无法实现)、先进先出(FIFO)、最近最久未使用(LRU,用「历史」近似未来,但维护全链表开销大)、时钟算法(Clock,环形链表 + 访问位,兼顾效果与实现成本)、最不常用(LFU,访问计数器 + 定期衰减解决只重频率不重时间的问题);
- 磁盘调度:寻道时间是磁盘访问最耗时的部分。以磁道序列
98, 183, 37, 122, 14, 124, 65, 67、初始磁头在 53 磁道为例:FCFS 移动640磁道,最短寻道时间优先(SSF)移动236磁道但可能产生饥饿,扫描算法(SCAN,电梯算法)单向移动消除饥饿但中间磁道响应偏多,循环扫描(C-SCAN)只响应单方向请求使各磁道响应频率更平均,LOOK/C-LOOK 则优化为「只移动到最远请求位置即反向」而不必扫到磁盘边缘。
2. 进程与线程上下文切换:为什么线程更快
原文档指出进程与线程最大的区别在于上下文切换过程中,线程不用切换虚拟内存——因为同一进程内的线程共享虚拟内存空间,就单这一点,线程切换的性能开销就比进程减少了很多。
其底层原因(结合 为什么要有虚拟内存? 的 TLB 小节)是:虚拟内存与物理内存的映射关系需要查询页表,而页表查询很慢,因此常用地址映射关系会缓存在TLB中。一旦发生进程切换,TLB 缓存的地址映射关系就会失效,命中率降低,虚拟地址转物理地址的过程变慢。而同一进程内线程切换共享同一页表,TLB 无需失效重建。详细对比见 进程、线程基础知识 的「线程的上下文切换」小节。
3. 磁盘高速缓冲区:read/write 并非直接写盘
学完操作系统,你不会再傻傻地认为read/write之后数据就直接写到硬盘了,也不会觉得多次read/write性能很低——因为操作系统有「磁盘高速缓冲区」替我们做了缓存工作:预读数据、缓存最近访问的数据、用 I/O 调度算法合并和排队磁盘调度 I/O,这一切都是为了减少操作系统对磁盘的访问频率。仓库中 进程写文件时,进程发生了崩溃,已写入的数据会丢失吗? 一文专门剖析了页缓存(Page Cache)的行为与写入路径,是理解该机制的最佳入口。
一个常见误区:操作系统 ≠ Linux
初学操作系统时容易犯的错误是把「操作系统」等同于「Linux」。需要明确:操作系统课程讲的是集合大多数操作系统实现的思想,与具体实现的 Linux 操作系统多少会有差别。
仓库中 Linux 内核 vs Windows 内核 一文正是这种「思想 vs 实现」差异的典型例子:Windows 内核偏向宏内核与图形化、按版本机制管理内核,Linux 内核则是宏内核 + 模块化、一切皆文件、按内核版本迭代。建议的学习策略是:先掌握操作系统的基本知识(思想层),再选择 Linux 内核相关资料看具体实现(实现层),这样学起来才能事半功倍。
入门系列:视频 + 书籍双轨并行
对于没学过操作系统的小白,原文档的建议是:不要直接闷头看书,很容易几分钟就放弃。推荐的入门方式是视频与书籍结合:
- 视频:《操作系统-清华大学》,由清华大学向勇、陈渝老师授课,授课顺序恰好就是「内存管理 → 进程管理 → 文件系统管理 → 输入输出设备管理」,可在 B 站搜索该课程(标题含「操作系统」与「清华大学」关键词即可定位);它的讲解比较精炼,适合快速建立整体框架;
- 书籍搭配:《现代操作系统》,看完视频对应章节后,再读该书对应章节,视频 + 书本交叉印证,比直接啃书效果好得多;
- 进阶视频:《操作系统-哈工大》,李治军老师授课,讲解更细节,会从Linux 内核代码角度带你进一步理解操作系统,并善用生活小例子帮助理解,可在 B 站搜索同名课程。
深入学习系列:从 What 走向 How
入门之后,如果你觉得《现代操作系统》说得比较笼统,原文档推荐两本更深入的读物:
- 《操作系统导论》:这本书不仅告诉你 What,还会告诉你How,内容循序渐进、层层递进,尤其内存管理和并发两个部分讲得很好。中文版本较难找到,微信读书可免费阅读;
- 《深入理解计算机系统》(CSAPP):严格来说不算操作系统书,而是以程序员视角理解计算机系统的综合性读物,涉及操作系统、计算机组成、C 语言、汇编语言等知识。豆瓣评分高达 9.8 分,它不把某个话题挖得过深过细,而是讲清楚原理,帮助读者建立对计算机系统各组件工作方式的理性认识,锻炼一种「计算思维」。
这两本书与仓库内容的配合方式:读到虚拟内存时,配合 深入理解 Linux 虚拟内存管理 与仓库内存章节;读到并发时,配合 多线程冲突了怎么办?、怎么避免死锁?、什么是悲观锁、乐观锁? 等图解章节;读到 I/O 与网络时,配合 什么是零拷贝?、I/O 多路复用:select/poll/epoll、高性能网络模式:Reactor 和 Proactor 完成「理论 → 实战」的衔接。
学习方法总结
把原文档的经验浓缩成四条行动准则:
- 按模块顺序推进:内存管理 → 进程管理 → 文件系统管理 → 输入输出设备管理,先啃最难也最核心的内存管理;
- 抓住「虚拟」的本质:凡是「虚拟」概念,都理解成「向下屏蔽差异、向上提供统一」,用这个思维模型套用虚拟内存、VFS 等所有场景;
- 关注「为什么」而非只记「是什么」:调度算法层出不穷,重点在于理解每个算法因何问题而诞生、又带来了什么新问题,这个演进过程才是学习的核心价值;
- 思想与实现分离:先学操作系统通用思想,再按需深入 Linux 内核实现,配合图解章节 + 入门视频 + 经典书籍三管齐下。
剩下更多的精妙设计(中断、锁、网络协议栈、内存回收……)就交给你在学习途中去探索和发现,CS-Base 仓库的图解系列会一路相随。
- 文档
- 教程
- 知识库
【免费下载链接】CS-Base
图解计算机网络、操作系统、计算机组成、数据库,共 1000 张图 + 50 万字,破除晦涩难懂的计算机基础知识,让天下没有难懂的八股文!🚀 在线阅读:https://xiaolincoding.com
相关推荐
CS-Base 图解计算机基础:数据结构与算法、计组、操作系统、网络、MySQL、Redis 的系统学习路线
CS Base 图解计算机基础:数据结构与算法、计组、操作系统、网络、MySQL、Redis 的系统学习路线 本文是 CS Base(小林 x 图解计算机基础)
文档教程知识库Vue Prism Editor核心功能解析:语法高亮与行号显示实现原理
Vue Prism Editor核心功能解析:语法高亮与行号显示实现原理 Vue Prism Editor是一个轻量级的代码编辑器组件,专门为Vue.js应用设
图解系统:死锁的四个必要条件、代码复现与 pstack/gdb 排查实战(CS-Base 操作系统进程篇)
图解系统:死锁的四个必要条件、代码复现与 pstack/gdb 排查实战(CS Base 操作系统进程篇) 本文是 CS Base《图解系统》进程管理章节的技术
文档教程知识库
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考