《操作系统概论》(第 1 - 3 章)
第一章 引论
1-1 计算机系统层次架构
1-2 计算机软件分类
计算机软件可分为系统软件、支撑软件以及应用软件三类,但它们既有分工、又相互结合,而且相互覆盖、交叉和变动,并不能截然分开。
1-3 操作系统的作用
管理计算机系统的资源:
- 处理器管理;
- 存储管理(主存分配、重定位、数据保护、虚拟存储);
- 文件管理;
- 设备管理
为用户提供方便的使用接口:
- 程序员接口(系统调用);
- 操作员接口(命令)
扩充硬件
综上,可有操作系统的概念定义:
操作系统(Operating System,OS)是管理计算机系统资源、控制程序执行、改善人机界面和为应用软件提供支持的一种系统软件。
1-4 操作系统的基本类型
批处理操作系统
单道批处理系统 -> 多道批处理系统
(一批)作业执行时用户不能直接干预
分时操作系统
用户直接与计算机交互,系统能快速响应用户请求
实时操作系统
实时性&可靠性 > 效率
1-5 特权指令的使用
从调用源头上,为保证计算机系统正确可靠地工作(避免引起冲突或意外错误),限制部分指令不允许用户程序调用,称为特权指令(只允许操作系统调用)。
同时在目标执行时,CPU设置两种工作状态来区分对特权指令的处理:
- 目态,不允许执行特权指令;
- 管态,允许执行特权指令
CPU 工作状态切换的关键判断依据 —— 程序状态字。
1-6 程序状态字(Program Status Word,PSW)
每个程序都要有一个程序状态字,用来控制指令执行顺序,并且保留和指令与程序有关的系统状态,包含三部分内容:
- 程序基本状态:
- 等待/计算:当前处理器状态;
- 目态/管态:当前处理器状态;
- 条件码:体现当前指令执行结果的各种状态信息(如算术运算产生的正、负、零或溢出等);
- 指令地址:下一条指令的存放地址
中断码:保存程序执行时当前发生的中断事件;
中断屏蔽位:指出程序执行中,是否要响应出现的中断事件。
在单处理器计算机系统中,有一个专门用来存放当前运行程序的 PSW 的寄存器,称为程序状态字寄存器。因此操作系统调度 CPU 执行/挂起相关程序时,也就需要将对应程序的 PSW 装入/移出程序状态字寄存器。
1-7 访管指令的使用
用户程序执行过程中,需要调用操作系统提供的不同功能的子程序,也就是系统调用(如读/写文件、分配主存等),其中有些还必须执行硬件的特权指令(如 I/O指令)才能完成任务,因此,需要在目态(用户程序执行,CPU不处理特权指令)下提供一个渠道,来使操作系统执行相关特权指令,这个渠道就是“访管指令”。
1】 编译程序翻译过程中,将需调用操作系统功能的逻辑要求转换成访管指令,并设置一些参数;
2】 处理器执行到访管指令时,会产生一个中断事件(1)(将操作系统程序的PSW装入程序状态字寄存器),实现用户程序与系统调用程序之间的转换;
3】 系统调用按规定参数执行结束后,再返回到用户程序(2)(将用户程序的PSW重新装入程序状态字寄存器)。
第二章 处理器管理
2-1 多道程序设计的优势
多道程序设计不仅提高了处理器的利用率,而且降低了完成计算所需的总时间,从而提高了单位时间内的算题能力,也提高了吞吐量。
但多道并行工作中,一个任务的执行可能受另一任务的制约,所以对每一个任务而言,其完成所需总时间可能长于单独执行的时间。
2-2 进程的概念
产生背景:
在多道程序设计系统中,一个程序的执行过程不是连贯、线性的,因此引入“进程”概念动态地来正确反映程序执行时的活动规律和状态变化。
引入作用:
提高资源利用率
将一个问题中可并行执行的任务粒度细化至“进程”概念;
正确描述程序的执行情况
正确反映了同一个程序在不同场景下(不同用户、不同时间、不同对象等)分别执行的动态。
2-3 进程的三种基本状态
2-4 进程控制块(Process Control Block,PCB)
- 标识信息:进程的唯一标识;
- 说明信息:说明当前进程情况;
- 现场信息:当进程让出处理器时,暂时保存存放在处理器中的相关数据,以便能在继续运行时恢复;
- 管理信息:控制进程执行顺序(进程队列中最后一个进程的队列指针值为“0”)
2-5 原语的概念
原语是操作系统中能完成一些特定功能(控制其他进程的生命周期与状态切换),且不可中断的进程。
- 创建原语:创建一个新进程(为一个程序分配一个工作区和建立一个进程控制块),并置该进程为就绪态;
- 撤销原语:在一个进程完成工作后,收回它的工作区和进程控制块;
- 阻塞原语:在进程运行过程中发生等待事件时,将进程从运行态改为等待态;
- 唤醒原语:当进程等待的事件发生后,将进程从等待态改为就绪态
2-6 进程的队列管理模型
2-7 中断响应
自愿中断事件(访管中断)
是由处理器执行指令时根据指令中的操作码捕获到的;
强迫性中断事件(硬件故障中断、程序中断、外部中断、输入/输出中断)
是由硬件中断装置发现的。
无论发生哪一类中断事件,都由硬件中断装置暂停现行进程的运行,并交由操作系统的中断处理程序来占用处理器,这一过程称为中断响应。
2-8 处理器的两级调度
预输入:
- “输入井”:磁盘中用来存放作业信息的专用区域;
- “后备作业”:已装入输入井中等待处理的作业
作业调度:
- 一个必要条件:当前系统中尚未分配的资源可满足备选作业的资源要求
2-9 常见作业调度算法
先来先服务算法
首先按照作业进入输入井的先后顺序,同时当前系统中未被分配的资源还要能满足作业的资源需求
计算时间短的作业优先算法
优先选择(预估)计算时间短,且资源能得到满足的作业
响应比高者优先算法
响应比 = 等待时间 / (预估)计算时间
根据等待时间的变化来动态调整响应比
优先级调度算法
先按照优先级进行调度,相同优先级的任务再按照先来先服务原则进行调度
均衡调度算法
先根据作业对资源的不同需求进行分类,再从不同分类的作业中去挑选调度,以尽可能地使系统资源都被重复利用
2-10 常见进程调度算法
先来先服务调度算法
按照进程进入就绪队列的先后次序(新的进程就绪排入就绪队列的末尾,而进程调度总是把处理器分配给就绪队列中的第一个进程)
最高优先级调度算法
进程调度总是让当前最高优先级的进程先使用处理器
当有更高优先级的进程就绪时,对于正在处理器中执行的进程,有两种处理方式:
- 非抢占式:已在处理器中的进程将一直执行下去,直到由于它自身原因(工作结束或出现等待事件)而主动让出处理器,再有进程调度重新分配处理器;
- 可抢占式:严格保证任何时刻总是让具有最高优先级的进程在处理器上运行
也可与先来先服务调度算法混合使用,对于相同优先级的进程,采用先来先服务策略
时间片轮转调度算法
时间片:允许进程一次占用处理器的最长时间。时间片的取值大小,关系到计算机系统的****效率****和用户的****满意度****,对于不同进程,时间片设置也可不同
同样是先按照进程就绪的先后次序排成队列,调度时总是先执行就绪队列中的第一个进程(先来先服务);
进程在一个时间片内未执行完或出现等待时间,下次就绪时重新排入就绪队列末尾
2-11 线程的概念
在现代操作系统中,把用户的一个计算问题或一个应用问题作为一个进程,把该进程中可并发执行的各部分分别作为一个线程
线程是进程中可独立执行的子任务,有唯一标识符和线程描述表
概念产生背景:
进程的缺点:
- 每个进程都占用一个进程控制块和一个私有的主存空间,开销较大;
- 进程之间的消息传递,要从一个工作区到另一个工作区,需专用的通信机制,速度较慢;
- 进程过多增加了进程调度的次数,复杂性提升
把要解决某个问题的工作作为一个进程,而其中可并发执行的部分细化至线程粒度来控制,操作系统仅为进程来分配所需资源,进程内的各线程共享进程的资源
- 进程 -> 资源分配单位
- 线程 -> 调度、执行单位
多线程技术的优点:
- 节省了分配进程控制块和工作区的开销;
- 线程创建无需另行分配资源,创建速度快;
- 线程间信息传递在同一主存空间,传递速度快;
- 线程独立执行,能充分发挥并行工作能力
第三章 存储管理
3-1 三层存储结构
寄存器:
价格最昂贵,存取速度最快,容量小(一般一个字长);
只用来存放临时的工作数据和控制信息
主存储器:
存储容量较大,存取速度较快,以字节为单位编址;
用于存放用户当前需执行的程序和数据,及操作系统进行控制和管理的信息
- 系统区:操作系统自身所占据的一部分主存空间,用来存放操作系统的程序、数据、管理信息(如PCB)以及操作系统与硬件的接口信息(如新、旧PSW)等;
- 用户区:用来存放用户的程序和数据
高速缓冲存储器:
存取速度快于主存,造价也相对更高,存储容量不大;
存放在主存储器中经常要被访问的一些信息
辅助存储器:
存储容量很大,处理器不能直接读写,存取速度较慢;
用来长期存储信息
3-2 重定位(逻辑地址 -> 绝对地址)
静态重定位
在装入的作业执行前,集中一次性完成作业中的地址转换,在作业执行过程中也就无需再进行地址转换
动态重定位
通过硬件设置一个基址寄存器,用来存储装入程序的主存起始地址。在作业执行过程中,只需把逻辑地址和基址寄存器中的值相加即可得到对应的绝对地址
优点:必要时可改变已装入主存的作业的存放区域,只需改变基址寄存器的值为新区域的起始地址即可。而静态重定位的作业在装入主存执行过程中,就不能再移动位置了
3-3 单用户连续存储管理
最简单的一种存储管理方式,除操作系统占用的一部分主存空间外,其剩余的所有空间(不管空闲区多大)都只分配给一个作业使用
处理器中设置一个界限寄存器,用来存放用户区起始地址,一般固定不变(除非操作系统功能扩充或修改导致系统区占用变化)
这种方式不必考虑作业在主存中的移动问题,因此可采用静态定位方式进行地址转换
3-4 固定分区存储管理
将主存储器中可分配的用户区预先划分成若干个连续区域(大小可不相同,但划分好后大小固定),每个连续区域称为一个分区
- 可同时在每个分区中装入一个作业,但不允许多个作业同时装入同一个分区中;
- 适用于多道程序设计系统
通过设置“分区分配表”,来记录各分区的分配和使用情况:
- 记录各分区的起始地和长度;
- 设置标志位,为 0 表示分区空闲,否则已被占用
作业执行过过程中不会发生存放区域改变, 适用静态重定位方式
下限地址 ≤ 绝对地址 < 上限地址
3-5 可变分区存储管理
在作业要求装入主存时,根据作业需要的主存空间大小和当时主存空间使用情况来决定是否为作业分配一个分区,并按作业的实际需求来划分大小
- 克服了固定分区方式中分区空间不能被充分利用的缺陷;
- 需设置一张“空闲区表”来记录空闲区的起始位置和长度;
- 如果收回的区域正好与某一个空闲区相邻,应将其合并后再登记到空闲区表上
一般均采用动态重定位方式来装入作业,变于移动技术的实现:
- 集中分散的空闲区,使主存空间充分被利用;
- 便于作业动态扩充主存;
- 移动会增加系统开销,尽量减少(可将作业从主存空间两头装入);
- 等待外围设备消息中的作业不能被移动(与外围设备的信息交换是按照主存绝对地址来进行的)
常用主存分配算法:
最先适应分配算法
每次分配时,总是顺序查找空闲区表,第一个能满足作业长度需求的空闲区即被切割后分配给作业
- 实现简单;
- 容易导致碎片(不连续的空闲区)过多,使主存空间利用率降低
最优适应分配算法
从所有空闲区中挑选一个能满足作业要求的最小空闲区
- 空闲区表中按空闲区长度递增登记,顺序查找第一个能满足的即是最优适应,回收后还需按长度顺序登记至空闲区表中;
- 被切割后的碎片往往极小而无法利用,影响主存空间利用率
最坏适应分配算法
总是挑选最大的空闲区切割后分配给作业
- 空闲区表中按空闲区长度递减登记,顺序查找第一个能满足的即是最坏适应,回收后还需按长度顺序登记至空闲区表中;
- 保证碎片不至于太小而无法使用
3-6 页式存储管理
将作业的连续逻辑地址空间分散到几个不连续的主存区域,既可充分利用主存空间又可减少移动开销
实现原理:
将主存空间分成大小相等的块,同时将程序的逻辑地址也分成(与块)相同大小的页;
由分页式存储器的逻辑地址结构来决定页数(页号位数)与页面的大小(页内地址位数);
作业装入主存时,分配与所需页数相一致的块,可不连续;
作业执行时,根据逻辑地址的页号找到所在主存块号,再确定当前指令应访问的主存绝对地址
主存分配表:
如示例,假设主存可分配区域被分为256块,可用字长为32位的8个字的位示图来表示各块的分配情况:
- 0/1 来表示当前块 空闲/已占用;
- 另用一个字节来记录当前的剩余块数
页表:
给能满足需求的作业分配好空间后,建立页表来记录逻辑地址中的页号与主存中块号的对应关系。
快表:将页表中经常需要访问的一部分放置于高速缓冲存储器中,以提升查找执行速度
分页式地址转换:
执行时采用动态地址转换方式:绝对地址 = 块号 ✖ 块长 + 页内地址
考虑二进制乘法的特性,实际就是由页表中查得的主存块号(作为高地址部分)和逻辑地址的页内地址(作为低地址部分)组成了绝对地址
3-7 页式虚拟存储管理
虚拟存储:
由于在程序执行过程中,并不是所有部分都可能(在同一时间段内)被执行(比如如逻辑互斥的部分),考虑将不需执行的部分暂时存放在磁盘(辅助存储器)上,需要时再交换至主存中,实现在较小的主存空间内运行需求较大的作业
页式虚拟存储的实现:
- 磁盘保留全部的作业信息副本;
- 当作业调度选中作业时,至少将第一页信息装入主存;
作业执行过程中,需访问不在主存中的页时,再把它们装入。
对应改造页表:
- 新增“标志”位,为 1 表示该页已装入主存,否则还需从磁盘中装入;
- 新增“磁盘上的位置”,必要时根据此值将对应页装入主存
常见页面调度策略:
当需从磁盘中装入新的页,而主存中无可满足的空闲块时,需通过页面调度将主存中暂时不需要的页调出
抖动/颠簸:相同页在短时间内被重复调入/调出的现象,应尽量避免
先进先出调度算法(First-In-First-Out, FIFO)
总是淘汰最先进入主存的页
- 实现简单;
- 基于最早进入的页不再被使用的可能性比更大
最近最久未使用调度算法(Least Recently Userd,LRU)
基于程序执行的局限性理论,即程序一旦访问的某些数据或指令时,可能在一段时间内会频繁访问它,所以应调出一段时间内最久没被使用的页
最近最不经常使用调度算法(Least Frequently User,LFU)
基于在过去一段时间内被访问次数最多的页可能是经常需要使用的页,所以应调出一段时间内访问次数最少的页
3-8 多级页表
现代多道程序设计系统中,实际需要保存的页表数量及规模往往都很大,主存开销很大。考虑程序执行的局限性,一段时间内程序执行可能也只涉及一部分页,而将其他页存放至磁盘中
二级页表结构:
- 一级页表(页面组表)指出二级页表的存放地址;
- 二级页表(组内页面表)指出页的存放地址;
- 总是将一级页表装入主存,再根据需要装入对应二级页表
二级页表结构还可扩充至三级、四级或更多级。级别越多,灵活性越大,管理复杂度也越大