Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

操作系统是什么

复习

  • 没有操作系统的程序:裸机程序在装载、设备和多程序共存上的困难
  • 按下电源:复位与固件:CPU 从约定位置开始执行,固件接过控制权
  • 引导程序与内核加载:引导程序把内核装入内存,内核初始化后接手管理

TL;DR

  • 操作系统有两个身份:资源的管理者抽象的提供者
  • 作为管理者,它分配和回收 CPU、内存、设备、文件
  • 作为抽象者,它提供进程、文件、地址空间等好用的概念
  • 内核是操作系统的核心,常驻内存,程序通过它请求服务

正文

  启动的接力跑完了,管理者终于上位。这个管理者,就是我们一直在说的操作系统(operating system)。可它到底“是什么”?

  与其背定义,不如看它干的活。操作系统有两副面孔。

面孔一:资源的管理者

  上一部分末尾,我们列过裸机的几大麻烦:多个程序抢 CPU、抢内存、抢设备,谁先谁后,谁多谁少。这些正是操作系统的本职工作。

  计算机里的资源就那么几样:CPU 时间、内存、设备、以及存在设备上的数据。操作系统要做的是:

  • 分配:谁需要,就给谁一份
  • 回收:谁用完了,就收回来
  • 保护:不许任何人独占一切,也不许互相破坏
  • 记录:哪些已被占用,哪些还空着

  它像一位调度员,手里攥着有限的资源,尽量让每一件事都办得又快又公平。

面孔二:抽象的提供者

  可光会“分东西”还不够。硬件本身又乱又难用:磁盘有一堆位置和格式,CPU 会不停地被打断,内存是一大片地址。直接把这些丢给程序,程序会很痛苦。

  于是操作系统又添了另一副面孔:提供抽象

  • 文件:把“硬盘上某处的若干数据块”包装成“一个有名字、能读写的对象”
  • 进程:把“一小段正在用 CPU 的代码”包装成“一个正在运行的程序”
  • 地址空间:把“散落各处的物理内存”包装成“每个程序独占的一整片连续内存”

  程序只要会用这些概念,就不必再操心磁盘、中断和物理地址。这就是我们反复见到的加一层:在最难看的硬件和最上层的程序之间,操作系统搭了一层又好用又安全的抽象。

内核

  操作系统里最核心、也最常驻内存的那部分,叫内核(kernel)。程序想要读文件、发数据、申请内存,最终都是在内核里完成的。

  内核之外的软件(比如各种库、工具、图形界面)则站在内核肩膀上,一起构成我们平时说的“操作系统”。所以“操作系统”既指那个核心,也常用来指整套软件。

合起来看

       普通程序 / 工具 / 图形界面
                 │  用进程、文件、地址空间
        ┌────────▼────────┐
        │      内核        │  管理 CPU、内存、设备
        └────────┬────────┘
                 │
              硬件

  管理者、抽象者,其实是同一件事的两面:把混乱的硬件,整理成程序能用、敢用的样子。

  既然内核这么重要,那程序是不是可以随意指挥它、让它替自己做任何事?当然不行。下一章,我们要给机器划出一条界线:内核态与用户态

思考题

  “文件”是一种抽象。如果不用文件,程序直接操作磁盘上的数据块,会多出哪些麻烦?操作系统提供的抽象,是“取消了”硬件细节,还是“隐藏”了硬件细节?

小结

知识点

  • 操作系统是资源的管理者,负责分配、回收与保护
  • 操作系统是抽象的提供者,给出文件、进程、地址空间等概念
  • 内核是操作系统的核心,常驻内存
  • 操作系统在硬件与程序之间加了一层

参考资料

  1. Wikipedia(zh):操作系统:操作系统的职责
  2. Wikipedia(zh):内核:内核的组成
  3. Wikipedia(zh):系统资源:资源管理

思考题答案(仅供参考)

  不用文件,程序就得自己记住数据放在磁盘的哪个磁道、哪个扇区,自己处理读写命令、错误重试和空间回收,稍微换个设备还得重写。操作系统提供的文件抽象,并没有取消这些硬件细节,而是把它们隐藏起来:细节还在,只是由内核统一替你面对。这也正是抽象的一贯做法——不消灭复杂,只把复杂挡在接口之后。

协议

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

封面图

设计师 | 南国微雪