🐧 Linux是怎样工作的
照着《Linux是怎样工作的》([日]武内觉 著,曹栩 译,人民邮电出版社 · 图灵程序设计丛书,2022-03,281 页)做的自学笔记 —— 前面几本回答了程序怎么跑、计算机怎么造、服务器怎么摆;这一本钻进操作系统这一层:程序在跑的时候,底下是谁在替它管 CPU、管内存、管文件、管硬盘。全书 8 章 89 篇:第 1 章先把 CPU/内存/外部存储器/输入输出四样东西和操作系统的三件事(分配、隔离、抽象)摆清楚;第 2 章讲用户模式能做的事——系统调用那道门有多贵、包装函数与 C 标准库替你挡了什么;第 3 章讲进程怎么被复制出来、怎么换掉内容、怎么结束;第 4 章 20 篇把调度器拆开:时间片、上下文切换、五种状态、吞吐量与延迟的取舍、多核为什么不能线性加速;第 5 章 17 篇讲内存:虚拟内存、页表、缺页、写时复制、Swap、多级页表、大页;第 6 章讲存储层次:缓存、TLB、页面缓存、脏页回写;第 7 章讲文件系统:元数据、日志、写时复制、一致性、各种设备与虚拟文件系统;第 8 章讲外部存储器:HDD 的寻道与旋转、顺序与随机、I/O 调度、预读、SSD 的写放大。这本是实验课:书里 198 张图解,实验程序用 C 与 Python 编写,各篇「动手 Demo」都是在沙箱里真跑过的 Python 脚本(读 /proc、量系统调用耗时、对比顺序与随机、观察内存统计),需要真 Linux 环境的实验用【📋 实操路径】单列。教材成书于 2022 年,凡与现状不同处各篇用【⚠️ 2026 现状】单列。大白话、不跳步骤、必带生活比喻、常见误区、可折叠自测题。
前置课程:程序是怎样跑起来的(程序怎么跑)、计算机是怎样跑起来的(硬件怎么搭)、服务器工作原理(服务器怎么摆)。
内容来自我的 Obsidian 自学笔记 · 全 8 章 89 篇完结 ✅
第一章 计算机系统的概要
第二章 用户模式实现的功能
系统调用
用户程序进内核的唯一通道;取进程号 15…
系统调用的包装函数
裸调用只给 -1 加 errno;包装函…
C标准库
带缓冲把一百次写并成一两次,省下的是过路…
OS提供的程序
ls/ps/shell 都是普通用户程序…
第三章 进程管理
创建进程
进程靠复制而非生产:除 1 号外都从已有…
fork()函数
一次调用两次返回:父得子进程号、子得 0…
execve()函数
只换内容不换身份:代码数据堆栈全换,进程…
结束进程
退出码是遗言(0 成功、非 0 失败)…
第四章 进程调度器
关于实验程序的设计
真系统上看到的全是噪声,只留三要素:剩余…
实验程序的实现
三十行调度器:每拍推 IO、从就绪队列挑…
实验
单进程一边算一边等,利用率只有一半多;加…
思考
三条结论:CPU 会空转、多道能填、但填…
上下文切换
明账(保存恢复寄存器、换栈、换页表)与暗…
进程的状态
五字母画像:R 在跑或想跑、S 在等、D…
状态转换
合法转换只有五条;最有用的是【阻塞→运行…
空闲状态
没活可跑时 CPU 在跑空闲进程等中断…
各种各样的状态转换
停止/恢复/白醒一场/不可中断睡眠;白醒…
吞吐量与延迟
时间片只改一个数,两个指标反着走:2 时…
现实中的系统
CFS 不预设时间片只记账,永远挑累计最…
存在多个逻辑 CPU 时的调度
互不相干的活儿 1→2→4→8 核是 8…
实验方法
time 给三行时间、perf stat…
实验结果
四个各 5 拍的活儿:20/10/5 拍…
吞吐量与延迟
四十个小活儿加核总耗时腰斩再腰斩;一个不…
思考
从加速比反推串行比例;4/8/16/32…
运行时间和执行时间
墙上时钟与 CPU 时间是两回事:纯计算…
进程睡眠
同样是等 1 秒:sleep 占 CPU…
现实中的进程
ps aux 读五件事:谁起的、什么状态…
变更优先级
两个跑不完的活儿在 100 拍里分 CP…
第五章 内存管理
内存相关的统计信息
MemFree 小是正常的(缓存占着)…
内存不足
三步顺序:回收缓存、换出到磁盘、OOM…
简单的内存分配
外部碎片:总空闲 8 单位却凑不出连续…
虚拟内存
虚拟页连号、物理页乱序;翻译时低 12…
页表
48 位切 36+12,单级要 512…
实验
五个 16 字节对象地址横跨几 MB;m…
为进程分配内存
要 256 MB 地址 0.045 毫秒…
实验
碰 128 MB 第一遍 48.9 毫秒…
利用上层进行内存分配
同样 6.1 MB,逐个要 20 万次…
解决问题
一百万次请求:直接问系统 100 万次…
虚拟内存的应用
共享内存、只读保护、文件映射、写时复制…
文件映射
mmap 省掉系统调用与一次拷贝,随机读…
请求分页
两个问题分开看:数据在不在物理内存(页缓…
写时复制
fork 只复制页表、物理页共享;100…
Swap
帧 1 缺 807 次、帧 8 缺 8…
多级页表
36 位页号 ÷ 9 位每级 = 4 级…
标准大页
大页不省内存省 TLB:随机访问 1 G…
第六章 存储层次
高速缓存
缓存能救命是因为程序有局部性;4 KB…
高速缓存不足时
缓存装不下就丢老数据;代价量级 1 纳秒…
多级缓存
L1/L2/L3 逐级变大变慢;每次访问…
关于高速缓存的实验
同一份数据、同样大小,按行访问 94.7…
访问局部性
时间局部性(刚用过还会用)与空间局部性(…
总结
缓存、TLB、页面缓存三层各管一段;每层…
转译后备缓冲区
TLB 缓存的是地址翻译结果不是数据;5…
页面缓存
读文件其实读的是内存里的副本;200 个…
同步写入
write 返回只代表进了缓存;不 fs…
缓冲区缓存
块设备那一层的缓存,与页面缓存本是两套…
读取文件的实验
16 MB 顺序读与随机 4 KB 读…
写入文件的实验
顺序写 1132 MB/秒、随机写 27…
调优参数
脏页比例、回写间隔、预读窗口、vm.sw…
总结
六层存储一次排开:寄存器到磁盘差八个数量…
超线程
一个物理核假装两个:访存型活儿多跑 10…
第七章 文件系统
Linux的文件系统
1500 个文件平铺 72.94 毫秒…
数据与元数据
1 字节文件占 8 字节、740 字节跳…
容量限制
ext4 默认块 4 KB、每 16 K…
文件系统不一致
写文件三步不是原子的;断电落在第三步中间…
日志
直接改 3.9 MB 随机写 14.1…
写时复制
改 1 MB 不覆盖、写新块改指针,旧版…
防止不了的情况
改 1 个字节,8 个块里精确查出第 3…
文件系统不一致的对策
writeback 1.0 倍但可能读到…
文件的种类
st_mode 高位说类型、低 9 位说…
字符设备
写 100 MB 进 /dev/null…
块设备
最小单位是一块不是一字节;块首与块中随机…
各种各样的文件系统
写 4 KB 只有 6 MB/秒、写 1…
基于内存的文件系统
写 20 MB:磁盘不 fsync 10…
网络文件系统
一次往返本机 0.05、同机房 0.5…
虚拟文件系统
一层查表跳转每次多 85 纳秒,而一次磁…
Btrfs
100 GB 数据 10 个快照各改 1…
第八章 外部存储器
HDD的数据读写机制
4 KB 随机读 12.69 毫秒 =…
HDD的性能特性
转速 5400 提到 15000(近三倍…
HDD的实验
先量尺子:open+close 一次 6…
实验程序
64 MB 顺序读:4 KB 108.6…
顺序访问
128 MB 顺序读:1 KB 718…
随机访问
沙箱里顺序 16.43 vs 随机 24…
通用块层
写 32 MB:4 KB 要 8192…
I/O调度器
1000 个随机请求:FIFO 走 67…
预读
1000 次请求各要 4 块、窗口 12…
实验
读 64 MB 每次 4 KB:不带缓冲…
SSD
块 256 KB = 64 页,改写 1…
总结
寄存器 1 纳秒若当 1 秒:内存 1.…