2026/10/12 21:02:26

位示图计算不再丢分:从公式推导到避坑清单全解析

位示图计算不再丢分:从公式推导到避坑清单全解析 备考26年软考系统架构设计师的同学十有八九在操作系统这个板块遇到过位示图也常写作位图——题目看着特别简单就一张小表、几个编号算来算去不过加减乘除。可偏偏就是这种题每次考完对答案总有人对不上。明明公式背得滚瓜烂熟选出来的答案和标准答案却差一位。我见过太多人在这上面栽跟头包括不少已经刷完一整本真题的选手。位示图这2~3分丢得实在冤枉因为它的计算量真的不大所有题目都围绕“字、位、物理块号”三者之间的双向换算展开。这篇文章就把位示图从底层模型到公式推导、从分配回收流程到四类高频题型的完整演算链条都铺开讲一遍再把考场上最容易踩的坑列清楚。目标是让你看完之后不管题目按哪种编号约定出都能稳算出正确答案。1. 位示图到底在考什么——先把模型吃透再动手算1.1 一个bit对应一个物理块位示图解决的核心问题是操作系统怎么记录磁盘上哪些块空闲、哪些块已被占用。最朴素的想法是给每个物理块建一条记录但这在磁盘上要占多少空间物理块动辄几百万上千万个每条记录哪怕只有几个字节最后的开销也大得离谱。所以操作系统用了一个很聪明的办法物理块的状态只有两种要么空闲要么占用一个二进制位就足够表达。于是整个磁盘的所有物理块可以用一串bit来表示。每个bit的编号位置对应一个物理块号bit为0表示对应块空闲bit为1表示对应块已被分配。这一整串bit按固定长度划分成一组一组每一组称为一个“字”或“一行”。这个结构就是位示图。类比一下位示图就像停车场入口那块电子空位显示屏每个车位对应一个小灯灯亮表示有车灯灭表示空着。只不过计算机里的小灯是一个个bit你要能根据车位号的数学关系反推出“第几排第几个灯”也能根据某个灯的位置算出“它管的是哪个车位”。1.2 位示图在考试题里的常见数字实际考题里位示图经常以整数矩阵的形式出现每行对应一个字每列对应一个位矩阵里填0或1。比如一个16×16的方阵能表示256个物理块的使用状态一个32×32的方阵能表示1024个物理块。题目通常会给以下信息中的一部分磁盘总容量和物理块大小用于求总块数每个字长多少位常见16位或32位字、位、物理块号分别从几开始编号位示图的初始状态或当前状态这里面最容易被忽视、也最导致计算错误的就是起始编号问题。不同教材、不同真题出现过三种约定下面第2章会全部展开。1.3 拿到题目先做三件事我不管刷题还是上考场拿到位示图题目后的第一步永远是同一个套路——先别急着代公式先在草稿纸上圈三个信息每个字多少位这个数决定了除法里的除数也是最容易看走眼的。字、位、物理块号的起始编号分别是什么这决定了公式里哪些位置要加1、哪些不用加。题目要求的是正向换算字位找块号还是反向换算块号找字位这三件事确认完这道题就已经稳了一半。很多同学失分不是因为不会算而是根本没有意识到题目给的编号规则和自己背的公式不是同一种。2. 核心公式推导三种编号约定别让公式坑了你2.1 约定一字从0开始、位从0开始、物理块号从1开始这是最常见的教材约定。位示图的第一个字是“第0字”第一个位是“第0位”但磁盘上第一个物理块是“第1块”。正向推导很简单。第0字第0位是第一个bit它管理第1块第0字第1位是第二个bit管理第2块第0字第n-1位管理第n块。也就是第0字全部满的时候对应块号1到n。来到第1字第0位是第n1个bit对应块号n1。于是规律是第i字、第j位对应的物理块号b i × n j 1反向换算就是把这个公式倒推。已知物理块号b想找它对应的字位i (b - 1) div nj (b - 1) mod n这里div表示整除取商mod表示取余数。物理块号为什么要先减1因为块号从1开始而bit位置从0开始两者起点差1。先减1之后就把块号问题翻译成了“第几个从0数起的bit位置”的问题。2.2 约定二字从1开始、位从1开始、物理块号从1开始部分教材和真题采用另一种编号方式字、位、块都从1开始。这时候第一个bit是“第1字、第1位”管理第1块第1字、第2位管理第2块。公式变成第i字、第j位对应的物理块号b (i - 1) × n j反向换算i (b - 1) div n 1j (b - 1) mod n 1对比一下就能看出来约定二只是把“第1字”当作约定一的“第0字”再加1位。如果不小心把约定一的公式直接套到约定二的题目里同样的一组字位算出来的块号会比正确答案小1反过来也一样。2.3 约定三字从0开始、位从0开始、物理块号也从0开始第三种约定纯粹是按程序员习惯来的全从0开始。三位一体公式最清爽第i字、第j位对应的物理块号b i × n j反向换算i b div nj b mod n这类约定在一些偏代码风格的题目里会出现。看着简单实际上比前两种更隐蔽因为它要求你全程记住“第0块”是真实存在的有些题把物理块号写成从0开始有些写从1开始混在一起极易搞混。三种约定的公式对比如下约定方式字位找块号块号找字位适用习惯字0位0块1b i × n j 1i (b-1) div nj (b-1) mod n多数教材默认字1位1块1b (i-1) × n ji (b-1) div n 1j (b-1) mod n 1部分教材与真题字0位0块0b i × n ji b div nj b mod n代码风格、部分题目2.4 快速判断编号约定的方法万一题目没有明说起始编号呢这是考场上的大坑。有些题目会写“字从0开始编号位从0开始编号物理块号从0开始编号”那自然用约定三写得清清楚楚“物理块号从1开始”就用约定一或约定二。如果题目只字未提我建议先用约定一算一个结果再反向验算一遍看题目状态表是否自洽。但如果标准答案给的是约定三的数字你对答案时会发现差一位。实务中遇到这种情况其实就是读题漏了条件因为规范命题的题目不可能不交代编号规则。所以做题前宁可多花十秒钟把这句话找出来。3. 分配与回收的完整操作流程3.1 分配物理块的四步走位示图题目里分配流程考得最多。系统要为文件分配一个新物理块时完整流程如下扫描位示图找第一个为0的bit如果题目指定了具体字位就直接用那个位置。根据找到的字号i、位号j套用对应的正向公式算出物理块号b。把位示图中的该位从0改成1表示这块已经被人占了。将物理块号b返回给文件系统文件就可以使用这个块了。简单记就是找0、算号、置1、返回。小考一下位示图某个bit为0表示什么表示它对应的物理块空闲。为1呢表示占用。这个语义千万别弄反有些题会故意裹一层“该位为0则分配出去后该位变为几”的陷阱。3.2 回收物理块的两步走回收是分配的逆过程。当文件被删除、所占物理块释放时根据物理块号b套用反向公式计算它对应的字号i、位号j。把位示图中该位置0。回收只有两步但反向公式涉及除法取余数步骤多是计算错误的集中区。考场上回收题的正确率往往比分配题低不是因为思路不懂而是数字算得急。3.3 一进一出一验算我的习惯是分配和回收题目做完之后马上反向验算一遍。正向算出来的块号再代回反向公式如果能走回原来的字位说明计算没问题。这个过程只需要十几秒但能过滤掉九成以上的低级错误。举个例子感受一下。假设每个字16位采用约定一字0位0块1位示图第1字第2位当前为0。分配这块时块号 1×1621 19。验算19-11818 div 16 118 mod 16 2正好回到第1字第2位闭合。再把块号19回收第1字第2位置0也闭合。一个小闭环做完这道题基本不可能错。4. 高频题型与完整计算演示4.1 题型一磁盘容量和位示图占多大这类题先让你算总块数再算位示图需要多少个字、占多少字节。核心是单位换算和除法取整。举个例子某磁盘容量为16GB物理块大小为4KB每个字32位。问磁盘共有多少物理块位示图至少需要多少个字位示图占用的存储空间是多少字节第一步先统一单位。16GB换算成KB16 × 1024 × 1024 16777216KB。物理块大小4KB总块数 16777216 ÷ 4 4194304块。第二步每个字32位能管理32个物理块所以需要的字数 4194304 ÷ 32 131072字。第三步每个字32位就是4字节位示图占用空间 131072 × 4 524288字节也就是512KB。这里有个隐藏结论值得记下来位示图占用的字节数只和物理块总数有关和字长无关。因为每个物理块只需要1个bit总bit数就是物理块总数字节数就是总块数除以8。所以16GB磁盘配4KB块无论字长是16还是32位示图都是512KB。字长决定的只是把这么多bit分成多少个组。再补一个细节512KB的位示图本身也要占磁盘空间也就是要占用 512KB ÷ 4KB 128个物理块。这128块在初始化位示图时通常会被标记为占用。如果题目问“位示图占用多少个物理块”要记得做这一步。如果块数除不尽比如物理块总数是1000每个字32位那么1000÷32 31.25不能只准备31个字因为最后一个字还有剩余位要容纳剩下的8个块所以必须向上取整为32个字。这个“向上取整”是容量计算题的标准考点。4.2 题型二正向换算字位找块号题目可能会给位示图的状态然后问第几字第几位对应的物理块号是多少。这种题看着简单坑全在编号规则上。假设每个字32位题目明确说明字从0开始编号、位从0开始编号、物理块号从1开始编号。问第10字第15位对应几号块套约定一公式b 10×32151 336块。如果把最后那个“1”漏了答案就成了335正好差1。这种题失分的重灾区就是这个1。如果同一道题改成字从1开始、位从1开始、块从1开始问第10字第15位对应几号块套约定二公式b (10-1)×3215 303块。同一个“第10字、第15位”在不同约定下的结果差了33号。所以任何公式背诵都不如先确认约定来得实在。4.3 题型三反向换算块号找字位回收场景常考反向换算。比如每个字16位约定为字0位0块1现在要回收物理块520它对应位示图的第几字第几位公式i (b-1) div 16j (b-1) mod 16。b-1 519519 ÷ 16 32 余 7 不对32×16512余7但519÷16商应该是32余7。重新算16×32512519-5127所以商32、余7。i 32j 7所以对应第32字第7位。再验证一下32×1671 520正确。再换约定二字1位1块1同样先算b-1 519i 519 div 16 1 321 33j 519 mod 16 1 71 8所以对应第33字第8位。验证(33-1)×168 520正确。注意这里特别容易算错的是用整除结果32加1得到33时余数7也要加1得到8。很多同学加一半、不加另一半最后怎么都对不上。4.4 题型四连续分配多个块后的状态这种题会问你位示图初始全0系统按顺序分配若干物理块后第几个字的数值变成多少。表面考二进制实际还是考映射关系。假设每个字16位约定为字0位0块1初始全部为0。系统连续分配20个物理块分配顺序是每次从最小字位找到0就分配。问分配完之后第0字和第1字的数值。模拟一下块1对应字0位0块2对应字0位1一直到块16对应字0位15所以前16块分配完字0的全部16位都变成1字0的值为0xFFFF。接着第17块对应字1位0第18块对应字1位1第19块对应字1位2第20块对应字1位3。所以字1只有低4位为1值为0x000F。这里还有一个容易吵起来的细节字0的位0到底是最低位还是最高位。如果位0对应一个16位二进制数的最高位那么字1的值就变成0xF000而不是0x000F。题目如果画了位示图矩阵通常看矩阵的列方向就能判断如果题目只说“某字的值”默认情况下是从低位到高位编号。考场上遇到这类描述我会顺手在草稿纸上标注“位0在最右边”避免后面转十六进制时搞反。如果继续分配第21个物理块对应字1位4字1会变成0x001F第22块对应字1位5变成0x003F。按这个规律连续分配16块是一个周期每个周期完整占满一个字的16位。5. 避坑清单与考场自查口诀5.1 六个高频出错点把过去遇到的和学员问过的错题归类位示图的计算错误基本逃不出下面六条每字位数看错。题目写32位心里记成16位或者反过来。这个直接导致结果翻倍或减半。物理块号起始编号看错。块从1开始公式忘了加1块从0开始反而多加了1。反向换算是先减1还是先除顺序搞混。正确顺序是先减1再整除再取余。先除后减的算法在块号恰好是字长的整数倍时一定出错。取余之后忘了按编号约定调整。字位从1开始时商和余数都要加1只加一个答案就是错的。容量单位换算偷懒。1GB按1000MB算还是按1024MB算软考的常规做法按1024。题目如果给了换算关系必须按题目来。除不尽时忘了向上取整。31.25个字必须准备32个字很多同学取整取成31最后少算一块。5.2 考场上的两分钟自查流程我的固定动作是这样的第一步把字号、位号、物理块号的起始编号在题目里圈出来没写的就默认“字0位0块1”但一定在草稿纸上写明这个假设。第二步把对应公式抄在草稿纸空白处防止算到一半混乱。第三步代入计算后如果时间允许用反向公式验算。整个流程下来大概两分钟但换来的是确定性和正确率。这里还要提醒一句位示图题目一旦出现“第几行第几列”的说法本质就是在说“第几字第几位”。不要因为这个措辞被绕进去行的编号往往就是字的编号列的编号就是位的编号。但依然要先确认它们从0开始还是从1开始。5.3 考前专项练习建议位示图这个考点本身不大不建议花大量时间刷难题。我的建议是把手头真题里所有位示图题目收集到一起按四种题型各练一两道然后重点做三类事一是把自己容易错的编号约定整理成一句话比如“先减一、除字长、商是字、余是位符合起始编号再调整”二是专门练单位换算GB到KB再到块每一步都写清楚除数三是把分配流程和回收流程分别写成四步和两步的清单反复对照记忆。做到这三样这个考点就可以封存了。备考最后两周我个人的体会是位示图的题不怕难怕乱。它考的不是智力而是做题习惯。一个把“读题先看编号约定”当作肌肉记忆的人和那个上来就套公式的人在这道题上的差距不是在计算能力上拉开的而是那关键的“差1”拉开的。希望你在考场上面对位示图时能有一种“这题我已经彻底吃透了”的安心感而不是又在祈祷这次碰巧和标准答案一致。