操作系统原理课程学习记录
南京大学 2025 春季操作系统原理课程学习记录。
课程
第一节课
操作系统是软件和硬件之间的桥梁
-
中断解决了当时的什么问题,解决的原理是什么?
中断机制解决了早期计算机「边做饭边看锅」的低效问题。 举个例子:假设你在看书,但需要等水烧开。没有中断时,你必须不停抬头看水壶(这叫轮询),浪费时间;有了中断就相当于水烧开后,水壶会「嘀——」一声提醒你(中断信号),这时你标记书页(保存当前状态),去关火(处理中断),再回来继续看书(恢复原状态)。
原理:外设(如键盘、硬盘)完成工作后,通过电路发送电信号(中断请求),CPU收到后暂停手头任务,快速处理这个紧急事件(如读取输入数据),处理完再无缝衔接回原来的工作。这就像多线程切换,但由硬件主动触发,效率更高。
-
现代分时操作系统解决了当时的什么问题,解决的原理是什么?
现代分时操作系统解决了早期计算机「一人用、全员等」的资源浪费问题。
问题:过去计算机一次只能运行一个程序(比如先算完A的工资,再处理B的文件),其他人得排队干等。而计算机的CPU大部分时间闲着,效率极低。原理:
- 时间切片:把CPU时间切成极短片段(比如0.1秒),给每个用户轮流用。
- 快速切换:你在打字时,后台其实在A→B→C用户间飞速轮转(像杂技演员同时抛接多个球)。
- 错觉并行:虽然CPU同一时间只干一件事,但切换速度太快(毫秒级),人类感觉不到卡顿,仿佛所有人同时在用计算机。
效果:
- 你写文档时,同事能同时写代码,服务器还能处理网页请求。
- 计算机从「独木桥」变成「立交桥」,资源利用率飙升。
-
分时是不是和中断有点像?
是的,分时系统和中断确实有密切关联,但解决的问题层面不同。用快递站比喻就明白了:
相同点:都通过「快速切换」提升效率
- 中断:就像快递员敲门(中断信号),你暂停看书(当前任务),签收包裹(处理中断),再继续看书。
- 分时:类似快递站同时服务10个客户,每个窗口叫号处理30秒(时间片),超时就换下一个人(任务切换)。
关键区别:
- 触发方式:
- 中断是硬件主动打断(例如键盘输入、硬盘完成读写)。
- 分时是软件计划调度(操作系统用时钟中断强制轮换任务)。
- 目标:
- 中断让CPU及时响应紧急事件(比如网络数据到达)。
- 分时让多个用户公平共享计算资源(你感觉独占电脑,其实是轮流用碎片时间)。
书本:Operating Systems: Three Easy Pieces
第二节课
-
计算机是状态机,是什么意思,什么是状态机?
当前状态 + 输入事件 → 切换到新状态
计算机作为「状态机」的核心概念,可以用一个自动售货机来比喻:
状态机: 想象一台自动售货机,它只有三种状态:
- 待机(显示“请投币”)
- 收钱中(显示已投金额)
- 出货(掉出商品,找零)
它的运作规则是:
- 当前状态 + 输入事件 → 切换到新状态 例如:
- 待机时 投币10元 → 变成「收钱中」状态,金额显示10元
- 收钱中 按下可乐按钮 → 变成「出货」状态,掉出可乐,找零2元
计算机同理:
- 状态 = 所有存储数据的当前值(内存内容 + CPU寄存器值 + 硬盘数据等)
- 输入事件 = 执行一条指令(如计算1+1,读取键盘输入)
- 状态转换 = 根据指令修改存储数据,进入下一个状态
-
程序的执行就是状态的变化是什么意思?
程序的执行就是状态的变化,可以理解为计算机像一本不断被修改的「流水账本」。用三个关键点解释:
1. 什么是「状态」
状态 = 计算机此刻记住的所有信息,包括:
- 内存中的变量(例如:
账户余额 = 100元) - CPU寄存器的临时数据(类似你心算时的草稿纸)
- 硬盘文件内容(例如:文档从空白变成写满文字)
2. 程序如何改变状态
程序像一套「修改规则」,每一步操作都重写账本:
- 初始状态:
a = 0,b = 0 - 执行
a = 5→ 状态变为a = 5,b = 0 - 执行
b = a + 3→ 状态变为a = 5,b = 8 - 最终账本记录的就是新状态。
3. 类比现实
想象做一道菜:
- 初始状态:生土豆、冷锅、未开火
- 执行削皮 → 状态:土豆去皮
- 执行切块 → 状态:土豆变丁
- 执行炒熟 → 状态:土豆变熟 程序执行就是一步步改变材料的「状态」,直到达成目标。
本质: 程序运行的本质,就是通过无数微小操作(加减乘除、读写数据),让计算机从初始状态一步步「变形」到最终状态,就像多米诺骨牌连环倒下,每一帧都是新状态。
- 内存中的变量(例如:
-
gdb 编程是什么编程,和普通的编程有什么不一样?
GDB 编程并不是指「用 GDB 写代码」,而是利用调试工具 GDB 深入分析和控制程序的运行过程,更像是「程序员的显微镜和解剖刀」
-
Everything (C 程序) = 状态机,怎么理解这句话?
状态机的核心规则
- 确定性:相同初始状态 + 相同输入 → 必然得到相同结果。 (除非程序有随机数或外部输入干扰)
- 顺序性:状态变化严格按代码逻辑推进,像多米诺骨牌。 (即使有多线程,本质也是多个状态机交替执行)
为什么这个视角重要?
- 调试:程序崩溃时,GDB调试就是查看「崩溃瞬间的状态快照」(变量值、执行位置)。
- 并发问题:多线程竞争本质是多个状态机同时修改共享状态,导致混乱。
- 程序验证:形式化方法通过分析所有可能状态,证明程序无漏洞。
现实类比:棋盘游戏
- 状态:棋盘上棋子的位置、当前玩家回合。
- 规则:玩家移动棋子(输入)→ 棋盘状态更新。
- C程序:代码就是游戏规则,运行时状态就是棋盘每一步的快照。
总结: 说「C程序 = 状态机」,是指它的运行本质是:
- 初始状态(所有变量初始值、代码起点)
- 逐步变形(每执行一行代码,就像按下按钮触发状态转换)
- 终止状态(return的值、输出结果)
这种视角让程序行为变得可预测、可分解
-
C 代码总是可以改写成等价的 “SimpleC”,是什么意思?
核心思想是:无论多复杂的语法糖或抽象机制,最终都可拆解为顺序、分支、循环和基础运算的组合。这类似于将乐高复杂模型拆解为基本积木块,虽然外观不同,但底层结构等价。这一原理是编译器设计、程序分析和形式化验证的理论基石。
进程:操作系统上的程序。
应用程序 = 计算 + 操作系统 API
strace (system call trace) 是一个非常重要的命令行工具,帮助我们 “观测” 应用程序和操作系统的边界。实际上,任何程序的执行就是状态机在计算机上的运行,因此 “用合适的方式观测状态机执行” 就是我们理解程序的根本方法。调试器、trace、profiler 提供了不同侧面的理解手段,这三个工具将会在课程中反复出现。
strace 的使用,实操?
第三课
-
二进制指令序列是什么?
高级语言(如Python) → 汇编语言 → 二进制指令 → 晶体管开关动作 。
条典型指令由 操作码(opcode)+操作数(operand) 构成
例子:
1
MOV AL, 0x05 ← 汇编表示
对应的二进制编码:
1 2 3 4
TEXT10110000 00000101 └┬─┘ └────┬───┘ │ └── 8位立即数操作数(5) └── 1字节操作码(B0h):将立即数加载到AL寄存器
硬件根本不知道有没有操作系统。
固件:硬件和操作系统之间的桥梁。加载引导程序。