The Three Steps

  • Virtualization: 虚拟化
  • Concurrency: 并发
  • Persistence: 持久化

虚拟化

操作系统是一类软件, 负责让程序运行变得容易, 允许程序共享内存, 让程序能与设备交互等等, 负责确保系统易于使用且高效运行.

操作系统为了完成这一点, 利用虚拟化的通用技术, 将物理资源(如 CPU, RAM, Disk)转化为更通用, 易用, 强大的虚拟模式. 因此我们有时候将操作系统称为虚拟机.

为了用户可以与操作系统交互, 利用其功能, 操作系统还提供了一系列接口(系统调用). 因此我们说操作系统为应用程序提供了一个标准库, 来访问硬件, 进行相关操作.

最后, 操作系统可以通过虚拟化来让多程序运行, 访问自己的指令与数据(共享内存), 访问设备(共享磁盘). 由操作系统管理调度系统的资源(包括 CPU, RAM, Disk). 因此操作系统也被称为资源管理器.

虚拟化 CPU

在硬件的帮助下, 操作系统负责提供系统拥有非常多虚拟 CPU 的假象. 将单个 CPU 转换为看似无穷数量的 CPU, 从而让许多个程序看似同时运行.

同时, 操作系统也有一些策略管理同时想要运行的程序如何运行的 policy. 体现了其资源管理器的功能.

虚拟化内存

每个进程访问自己私有虚拟地址空间(Virual address space), 操作系统以某种方式映射到极其的物理内存上.

并发

持久性

在系统内存中, 数据以易失(volatile)的方式存储, 因此需要软硬件持久地存储数据.

操作系统中管理磁盘的软件称为文件系统(file system). 负责将用户创建的任何文件存储在系统的磁盘上.

与上面操作系统为 CPU 和内存提供的虚拟化抽象相反(为了让他们感觉自己拥有一切, 相互隔离且防止干扰), 操作系统假设用户经常需要共享文件中的信息. 例如本文档是我在我的 Arch 上用 Doom Emacs 写成的, 随后我要用 Git 来上传到 Github 来部署.

又例如, 用 C 语言来创建并写一个文件, 要对操作系统发起三个调用:

  • open(): 打开并创建文件
  • write(): 将一些数据写入文件
  • close(): 关闭文件, 表明不会再写入更多内容
    这类系统调用转到操作系统中被称为文件系统的部分, 系统处理这些请求(确定新内容驻留在磁盘哪个位置, 随后在文件系统维护的各种结构中记录. 这需要像底层存储设备发出 I/O 请求). 操作系统提供了这种访问设备的简单方法, 因此如前所述, 操作系统被视为标准库

除此之外, 文件系统为了性能和防止崩溃都会有复杂的协议等.

设计目标

操作系统实际上就是: 取得 CPU, RAM, Disk 等物理资源, 对其虚拟化, 处理并发问题, 持久地存储文件, 保证其长期安全.

所以操作系统的设计目标有:

  • 建立抽象, 使得系统方便而易用
  • 提供高性能, 最小化操作系统的开销
  • 在 OS 以及应用程序间提供保护, 防止一个程序的不良行为损害其他程序, 也就是隔离
  • 提供高度可靠性

历史

Note

我认为对于操作系统这样庞杂的系统, 把握其发展脉络, 了解其是如何发展出一个个功能的, 最初是为了解决什么问题的, 做出了怎样的设计与取舍, 方才能更好地理解操作系统本身. 因此历史是格外重要的, 而不能扎进浩如烟海的细节中, 而不知其所以然.

早期

批处理, 先把任务准备好, 由操作员分批运行. 这时候的操作系统只是一组常用函数库, 处理低级 I/O.

超越库

由过程调用到系统调用, 添加特殊硬件指令与状态, 让操作系统更受控, 系统调用会把控制权转移给 OS, 同时提升硬件特权级别.

用户程序以用户模式运行, 限制其功能, 通常禁止其直接操纵硬件, 而是在系统调用后触发陷阱指令, 将控制转移到操作系统, 将特权提升至内核模式.
此状态下, 操作系统可以完全访问系统硬件, 进行 I/O 等, 等请求完成后回到刚刚离开的地方, 把控制权返回给应用程序, 回到用户模式.

也就是: 在以前, 任何程序都可以调用库函数, 因此都有对硬件的完整访问权限, 风险巨大. 这时候起, 任何应用程序想要访问硬件都需要陷入内核, 把控制权交给内核, 由操作系统代劳.

多道程序时代

操作系统将大量作业加载到内存并且快速切换, 提升 CPU 利用率. 要支持多道程序重叠运行, 内存保护和并发问题的解决尤为重要了.

UNIX 系统就是此时诞生的. (还有紧密相关的 BSD, 深陷官司后, Linus Torvalds 开发的 Linux(又见本站 [UNIX, FOSS and Linux]))

现代

PC 普及, 经过一开始的混乱, 吸取小型计算机操作系统的经验, 出现了现代的操作系统和内核 macOS, Window NT等