前趋图与PV操作(信号量)
非常经典的前趋图与PV操作(信号量)题目。在软考的操作系统模块中,这类题几乎每年必考。在进程同步中,我们使用信号量(Semaphore, S)来控制执行顺序:
-
前趋进程(先做完的) :执行 V操作(V(S),相当于"发送信号/释放资源"),告诉后面的人"我做完了"。
-
后继进程(后开始的) :执行 P操作(P(S),相当于"等待信号/申请资源"),检查前面的人有没有做完。
口诀:前 V 后 P (箭头出发点写 V,箭头指向点写 P)。
操作系统分页存储管理
这是一道关于操作系统分页存储管理的基础计算题。这类题目在软考中属于送分题,只要掌握了"除法取整"和"页表映射"两个概念即可轻松搞定。地址转换(逻辑地址转物理页号)
核心概念:
在分页系统中,逻辑地址不是直接对应物理内存的,它被切割成了两部分:
-
页号 (Page Number):数据在第几页?
-
页内偏移 (Offset):数据在该页的第几个位置?
计算公式:
页号 = 逻辑地址 / 页面大小 (取整数部分)
页内偏移 = 逻辑地址 % 页面大小 (取余数部分)
流水线时间计算
1.基础定义
n = 指令条数
= 一条指令完整执行的时间(非流水线时间)
= 流水线周期(瓶颈时间)
k = 流水线级数
-
不使用流水线 :n*

-
使用流水线 :公式: (𝑘+𝑛−1) *
(公式:其中 k=级数, n=指令数)
2.最大吞吐率
1. 核心概念:木桶效应(瓶颈)
流水线的工作原理就像工厂的流水线。不管你的其他工序(取指、分析)做得多快,整个流水线的生产速度(也就是时钟周期
)只能取决于最慢的那一道工序。
2. 吞吐率计算
-
吞吐率 (TP):单位时间内处理指令的数量。
-
公式 :

3. 最大理论加速比
标准公式是

当任务量巨大时(n→∞)想象一下,如果不是执行 10 条指令,而是执行 10亿 条指令(n 非常大)。此时,分母里的 (k−1)(也就是流水线的建立时间)相对于 n 来说,小到可以忽略不计。公式就变成了:

把 n 约掉:

磁盘阵列(RAID)容量计算规则
1. 基础知识:RAID 5 是什么
-
特点:它把数据切块存在不同硬盘上,同时计算出一份"校验数据"(Parity)。
-
代价 :为了保证坏掉一块盘还能找回数据,RAID 5 必须消耗掉相当于 1 块硬盘容量的空间来存校验信息。
-
核心公式:可用容量=(𝑁−1)×单块盘容量(其中 N 是硬盘的总数量)
2. 场景一:三块盘大小一样
题目:3 块 80G 的硬盘做 RAID 5 这是最标准的情况。
-
损耗:必须扣除 1 块盘的空间存校验码。
-
计算:(3−1)×80G=2×80G=160G
3. 场景二:硬盘大小不一样
题目:2 块 80G + 1 块 40G 做 RAID 5。
解析 :这里涉及到一个极其重要的原则:木桶效应(短板效应)。
在组建标准 RAID 时,为了保证数据能整齐地切分和排列,所有硬盘的"有效容量"必须向最小的那块看齐。
-
短板:最小的盘是 40G。
-
后果:系统会强行把那两块 80G 的盘也当成 40G 来用。
-
80G 盘 A → 只用前 40G,剩下 40G 浪费掉。
-
80G 盘 B → 只用前 40G,剩下 40G 浪费掉。
-
40G 盘 C → 用满 40G。
-
-
现在的情况变成了 :相当于你有 3 块 40G 的硬盘在做 RAID 5。
4. 总结记忆公式
遇到 RAID 容量计算题,记住这两个步骤:
-
先看齐(切短板) :
如果硬盘大小不一样,先找到最小的那块。把所有硬盘的容量都视为这个最小容量(多余的舍弃)。
-
再扣除(算校验):
-
RAID 0:不扣除。容量 = N×最小容量。
-
RAID 1:扣一半(只有2块盘时)。容量 = 1×最小容量
-
RAID 5:扣一块。容量 = (𝑁−1)×最小容量
-
RAID 6:扣两块。容量 = (𝑁−2)×最小容量
-
磁盘I/O性能计算题
1. 核心参数提取
拿到题目,先在草稿纸上写下这三个数值:

(读取/传输时间):读取一个物理块需要的时间。
计算公式:𝑑=旋转周期/每道块数Tread=旋转周期/每道块数

(处理时间):CPU 处理一条记录的时间。
**3.**缓冲区类型:
-
单缓冲区:读和处理是串行的(读入->处理->读入...)。
-
双缓冲区:读和处理是并行的(处理第1个的同时,可以读第2个)。
2. 两种情况的计算公式
针对软考中的磁盘I/O性能计算题 (尤其是单/双缓冲区、优化/非优化分布),这类题目有非常固定的解题套路和"软考专用逻辑"。
2.1. 非优化分布(顺序存放)------ "错过等一圈"逻辑
场景 :数据按 𝑅1,𝑅2,𝑅3... 物理相邻存放。
逻辑:
读完 R1 花了 3ms。
接着处理 R1 花了 6ms。
关键点:在处理的这 6ms 里,磁盘还在转!它转过了 6/3= 个块。
后果 :当系统处理完 R1 想去读 R2 时,磁头已经越过了 R2 的位置(跑到了 R4 开头)。
惩罚:必须等磁盘转一整圈,再次回到 R2 的开头。
计算公式(前 N-1 个 + 最后一个): 
通常为了简化,可以直接算:N * 每条记录耗时 = N * (读取 + 处理 + 等待回转)。
2.2. 优化分布(间隔存放)------ "无缝衔接"逻辑
场景 :数据按 𝑅1,空,空,𝑅2...R1,空,空,R2... 间隔存放。
逻辑:
读完 R1 花了 3ms。
处理 R1 花了 6ms。
关键点:在这 6ms 里,磁盘转过了 2 个块的位置。
优化目标:我们将 R2 正好放在 R1 后面隔 2 个块的地方。
结果 :当 CPU 处理完 R1,磁头刚好 转到了 R2 的开头。不需要任何等待(寻道/旋转延迟为0)。
单缓冲区下的计算逻辑:
由于是单缓冲区,系统必须"读完 -> 才能处理 -> 处理完缓冲区空了 -> 才能再读"。哪怕物理位置对上了,你也必须先把 R1 处理完,才能发指令读 R2。
读 R1:3ms
处理 R1:6ms (此时磁头转到 R2 开头,完美!)
读 R2:3ms
处理 R2:6ms
...
总时间公式 :
3. 软考做题"秒杀"技巧
遇到这种题,直接套用以下经验:
-
非优化:时间特别长,通常是几百毫秒。

-
优化:时间短。
- 单缓冲区(最常见):

- 双缓冲区 (较少考):

最短移臂调度算法 (SSTF)
核心解题规则
1.第一优先级:移臂调度(找柱面/磁道)
-
原则:最短移臂调度(SSTF, Shortest Seek Time First)。
-
做法 :看当前磁头在哪里,下一步去离当前位置最近的那个柱面(Cylinder)。
-
原因:机械臂移动是最耗时的动作(毫秒级),必须优先优化。
2.第二优先级:旋转调度(找扇区)
-
原则 :当几个请求都在同一个柱面 上时,不需要移动机械臂了。此时为了减少等待磁盘旋转的时间,按照扇区号(Sector)从小到大的顺序处理(模拟磁盘旋转的方向)。
-
做法:柱面相同,谁的扇区号小,谁先执行。
3. 第三优先级(如有必要):磁头号
- 如果柱面和扇区都一样,通常按磁头号排序(电子切换速度极快),或者按照请求的先后顺序。
CRC 循环冗余校验码
1.计算逻辑
信息码字为111000110,生成多项式 G(x)=x^5+x^3+x+1,计算校验码,。
-
多项式转二进制:G(x) 对应 101011。
-
补位与模二除法:在信息码后加5个0(由x^5决定),用 11100011000000 除以 101011。
-
结果:余数为 11001,即为校验码,。理解核心在于模二除法不借位的运算规则。
2. 模二除法
不要像传统除法那样每一位都写商。我们只关注余数 。规则:
对齐:永远把除数的最高位 1,对齐被除数(或当前余数)的最高位 1。
异或:进行异或运算(相同为0,不同为1)。
拉位 :运算结果去掉开头的 0,然后从被除数后面把数字拉下来 。关键点 :如果拉下来后位数不够6位,就继续拉,直到凑够6位(或者首位是1)再进行下一次运算。
第 1 步:
11100000 (取前6位,首位是1,够除)
101011 (除数对齐)
------
010011 (异或结果)
10011 (去掉首位0,剩5位)
第 2 步:(拉下来一位 1,凑够6位)
10011 1 (拉下来1,变成6位,首位是1,够除)
10101 1 (除数对齐)
-------
00110 0 (异或结果)
110 0 (去掉首位两个0,剩4位)
第 3 步: (连续拉位 ------ 这是简便法的精髓)
-
当前余数:1100(4位)
-
拉一位 1 → 11001 (5位,不够除数6位 ,不要做运算,直接跳过)
-
再拉一位 0 → 110010 (6位,够了!)
11001 0 (凑够了6位,进行运算) 10101 1 ------- 01100 1 (异或结果) 1100 1 (去掉首位0,剩5位)
第 4 步:(继续拉位)
-
当前余数:11001(5位)
-
拉一位 0 → 110010 (6位,够了)
-
观察:这一步和第3步一模一样!说明进入了循环模式。
11001 0 10101 1 ------- 01100 1 1100 1 (去掉首位0,剩5位)
第 5 步:(继续拉位)
-
当前余数:11001
-
拉一位 0 → 110010
-
继续一样的运算...
11001 0 10101 1 ------- 1100 1
第 6 步:(最后一位 0)
-
当前余数:11001
-
拉一位 0 → 110010
-
最后一次运算...
11001 0 10101 1 ------- 1100 1 (最终余数)
最终剩下的 5 位数是 11001。
考场操作建议:
在草稿纸上,按照上面的阶梯状格式写,每次运算完划掉前面的0,不够就往下拉,直到被除数的所有位都被拉完为止。
文件索引节点法

1. 计算核心参数("一把钥匙开多少锁")
这是所有计算的基础。
-
磁盘块大小:1KB = 1024 字节。
-
地址项大小:4 字节。
-
一个索引块能存多少地址 :1024÷4=256 个。
- 理解: 当我们要用"间接索引"时,系统会拿出一个空的磁盘块专门存地址。这个块能存 256 个指向数据块的指针。
2. 划分各个地址项的"势力范围"
数据块是从 0 开始编号的。我们来看看这 8 个地址项(iaddr[0]~iaddr[7])分别管到哪里:
1. 直接地址索引(iaddr[0] ~ iaddr[4])
-
数量:共 5 个地址项。
-
负责范围 :逻辑块号 0 ~ 4(共 5 个块)。
-
结论 :如果要找 逻辑块号 1 ,它就在这个范围内。所以第 1 个空填:直接地址索引。
2. 一级间接地址索引(iaddr[5]、iaddr[6])
-
原理:这两项不直接存数据,而是指向两个"索引块"。
-
iaddr[5] 能管多少? 256 个块。
- 接在直接索引后面,范围是:5∼(5+256−1)=5∼260
-
iaddr[6] 能管多少? 又是一个 256 个块。
- 接在 iaddr[5] 后面,范围是:261∼(261+256−1)=261∼516
-
累计范围 :目前 0~6 号地址项总共管到了 516 号逻辑块。
3. 更高级别的索引(iaddr[7])
-
现状 :我们要找的是 逻辑块号 518。
-
比对:518 已经超过了前面一级间接索引管辖的最大范围(516)。
-
结论 :518 必须存放在下一级地址项,即 iaddr[7] 中。
3. 做题套路总结
-
算出 块大小 / 地址大小(通常是 256 或 128)。
-
列出直接索引能到多少(比如 0-4)。
-
一级索引就是在直接索引的基础上加 256(或 256 的倍数)。
-
如果题目问的块号大于 一级索引的最大值,不用犹豫,直接选二级间接。