本文是操作系统的课程笔记,主要精炼操作系统教程中最重要的概念。旨在帮助程序员快速建立关于操作系统的基本认知。
什么是操作系统 ?
操作系统是一个管理计算机硬件的软件,同时也是计算机硬件和用户软件之间的中间件,它为用户软件提供软硬件资源。
在这里,用户软件可以理解为除操作系统外的软件。所以操作系统的关键功能是在用户软件和计算机硬件之间搭建了桥梁。
计算机系统的构成
一般来说,一个完整的计算机系统包括:
- 硬件:计算资源,包括 CPU,内存,磁盘等;
- 固件:BIOS,用于加载操作系统;
- 操作系统;
- 系统软件:基本的开发工具,包括 shell, 编译器等;
- 应用软件:数据库,商业软件等;
- 用户:人,其它计算机,机器等。
操作系统的目标
从用户的角度看,操作系统的目标是执行用户程序,让用户能更容易地解决问题,使计算机系统容易使用。
从系统的角度看,操作系统的目标是管理资源,让计算机硬件发挥最大效用。
操作系统的主要组件
操作系统的主要组件包括:
- 进程与线程
- CPU 调度
- I/O 管理
- 内存管理
接下主要阐述这四个组件的具体职责。
进程与线程
进程是一个执行中的程序。它可以被中断,让 CPU 执行更高优先级的进程;也可以在被中断的地方恢复执行。
进程于程序可以类比于 OOP 中的实例于对象。
例如,Chrome 游览器在新建一个 Tab 时都会新启一个进程,这个 Tab 里的内容可能包含了多个线程。若我们的打开的是 Google Map,那地图的控制组件和地图渲染就会是两个线程。
所以:
一个进程中的执行部分称为线程,它可以是多个的。
多任务
多任务会给人一种在单核 CPU 上进行并行处理的假象。其背后机制是 CPU 的时间分片。
时间分片
时间分片是 CPU 运行的一种合理扩展:在运行时, CPU 在任务之间进行频繁地切换,用户们总是可以和任务进行交互。所以多个用户可以同时使用同一台单核计算机,而且一直能和程序进行交互,从而用户会感得自己独占了这台计算机资源。
时间分片需要满足的要求
- 响应时间应该小于 1 秒;
- 每个用户至少有一个进程。
操作系统负责管理进程和线程,包括:创建和销毁、暂停和恢复、调度、进程间同步机制、进程间通信机制和处理死锁机制。
CPU 调度
当一个进程在执行中,它会在不同的状态之间进行切换。它的调度状态包括:
- new 进程正在被创建;
- ready 进程正在等待被分配到处理器;
- running 进程的指令正在执行;
- waiting 进程正在等待某个事件(比如 I/O)的发生;
- terminated 进程结束执行。
CPU 调度的职责
操作系统负责高效地使用 CPU,并在短时间内响应用户的操作。
- 确定接着执行内存中的哪个进程;
- 确定什么时候执行什么进程,执行多长时间,同时对外部事件(比如 I/O 中断)保持响应;
- 根据系统需求在调度算法的基础上对 CPU 使用率、吞吐量、延迟、响应时间进行优化。
I/O 管理
I/O 包括两种方法:同步和异步。
同步:I/O 开始后,控制权只有在 I/O 结束后才返回给用户程序。
- 等待指令使得 CPU 在下次中断之前都是闲置状态;
- 等待循环;
- 一个时间点至多有个一个 I/O 未完成的请求,没有同时进行的 I/O 程序。
异步:I/O 开始后,控制器不需要等 I/O 结束后就可以直接返回给用户程序。
- 系统调用:向 OS 发出请求以允许用户等待 I/O 结束;
- 设备状态表包含每个 I/O 设备的类型,地址和状态的条目;
- OS 建立 I/O 设备表以确定设备状态和修改表的条目,包括中断。
I/O 管理的职责
操作系统负责所有 I/O 设备的调控。
- 向用户隐藏特定的硬件设备;
- 向设备发出低级别命令,捕捉中断和处理错误;
- 依赖于设备驱动的软件模块;
- 向用户程序提供一个与设备无关的 API,包括缓存。
内存管理
OS 必须给多个进程在内存中找到存放空间。
- 内存需要被分块以容纳多个进程;
- 内存的分配需要确保合理的 ready 状态的进程供给,确保 CPU 不会处于闲置的状态;
- 内存管理是带有条件的优化任务。
缓存
缓存在设计中是一个重要原则,在计算机的各个层面上均有体现。
信息总是从低速存储暂时复制到高速存储。操作系统会先在高速存储中检索所需的信息。若存在,则直接使用缓存信息;若不存在,则先将信息复制到缓存,并使用缓存中的信息。
在多任务环境中,必须要留意使用最新值,不管它存储在哪个 level 上。在多处理器环境中,必须提供在硬件层面上提供缓存的一致性,使所有 CPU 在它们的缓存上都有最新值。而在分布式环境中,情况变得更为复杂,因为一份数据往往会有多个备份。
内存管理的职责
操作系统负责提供高效有序的内存分配,它的职责包括:
- 确保进程隔离:追踪当前内存的哪些部分正在被谁使用;
- 按需分配和回收内存空间:确定加载后换出哪些进程;
- 管控不同进程和用户可以在某些时间共享内存的同一部分;
- 控制主内存和磁盘之间的传输以确保长期的存储。