Post

操作系统原理课程学习记录

南京大学 2025 春季操作系统原理课程学习记录。

操作系统原理课程学习记录

课程

操作系统原理

第一节课

操作系统是软件和硬件之间的桥梁

  • 中断解决了当时的什么问题,解决的原理是什么?

    中断机制解决了早期计算机「边做饭边看锅」的低效问题。 举个例子:假设你在看书,但需要等水烧开。没有中断时,你必须不停抬头看水壶(这叫轮询),浪费时间;有了中断就相当于水烧开后,水壶会「嘀——」一声提醒你(中断信号),这时你标记书页(保存当前状态),去关火(处理中断),再回来继续看书(恢复原状态)。

    原理:外设(如键盘、硬盘)完成工作后,通过电路发送电信号(中断请求),CPU收到后暂停手头任务,快速处理这个紧急事件(如读取输入数据),处理完再无缝衔接回原来的工作。这就像多线程切换,但由硬件主动触发,效率更高。

  • 现代分时操作系统解决了当时的什么问题,解决的原理是什么?

    现代分时操作系统解决了早期计算机「一人用、全员等」的资源浪费问题。
    问题:过去计算机一次只能运行一个程序(比如先算完A的工资,再处理B的文件),其他人得排队干等。而计算机的CPU大部分时间闲着,效率极低。

    原理

    1. 时间切片:把CPU时间切成极短片段(比如0.1秒),给每个用户轮流用。
    2. 快速切换:你在打字时,后台其实在A→B→C用户间飞速轮转(像杂技演员同时抛接多个球)。
    3. 错觉并行:虽然CPU同一时间只干一件事,但切换速度太快(毫秒级),人类感觉不到卡顿,仿佛所有人同时在用计算机。

    效果

    • 你写文档时,同事能同时写代码,服务器还能处理网页请求。
    • 计算机从「独木桥」变成「立交桥」,资源利用率飙升。
  • 分时是不是和中断有点像?

    是的,分时系统和中断确实有密切关联,但解决的问题层面不同。用快递站比喻就明白了:

    相同点:都通过「快速切换」提升效率

    • 中断:就像快递员敲门(中断信号),你暂停看书(当前任务),签收包裹(处理中断),再继续看书。
    • 分时:类似快递站同时服务10个客户,每个窗口叫号处理30秒(时间片),超时就换下一个人(任务切换)。

    关键区别

    1. 触发方式
      • 中断是硬件主动打断(例如键盘输入、硬盘完成读写)。
      • 分时是软件计划调度(操作系统用时钟中断强制轮换任务)。
    2. 目标
      • 中断让CPU及时响应紧急事件(比如网络数据到达)。
      • 分时让多个用户公平共享计算资源(你感觉独占电脑,其实是轮流用碎片时间)。

书本:Operating Systems: Three Easy Pieces

第二节课

  • 计算机是状态机,是什么意思,什么是状态机?

    当前状态 + 输入事件切换到新状态

    计算机作为「状态机」的核心概念,可以用一个自动售货机来比喻:

    状态机: 想象一台自动售货机,它只有三种状态:

    1. 待机(显示“请投币”)
    2. 收钱中(显示已投金额)
    3. 出货(掉出商品,找零)

    它的运作规则是:

    • 当前状态 + 输入事件切换到新状态 例如:
    • 待机时 投币10元 → 变成「收钱中」状态,金额显示10元
    • 收钱中 按下可乐按钮 → 变成「出货」状态,掉出可乐,找零2元

    计算机同理

    1. 状态 = 所有存储数据的当前值(内存内容 + CPU寄存器值 + 硬盘数据等)
    2. 输入事件 = 执行一条指令(如计算1+1,读取键盘输入)
    3. 状态转换 = 根据指令修改存储数据,进入下一个状态
  • 程序的执行就是状态的变化是什么意思?

    程序的执行就是状态的变化,可以理解为计算机像一本不断被修改的「流水账本」。用三个关键点解释:


    1. 什么是「状态」

    状态 = 计算机此刻记住的所有信息,包括:

    • 内存中的变量(例如:账户余额 = 100元
    • CPU寄存器的临时数据(类似你心算时的草稿纸)
    • 硬盘文件内容(例如:文档从空白变成写满文字)

    2. 程序如何改变状态

    程序像一套「修改规则」,每一步操作都重写账本:

    • 初始状态a = 0b = 0
    • 执行 a = 5 → 状态变为 a = 5b = 0
    • 执行 b = a + 3 → 状态变为 a = 5b = 8
    • 最终账本记录的就是新状态。

    3. 类比现实

    想象做一道菜:

    • 初始状态:生土豆、冷锅、未开火
    • 执行削皮 → 状态:土豆去皮
    • 执行切块 → 状态:土豆变丁
    • 执行炒熟 → 状态:土豆变熟 程序执行就是一步步改变材料的「状态」,直到达成目标。

    本质: 程序运行的本质,就是通过无数微小操作(加减乘除、读写数据),让计算机从初始状态一步步「变形」到最终状态,就像多米诺骨牌连环倒下,每一帧都是新状态。

  • gdb 编程是什么编程,和普通的编程有什么不一样?

    GDB 编程并不是指「用 GDB 写代码」,而是利用调试工具 GDB 深入分析和控制程序的运行过程,更像是「程序员的显微镜和解剖刀」

  • Everything (C 程序) = 状态机,怎么理解这句话?

    状态机的核心规则

    • 确定性:相同初始状态 + 相同输入 → 必然得到相同结果。 (除非程序有随机数或外部输入干扰)
    • 顺序性:状态变化严格按代码逻辑推进,像多米诺骨牌。 (即使有多线程,本质也是多个状态机交替执行)

    为什么这个视角重要?

    • 调试:程序崩溃时,GDB调试就是查看「崩溃瞬间的状态快照」(变量值、执行位置)。
    • 并发问题:多线程竞争本质是多个状态机同时修改共享状态,导致混乱。
    • 程序验证:形式化方法通过分析所有可能状态,证明程序无漏洞。

    现实类比:棋盘游戏

    • 状态:棋盘上棋子的位置、当前玩家回合。
    • 规则:玩家移动棋子(输入)→ 棋盘状态更新。
    • C程序:代码就是游戏规则,运行时状态就是棋盘每一步的快照。

    总结: 说「C程序 = 状态机」,是指它的运行本质是:

    1. 初始状态(所有变量初始值、代码起点)
    2. 逐步变形(每执行一行代码,就像按下按钮触发状态转换)
    3. 终止状态(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寄存器
    

硬件根本不知道有没有操作系统。

固件:硬件和操作系统之间的桥梁。加载引导程序。

This post is licensed under CC BY 4.0 by the author.