操作系统01 导引
2022-07-03 15:10:51

写在前面

本科期间最期待的一门课, 就这么结束了有些可惜, 决心回头看看slides, 结合交大的教材再看看有没有什么可以新发掘一下的点.

现在看来是因为拔尖班的实操课程实在太少, 这门课承担了太多夯实写代码能力的责任...

什么是操作系统

本质是一个程序, 只不过这个程序需要

  1. 向上提供抽象的接口以供用户程序使用硬件
  2. 向下隐藏硬件的细节
  3. 管理任务 分配资源

显然操作系统并非一开始就存在, 它的形态和功能都是随着软硬件发展和需求发生变化的.

什么是程序

程序描述了一个运行时的状态机, 我们说操作系统管理程序的含义就是管理这些状态机(的状态)

为什么需要操作系统

希望有一个特殊的程序来执行"脏活", 把纯粹的计算留给普通程序, 产生副作用的操作交由这个特殊程序来完成.

如果知道 IO monad 的话, 大致可以想象成操作系统是若干个 IO(State), 所有的纯计算都是 monad, 而只有操作系统可以对带来副作用的部分求值.

类似的还有安全方面的考虑, 所有需要获取高特权级的操作都必须经由操作系统之手.

什么是编译

两个程序等价当且仅当它们所有的 observable behaviour 一致. 又因为纯粹的计算无法产生副作用(因而无法被观测到结果), 因此编译的等价性需要依靠产生副作用的那些指令来定义.

对!就是syscall. 一个极端的例子是

for (int i = 0; i < 1000; ++ i) {
  int g = 0;
}

这段代码与nop无异.

strace

要会用strace看syscall trace(程序的 observable behaviour)