Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

没有操作系统的程序

复习

  • 程序在内存里的样子:代码区、数据区、栈和堆的初步全景
  • 从源代码到可执行文件:编译、汇编和链接的完整流水线
  • 编译与解释:程序变成机器指令的两条基本道路

TL;DR

  • 早期计算机没有操作系统,程序直接跑在裸机上
  • 裸机程序得自己解决:从哪里开始执行、怎样使用设备、多个程序怎样共存
  • 设备五花八门,每个程序都要自己写控制硬件的代码,换设备就得重写
  • 正是这些麻烦,一点点催生了操作系统

正文

  一路写到这里,程序已经能从文字变成可执行文件了。可我们一直享受着一样东西,却从没提过它的名字—— 操作系统

  这一章,我们故意把它拿掉,看看“裸机”上的日子有多难过。看清了这些麻烦,也就看清了操作系统是来干什么的。

麻烦一:谁来装载

  一个可执行文件静静躺在硬盘上。先问几个最基本的问题:

  • CPU 通电后,第一件事从哪个地址开始执行?
  • 谁把程序从硬盘搬进内存?
  • 程序里写着“跳到某个地址”,可它被放到内存的哪个位置,是谁定的?

  现实中的 CPU 有一个约定:上电后从某个固定地址取第一条指令。至于之后怎么一步步找到操作系统、找到你的程序,需要一整套安排。在“第一次呼吸”里,我们是手动把程序摆进地址 0 的——现实不可能每次都靠人手动摆。

麻烦二:怎么用设备

  程序想从键盘读一个键,或者往屏幕打个字,怎么办?

  它还是一条条指令,可键盘、屏幕、硬盘这些设备,各有各的控制方式:往哪个端口写什么、等哪个状态位、怎么判断按键有没有按下…… 每一个设备的细节,都得写进程序里。

  于是就有了这样的噩梦:

  • 换了块新键盘,程序得改
  • 想同时支持两种显示器,程序里得写两套代码
  • 硬盘型号一变,读写的代码全要重来

  程序的大部分篇幅,不是在解决用户的问题,而是在伺候硬件。

麻烦三:多个程序怎么共存

  更难的是:一台计算机上不止一个程序。

  • 两个程序都想运行,谁先上?
  • 一个程序正跑着,要不要让另一个也跑一会儿?怎么切过去、又怎么切回来?
  • 两个程序都想用同一块内存怎么办?怎么保证它们互不干扰?
  • 一个程序算错了、乱改内存,会不会把另一个程序也拖垮?

  这些事,单靠一个个程序自己是解决不了的。它们彼此不知道对方的存在,却又共用着同一台机器。

麻烦四:资源谁来分配

  再往深想一层:内存、CPU 时间、磁盘、设备,都是有限的资源。

  • 谁来记录哪些资源已经被占用、哪些还空着?
  • 程序用完了,谁来回收?
  • 谁有资格用、谁没资格用?怎么防止某个程序独占一切?

  这一桩桩,都不是某个具体程序的私事,而是 所有程序共同面对 的问题。

于是,需要一位管理者

  把上面的麻烦列一列:装载、启动、设备、多程序、资源分配、保护……它们有一个共同点—— 都在替大家协调和兜底

  与其让每个程序各自为政、重复造轮子,不如让一个专门的软件站出来,统一管理这些资源,给程序提供方便又安全的服务。这个软件,就是 操作系统 (operating system)。

  它不是凭空冒出来的,而是被上面这些真实困难一步步逼出来的——就像当初计算机是被“繁琐计算”逼出来的一样。

  下一部分,我们从“按下电源”那一刻开始,亲眼看着这位管理者登场:看看它怎样被加载起来、怎样划分边界、又怎样让许多程序在同一台机器上安然共处。

思考题

  如果一台计算机永远只运行一个程序,而且这个程序也不在乎安全和方便,上面哪些麻烦可以不管?哪些麻烦无论如何都躲不掉?

小结

知识点

  • 裸机程序要自己解决装载与启动
  • 没有操作系统时,每个程序都要自己驱动设备
  • 多个程序共存会带来切换、隔离和保护问题
  • 资源分配与回收需要统一管理者
  • 操作系统正是为解决这些问题而生

参考资料

  1. Wikipedia(zh):操作系统:操作系统的职责
  2. Wikipedia(zh):裸机:没有操作系统的程序
  3. Wikipedia(zh):引导程序:计算机如何启动

思考题答案(仅供参考)

  如果只运行一个程序,而且不在乎安全与方便,那么“多程序切换与隔离”“资源公平分配”这些可以暂时不管;但“从哪开始执行、怎样装载、怎样使用设备”这几样,无论如何都躲不掉——因为只要程序要在真实硬件上跑起来,就必须解决这些问题。换句话说,操作系统的“管理”功能可以被简化,但它“让程序跑起来”的基础功能是省不掉的。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪