操作系统是什么
复习
- 没有操作系统的程序:裸机程序在装载、设备和多程序共存上的困难
- 按下电源:复位与固件:CPU 从约定位置开始执行,固件接过控制权
- 引导程序与内核加载:引导程序把内核装入内存,内核初始化后接手管理
TL;DR
- 操作系统有两个身份:资源的管理者 和 抽象的提供者
- 作为管理者,它分配和回收 CPU、内存、设备、文件
- 作为抽象者,它提供进程、文件、地址空间等好用的概念
- 内核是操作系统的核心,常驻内存,程序通过它请求服务
正文
启动的接力跑完了,管理者终于上位。这个管理者,就是我们一直在说的操作系统(operating system)。可它到底“是什么”?
与其背定义,不如看它干的活。操作系统有两副面孔。
面孔一:资源的管理者
上一部分末尾,我们列过裸机的几大麻烦:多个程序抢 CPU、抢内存、抢设备,谁先谁后,谁多谁少。这些正是操作系统的本职工作。
计算机里的资源就那么几样:CPU 时间、内存、设备、以及存在设备上的数据。操作系统要做的是:
- 分配:谁需要,就给谁一份
- 回收:谁用完了,就收回来
- 保护:不许任何人独占一切,也不许互相破坏
- 记录:哪些已被占用,哪些还空着
它像一位调度员,手里攥着有限的资源,尽量让每一件事都办得又快又公平。
面孔二:抽象的提供者
可光会“分东西”还不够。硬件本身又乱又难用:磁盘有一堆位置和格式,CPU 会不停地被打断,内存是一大片地址。直接把这些丢给程序,程序会很痛苦。
于是操作系统又添了另一副面孔:提供抽象。
- 文件:把“硬盘上某处的若干数据块”包装成“一个有名字、能读写的对象”
- 进程:把“一小段正在用 CPU 的代码”包装成“一个正在运行的程序”
- 地址空间:把“散落各处的物理内存”包装成“每个程序独占的一整片连续内存”
程序只要会用这些概念,就不必再操心磁盘、中断和物理地址。这就是我们反复见到的加一层:在最难看的硬件和最上层的程序之间,操作系统搭了一层又好用又安全的抽象。
内核
操作系统里最核心、也最常驻内存的那部分,叫内核(kernel)。程序想要读文件、发数据、申请内存,最终都是在内核里完成的。
内核之外的软件(比如各种库、工具、图形界面)则站在内核肩膀上,一起构成我们平时说的“操作系统”。所以“操作系统”既指那个核心,也常用来指整套软件。
合起来看
普通程序 / 工具 / 图形界面
│ 用进程、文件、地址空间
┌────────▼────────┐
│ 内核 │ 管理 CPU、内存、设备
└────────┬────────┘
│
硬件
管理者、抽象者,其实是同一件事的两面:把混乱的硬件,整理成程序能用、敢用的样子。
既然内核这么重要,那程序是不是可以随意指挥它、让它替自己做任何事?当然不行。下一章,我们要给机器划出一条界线:内核态与用户态。
思考题
“文件”是一种抽象。如果不用文件,程序直接操作磁盘上的数据块,会多出哪些麻烦?操作系统提供的抽象,是“取消了”硬件细节,还是“隐藏”了硬件细节?
小结
知识点
- 操作系统是资源的管理者,负责分配、回收与保护
- 操作系统是抽象的提供者,给出文件、进程、地址空间等概念
- 内核是操作系统的核心,常驻内存
- 操作系统在硬件与程序之间加了一层
参考资料
- Wikipedia(zh):操作系统:操作系统的职责
- Wikipedia(zh):内核:内核的组成
- Wikipedia(zh):系统资源:资源管理
思考题答案(仅供参考)
不用文件,程序就得自己记住数据放在磁盘的哪个磁道、哪个扇区,自己处理读写命令、错误重试和空间回收,稍微换个设备还得重写。操作系统提供的文件抽象,并没有取消这些硬件细节,而是把它们隐藏起来:细节还在,只是由内核统一替你面对。这也正是抽象的一贯做法——不消灭复杂,只把复杂挡在接口之后。
协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
封面图
设计师 | 南国微雪