Overview


  • Q1(Why):为什么要学操作系统?
  • Q2(What):到底什么是操作系统?
  • Q3(How):怎么学操作系统?

一.为什么要学操作系统?

学习操作系统的目的

你体内的“编程力量”尚未完全觉醒

  • 每天都在用的东西,你还没搞明白
    • 窗口是怎么创建的?为什么Ctrl-C有时不能退出程序?
  • 组里的服务器有128个处理器,但你的程序却只能用一个
  • 你每天都在用的东西,你却实现不出来
    • 浏览器、编译器、IDE、游戏/外挂、任务管理器、杀毒软件、病毒…

《操作系统》给你有关“编程”的全部

  • 悟性好:学完课程就在系统方向“毕业
    • 具有编写一切“能写出来”程序的能力(具备阅读论文的能力)
  • 悟性差:内力大增
    • 可能工作中的某一天想起上课提及的内容

二.到底什么是操作系统?

Operating System: a body of software in fact, that is responsible for making it easy to run programs even allowing you to seemingly run many at the same time), allowing programs to share memory, enabling programs to interact with devices, and other fun stuff like that.(OSTEP)

  • “programs”就完了?那么多复杂的程序呢!
  • ‘’shared memory,interact with devices,…”

“管理软硬/硬件、为程序提供服务”的程序?

理解操作系统

“精准”的定义毫无意义

  • 问出正确的问题:操作系统如何从一开始变成现在这样的” />

1940s

1940s的计算机

跨时代、非凡的天才设计,但很简单(还不如我们数电实验课做的CPU复杂呢):

  • 计算机系统=状态机(CS课程的 takeaway message)
  • 标准的 Mealy型数字电路
    • ENIAC(1946.2.14;请在这个特殊的节日多陪陪你的电脑)

电子计算机的实现:

  • 逻辑门:真空电子管
  • 存储器:延迟线(delay lines)
  • 输入/输出:打孔纸带/指示灯

1940s的程序

ENIAC程序是用物理线路”hard-wire”的

  • 重编程需要重新接线
    • ENIAC Simulator;sieve.e

最早成功运行的一系列程序:打印平方数、素数表、计算弹道…

  • 大家还在和真正的“bugs”战斗

1940s的操作系统

没有操作系统

能把程序放上去就很了不起了

  • 程序直接用指令操作赢家
  • 不需要画蛇添足的程序来管理它

1950s

1950s的计算机

更快更小的逻辑门(晶体管)、更大的内存(磁芯)、丰富的I/O设备

  • I/O设备的速度已经严重低于处理器的速度,中断机制出现(1953)

1950s的程序

可以执行更复杂的任务,包括通用的计算任务

  • 希望使用计算机的人越来越多;希望调用API而不是直接访问设备
  • Fortran诞生(1957)

一行代码,一张卡片

  • 看到上面1,2…80的标号了吧
  • 7-72列才是真正的语句(这就是为什么谭浩强要教你画流程图)

1950s的操作系统

管理多个程序依次排队运行的库函数和调度器。

写程序、跑程序都是非常费事的(比如你写了个死循环.…)

  • 计算机非常贵( 50000-​1,000,000美元),一个学校只有一台
  • 产生了集中管理计算机的需求:多用户排队共享计算机

操作系统的概念开始形成

  • 操作( operate)任务jobs)的系统( system)
    • “批处理系统” = 程序的自动切换(换卡) + 库函数API
    • Disk Operating Systems(DOS)
      • 操作系统中开始出现“设备”、“文件、“任务等对象和API

1960s

1960s的计算机

集成电路、总线出现

  • 更快的处理器

  • 更快、更大的内存;虚拟存储出现

    • 可以同时载入多个程序而不用”换卡“了
  • 更丰富的I/O设备;完善的中断/异常机制

1960s的程序

更多的高级语言和编译器出现

  • COBOL(1960),APL (1962),BASIC(1965)
    • Bill Gates 和Paul Allen在1975年实现了Altair 8800上的BASIC解释器

计算机科学家们已经在今天难以想象的计算力下开发惊奇的程序

1960s的操作系统

能载入多个程序到内存且灵活调度它们的管理程序,包括程序可以调用的API。

同时将多个程序载入内存是一项巨大的能力

  • 有了进程 (process))的概念

  • 进程在执行VO时,可以将CPU让给另一个进程

    • 在多个地址空间隔离的程序之间切换

    • 虚拟存储使一个程序出bug不会 crash整个系统

操作系统中自然地增加进程管理API

既然操作系统已经可以在程序之间切换,为什么不让它们定时切换呢” />

学会写代码

写代码 = 创造有趣的东西

  • 命令行 + 浏览器就是世界
    • 我们还有sympy sage z3 rich
  • 不需要讲语言特性、设计模式…
    • 编就对了;你自然而然会需要他们的

Talk is Cheap. Show Me the Code

应用视角/操作系统设计:操作系统 = 对象 + API

  • demo小程序(X86-64为主)
  • 各类系统工具的实现( strace,gdb,)

硬件视角/操作系统实现:操作系统 = C程序

  • xv6
    • 2006年 Russ cox, Frans Kaashoek, Robert Morris在MT重写的UNIX系统
    • 大家熟悉的RISC-V版本

最重要的:Get Your Hands Dirty

参考视频