Preface

跟学南京大学2022春季学期操作系统原理公开课的笔记。从蒋老师的课程主页来看,这门课的安排是甚为合理的。我的笔记尽量完全跟上蒋老师的脚步,但是由于缺少设备和相关的FPGA知识(如果需要搭建SoC的话),关于RISC-V的实验部分可能会被省略。

为什么要学习操作系统?

不妨先思考另一个问题,为什么要学习微积分呢?

在学习微积分中被混起来的几件事:

  1. Newton时代的微积分(启蒙及其应用):

    • 现代方法:Mathematica,sympy(一个基于Python的符号计算库),sage
  2. Cauchy时代的微积分(严格化和公理化):

    • 公理化时代的问题:Welerstrass函数[1],Peano曲线[2]……
  1. 现代应用:
    • 优化、有限元计算、PID……

蒋老师的基本观点:积分的计算技巧不那么重要,应该将主要精力放在现代应用上。

话说回来,学习操作系统的目的 —— 给自己有关编程的全部:

  • 具备阅读论文的能力
  • 提升engineering的能力

怎么学习操作系统?

什么是操作系统?

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. by Operating Systems: Three Easy Pieces(OSTEP)

疑点:

  • Programs?多复杂的程序呢?
  • “shared memorus, interact with devices”…?

实际的定义是有些模糊的。目标是所谓的fun stuffs。

理解操作系统

带着正确的问题:操作系统如何从一开始变成现在这样的?

线索:

  • 计算机(硬件)
  • 程序(软件)
  • 操作系统(管理软件的软件)

操作系统的发展

历史上的计算机

1940s

跨时代、非凡的天才设计,但是很简单:

  • 计算机系统 = 状态机;
  • 标准的Mealy型数字电路;
    • 典型例子:ENIAC(1946.2.14)simulator
  • 实现:
    • 硬件:真空电子管,
    • 存储器:延迟线,
    • I/O:打孔纸带/指示灯,
    • 软件:硬连线 —— 能把程序放上去,进行数值运算就很了不起了,
  • 特点:
    • 程序直接操作硬件,

1950s

  • 实现:
    • 更快、更小的逻辑门,基于晶体管电路,
    • 更大的内存(磁芯,DRAM的雏形),
    • 丰富的I/O设备,
  • 特点:
    • 由于I/O设备的速度远低于处理器的速度,出现了中断机制(1953),
  • 操作系统开始出现:
    • 计算机系统的昂贵,多用户排队共享的需求产生,
    • “批处理系统” = 自动切换程序卡片(任务,或者说作业的概念)
    • Disk Operating System(DOS)的抽象(文件、磁盘和设备等)开始出现
  • 高级语言出现:Fortran(1957)

1960s

集成电路和总线的出现

  • 更快的处理器;
  • 更快、更大的内存,虚拟存储出现;
    • 可以同时载入多个作业程序(分时操作系统的雏形),进程(Progress)的概念出现,
    • 进程的隔离保证一个程序crash时不会破坏整体的稳定性,
    • 基于时钟的调度策略,
  • 更丰富的I/O设备,完善的中断/异常处理机制
  • 更多的高级语言:
    • COBOL(1960)
    • APL(1962)
    • Basic(1965)
  • 现代操作系统诞生:Multics(1965, MIT)

1970s+

“计算机”这个概念与今天已无太大差别:

  • 更多的高级语言:C(1972),Pascal(1970)……
  • 个人开发者(Geek Network)登上历史舞台,

分时系统走向成熟 —— Unix:

  • 1973: 信号API、管道(对象)、grep(应用)
  • 1983: BSD sockets
  • 1984:procfs…
  • Unix的衍生:
    • BSD(1977), GNU(1983), macOS(1984), Minix(1987), Linux(1991) and more…

Today

虚拟化……但是本质还是1970s的操作系统的框架。

  • 更复杂的处理器和内存;
  • 更多的设备和资源;
  • 更复杂的应用需求和应用环境。

三个根本问题

  1. 操作系统服务谁?

    • 程序 = 状态机
  2. 操作系统为程序提供什么服务?(设计/应用角度)

    • 操作系统 = 对象 + APIs
  3. 如何实现操作系统提供的服务?(实现/硬件视角)

    • 操作系统 = C程序 + 汇编程序,完成初始化后变成IRQ/Trap/Fault Handler(基本功能)。

Reference

  1. 课程主页
  2. 公开课录屏 - 哔哩哔哩
  3. OSTEP
  4. Computer Systerm: A Programmer’s Perspective(CSAPP)
  5. CS自学指南

  1. Welerstrass函数是一个处处连续但是处处不可导的函数。 ↩︎

  2. 又称为Hilbert曲线,处处连续但是处处不可导的曲线,如果选取合适的参数,它可以充满整个单位正方形。 ↩︎