1. 操作系统的地位
计算机系统由硬件和软件组成,未配置软件的计算机称为裸机。
操作系统是用户与计算机之间桥梁,是裸机上的第一层软件。当配置了操作系统后,用户不再直接使用计算机系统硬件,而是利用操作系统所提供的命令和服务去操纵计算机。
题目:
2. 程序串行和并发执行
(1)程序串行执行的特征
- 顺序性:按照指令顺序依次执行,执行完当前指令后,才会执行下一条指令。
- 封闭性:程序执行时独占系统资源,不受其他程序的干扰。
- 可再现性:只要初始条件相同,程序多次执行的结果就相同。
(2)程序并发执行的特征(资源、变量)
- 间断性:程序在执行过程中会出现“走走停停”的情况。
- 失去封闭性:程序的执行会受到其他程序的影响。
- 不可再现性:即使初始条件相同,程序多次执行的结果可能不同。
3. 进程的状态
三态模型:
- 运行:进程在 CPU 上运行时,处于运行状态。
- 就绪:进程获得了除 CPU 之外的所有资源,一旦获得 CPU 使用权就可以运行。
- 阻塞:正在运行的进程要等待某一事件发生(如 IO 操作),暂时停止运行,这时也会失去 CPU 使用权。
五态模型:引入新建和终止状态
题目:
4. 同步与互斥
进程同步:进程间需要相互合作,协同工作,所以有的进程需要等待其他进程完成某项工作后再继续向下执行。
进程互斥:多个进程因正用临界资源而互斥执行。
临界资源:在多道程序系统环境中,各进程可以共享各类资源,但有些资源同一时刻只能供一个进程使用,称为临界资源。
临界区:操作临界资源的那段程序。
互斥临界区的管理原则:
- 有空即进:当无进程处于临界区时,允许进程进入,并且只能在临界区运行有限的时间。
- 无空则等:当有一个进程在临界区时,其他进程若想进入必须等待,以保证互斥。
- 有限等待:对于要求访问临界资源的进程,应保证能在有限的时间进入临界区,以免陷入“饥饿” 状态。
- 让权等待:当进程不能进入临界区时,应立即释放 CPU,避免忙等。
5. 信号量和 PV 操作
信号量:是一个整型变量,S≥0 表示某资源的可用数目,S<0 表示阻塞队列中等待该资源的进程数。
PV 操作:用于实现进程同步和互斥,P 操作申请一个资源,V 操作释放一个资源。两个操作都是低级通信原语,要成对出现。
P 操作定义:S=S-1,若 S≥0,则表示能使用资源;若 S<0,则将该进程放入阻塞队列。
V 操作定义:S=S+1,若 S>0,则不进行操作;若 S ≤ 0,则将阻塞队列中队头的进程放入就绪队列等待 CPU(准备使用资源)。
【例】
- 假设只有一台打印机(S=1),进程 1 去申请打印机(S=S-1➡S=0),然后使用打印机;
- 此时,进程 2 也申请打印机(S=S-1➡S=-1),因为 S < 0,所以该进程进入阻塞队列。
- 进程 1 用完并释放打印机之后(S=S+1➡S=0),发现 S ≤ 0,于是将阻塞队列中的队头进程(进程 2)放入就绪队列,等待 CPU 的调度,随后就可以使用打印机。进程 2 用完后,释放打印机资源(S=S+1➡S=1)。
注:进程 1 用完并释放打印机后,S ≤ 0,说明之前 S≤-1。当 S =-1时,说明是在没有资源的情况下去申请资源,所以阻塞队列中一定有等待使用资源的进程;S<-1时就更是没有资源的情况下去申请资源了。
6. PV 操作与前驱图
初始时,各信号量 S 12 、 S 13 、 S 23 、 S 34 S_{12}、S_{13}、S_{23}、S_{34} S12、S13、S23、S34 都为 0。前驱图与对应的 PV 操作如下:
PV 操作是如何保证程序按照前驱图执行的呢?
假设先执行 P2 进程,也就是先执行 F2 函数,就需要通过 P 操作申请 S12 表示的资源,但是 S12 初始为 0,所以 P2 进程被送入阻塞队列,等待 P1 进程执行完并释放 S12 资源才能再执行。这样实现了 P2 在 P1 进程之后执行。其余同理。
题目:
7. PV 操作实现进程互斥
令信号量 mutex 的初值为 1,进入临界区时执行 P 操作,退出临界区时执行 V 操作,这样就能实现进程互斥。
8. PV 操作实现进程同步
信号量的值为 0 表示希望的消息未产生,非 0 时表示希望的消息已经存在。
调用 P 操作测试消息是否到达,调用 V 操作通知消息已准备好。
(1)单缓冲区情况下的进程同步
- 针对生产者 P1 有信号量 S1,初值为 1,表示可以再向缓冲区中放入一个产品;
- 针对消费者 P2 有信号量 S2,初值为 0,表示缓冲区中有 0 个产品可以取出。
首先,生产者 P1 生产一个产品,并执行 P(S1),即 S1=S1-1,若 S1≥0 则可以向缓冲区中放入产品;否则进入阻塞队列。放入之后,执行 V(S2),即 S2=S2+1,若 S2>0,则什么也不做;若 S2≤0,说明阻塞队列中有消费者进程,则将其放入就绪队列中等待,一旦被 CPU 调度就可以从缓冲区中取产品。
消费者 P2 执行 P(S2),即 S2=S2-1,若 S2<0,说明缓冲区没有产品,则 P2 到阻塞队列中;若 S2≥0,说明可以从缓冲区中取产品。取出产品后要执行 V(S1),即 S1=S1+1,若 S1>0,则什么也不做;若 S1≤0,说明阻塞队列中有生产者进程,则将其放入就绪队列中等待,一旦被 CPU 调度就可以向缓冲区中放入产品。
(2)多缓冲区情况下的进程同步
设置 3 个信号量 S、S1 和 S2:
- S 是一个互斥信号量,初值为 1,因为多缓冲区可能会进来多个进程同时操作,所以需要进行互斥控制;
- S1 表示缓冲区中还可以放入多少产品,初值为 n;
- S2 表示缓冲区中可取出多少产品,初值为 0。
题目:
9. 进程资源图
P1、P2、P3 进程分别是阻塞的还是非阻塞的?该进程资源图是否可以简化,如果可以,简化顺序是什么?
先分配资源:
申请资源时发现:
- P1 不用申请,可以运行,非阻塞;
- P2 需要申请 2 个 R1 资源,无法满足,于是阻塞;
- P3 需要申请 1 个 R2 资源,无法满足,于是阻塞。
由于 P1 进程可以直接运行,所以运行完成后能释放 1 个 R1 资源和 1 个 R2 资源;于是 P2 进程可以申请到 2 个 R1 资源并运行完毕;R3 进程也可以申请到 1 个 R2 资源并运行完毕。所以进程资源图可以简化,简化的顺序是 P1➡P2➡P3 或 P1➡P3➡P2。
下面的例子中,分配完资源后,发现三个进程都无法再申请所需资源,所以都阻塞。因此进程资源图也无法简化。
题目:
10. 死锁
当有 n 个进程,m 个资源,每个进程所需要的资源数为 k,
且系统采用轮流分配的方式为每个进程分配资源时(软考题目都是这个策略),判断是否会发生死锁的公式为:m ≥ n × (k - 1) + 1
。满足该条件就不会发生死锁,否则就会发生死锁。
下面的例子中轮流分配就不会出现死锁:
- 7 个资源,3 个进程,每个进程需要的资源数量为 3。
- 第一轮先为每个进程分配 1 个资源,还剩下 4 个;
- 第二轮再为每个进程分配 1 个资源,还剩下 1 个;
- 第三轮可以将剩余的 1 个资源分配给第一个进程。此时,资源全部分配完毕。
- 当第一个进程执行完毕后,释放持有的资源,于是这些资源可以分配给正在等待资源的后两个进程,于是后两个进程也得以执行完毕。
题目:
11. 死锁避免
死锁产生的条件(缺一不可):
- 互斥:多个线程不能同时使用同一资源。
- 持有并等待:线程持有资源 1 并等待资源 2 的同时,不会释放已经持有的资源 1。
- 不可剥夺:已经持有的资源在使用完之前不能被其他线程获取。
- 环路等待:线程 A 已经持有资源 2,想获取资源 1;线程 B 已经获取了资源 1,想获取资源 2。
死锁的预防:
- 预先静态分配法:破坏了 “不可剥夺条件”,预先分配所需资源,保证不等待资源。但降低了资源利用率、降低进程发程度,有时可能无法预先知道所需资源。
- 资源有序分配法:破坏了 “环路条件”,把资源分类按顺序排列,保证不形成环路。该方法存在的问题是限制进程对资源的请求;由于资源的排序占用系统开销。
死锁的处理策略主要有 4 种:鸵鸟策略(即不理睬策略)、预防策略、避免策略、检测解除死锁。
死锁的避免:
死锁预防设法破坏产生死锁的 4 个必要条件之一,死锁避免则不那么严格地限制产生死锁的必要条件。最著名的死锁避免算法是Dijkstra 提出的银行家算法,但需要很大的系统开销。
银行家算法对每一个系统可以满足的资源请求命令进行检测,如果发现分配资源后系统进入不安全状态,则不予分配;否则分配。与死锁预防策略相比,它提高了资源利用率,但检测资源分配后系统是否安全的过程增加了系统开销。
安全状态:系统按照某种顺序如<P1, P2, …, Pn> 来为每个进程分配资源,直到最大需求量,能够使它们顺序完成。此时,<P1, P2, …, Pn> 称为安全序列。
12. 线程
进程的创建、撤销、切换需要较大的时空开销,所以系统中的进程数量不宜过多,切换的频率不宜过高,这就限制了并发程度,所以引入了线程。
线程是调度的基本单位,进程是资源分配的单位。
线程只拥有很少的资源,如:虚拟机栈、本地方法栈、程序计数器。同属一个进程的线程可以共享进程拥有的全部资源,这些线程之间不能共享资源。
13. 程序局部性原理
时间局限性:程序中的某条指令一旦执行,则不久后该指令可能再次被执行;某个存储单元被访问,则不久后该存储单元可能再次被访问。主要原因是程序中存在者大量循环操作。
空间局限性:一旦程序访问了某个存储单元,则不久后附近的存储单元也很可能被访问。即程序在一段时间内所访问的地址可能集中在一定的范围内,主要原因是程序顺序执行。
页面变换表中的淘汰机制:
- 首先看状态位,状态位为 0 的不考虑,因为不在内存
- 其次看访问位,如果访问位为 0,表示未访问过,淘汰
- 如果访问位都为 1,再看修改位,若修改位为 0,表示未修改过,淘汰
14. 分页存储管理
页面大小是 4K 时,逻辑地址结构为(4K = 4096 = 2 12 2^{12} 212):
假设计算机系统的页面大小是 4K,进程 P 的页面变换表如下表所示。若 P 要访问的逻辑地址为十六进制 1C20H,那么该逻辑地址经过地址变换后,其物理地址应为多少?
1 位十六进制就是 4 位二进制,所以最低的 3 位 C20 转换成二进制就能就对应页内地址,最高位 1 就对应页号。将页号对应的物理块号与页内地址拼接就能得到物理地址,逻辑地址 1C20H 对应的物理地址是 3C20H。
15. 段页式存储管理
段页式存储的地址结构:
16. 缓冲区
16.1 单缓冲区
IO 设备会将作业输入到缓冲区,缓冲区再把作业传送给工作区(用户进程)。单缓冲区只能容纳一个作业,所以非空时不能输入作业,非满时不能传送作业。
假设输入(T)、传送(M)、处理(C)所需时间分别为 5s、2s、1s,则 n 个作业并行处理的过程如下(以 n=3 为例):
可以看到,下一个作业的输入时间(T) 包含了上一个作业的处理时间(C)。所以,处理完 n 个作业所需的时间为 (T+M)×n+C
。
16.2 双缓冲区
IO先向缓冲区1中输入任务,然后缓冲区1将任务传送到工作区,工作区再处理任务;缓冲区1将任务传送到工作区时,IO设备空闲,可以继续向缓冲区2中输入任务……
可以看到,下一个作业的输入时间(T) 包含了上一个作业的传送时间(M)、处理时间(C)。所以,处理完 n 个作业所需的时间为 T×n+M+C
。
17. 磁盘调度算法和旋转调度算法
一次磁盘读写过程由三个动作组成:
- 寻道:磁头移动定位到指定磁道,这部分时间代价最高;
- 旋转定位:等待指定扇区旋转至磁头下;
- 数据传输
17.1 磁盘调度算法
假设 I/O 对各个柱面上块的请求顺序为 98、183、37、122、14、124、65、67。如果磁头一开始位于53,则采用各种磁盘调度算法时,访问顺序分别为(0 和 199 是边界):
先来先服务(FCFS):按照请求顺序服务
总的磁头移动为 640 (45 + 85 + 146 + 85 + 108 + 110 + 59 + 2) 个柱面,平均寻道长度 = 640/8 = 80。
最短寻道时间优先(SSTF): 每次都就近服务
总的磁头移动为 236 (12 + 2 + 30 + 23 + 84 + 24 + 2 + 59) 个柱面,平均寻道长度 = 236/8 = 29.5。
扫描算法(SCAN)/ 电梯调度算法: 从磁头当前位置开始,沿磁头移动的方向由近及远地访问,如果访问到尽头就调转方向继续由近及远地访问
总的磁头移动为 208 (16 + 23 + 51 + 2 + 31 + 24 + 2 + 59) 个柱面,平均寻道长度 = 208/8 = 26。
循环扫描算法(CSCAN)/单向扫描算法: 从磁头的当前位置沿着其原本的方向由近及远访问,若到达尽头则跳回最内/外层,以与第一次相同的方向继续访问。
总的磁头移动为 322 ( 12 + 2 + 31 + 24 + 2 + 59 + 169 + 23) 个柱面,平均寻道长度 = 322/8 = 40.25。
虽然在这个例子中,CSCAN 表现不是最好的,但总体来说能有效避免将已经扫描过的磁道重新扫描一次,降低了平均寻道距离。
17.2 旋转调度算法
假设磁盘旋转速度为 20ms/圈,每读一个记录之后需要处理 4 ms。若同一磁道上有 10 个逻辑记录,初始时读写头在 A 处,按照 A~J 依次读取并处理,则总共需要多长时间?
为了画图方便,我们画成了磁盘静止,磁头运动(原本是磁盘在转)。磁盘转速 20ms/圈,每圈 10 条记录,所以读取一条记录需要 2ms。
初始时,磁头指向 A 的起始;2ms 后,读取 A 完毕,指向 B 的起始;4ms 后处理完已读取的 A,期间磁头逐渐指向了 D 的起始。
此时要读取并处理 B,于是磁头要跨过 D、E、F……J、A 共 8 个记录,来指向 B 的起始,所需时长为 16ms。之后对于 B,依然要 2ms 读取,4ms 处理。
对于 B~J 的所有记录,都要经历 16ms + 2ms + 4ms 的过程。
所以,读取并处理 A~J 共需时间为:(2 + 4) + (16 + 2 + 4) × 9 = 204ms。
给出一种优化方案,使处理程序用尽可能短的时间读取和处理这些记录,并给出所需时间。
18. 多级索引结构
索引将文件的逻辑块号映射到磁盘的物理块号。简单索引结构使用直接索引,即文件的每个逻辑块号直接对应一个物理块号,但这种方式对于大文件存在局限性,因为它能表示的文件大小受索引表大小的限制。多级索引则是在此基础上,将索引表本身也进行分层存储和管理,从而扩大了可表示的文件范围。
19. 文件目录
操作系统为每个文件或文件夹分配一个文件控制块(FCB),这些文件控制块组成了文件目录,用于文件或文件夹的检索。
文件控制块包含三类信息:
- 基本信息类:例如文件名、文件的物理地址、文件长度和文件块数等。
- 存取控制信息类:文件的存取权限,像 UNIX 用户分成文件拥有者、同组用户、其他用户三类,且都可以设置读(R)写(W)执行(X)权限。
- 使用信息类:文件建立日期、最后一次修改日期、最后一次访问日期、当前使用的信息(如打开文件的进程数、在文件上的等待队列)等。
20. 目录结构
文件目录结构的组织方式直接影响到文件的存取速度,关系到文件的共享性和安全性。常见的目录结构有 3 种:
- 一级目录结构:只有一个文件夹,该文件夹中直接存放所有文件。
- 二级目录结构:主目录下,每个用户都有自己的文件夹,直接存放自己的所有文件。
- 多级目录结构
21 位示图
位示图:在外存上建立一张位示图(bitmap),用二进制表示文件存储器中物理块的使用情况。0 表示空闲,1 表示占用。
字的编号有时从 0 开始,有时从 1 开始,具体根据题目判断。
因为位示图用每一位表示一个物理块的使用情况,所以其大小由磁盘空间大小(物理块总数)决定。题目中有时告诉字长,让计算物理块的使用情况需要用多少字来表示。
22. 杂题