ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

磁盘地址结构:CHS柱面号、盘面号、扇区号与线性块号换算

磁盘地址结构:CHS柱面号、盘面号、扇区号与线性块号换算 1. 从一次栽跟头说起磁盘地址结构为什么值得单独拎出来讲很多人第一次接触磁盘地址结构都是在操作系统课的存储管理章节看到“柱面号、盘面号、扇区号”这几个词第一反应是背公式第二反应是考完就忘。我当年也是这样直到后来做存储相关的项目要把一个线性块号翻译回物理位置才发现这三个编号参数背后其实藏着一整套“机械装置怎么省时间”的设计哲学。磁盘地址结构这个东西说简单点就是给硬盘上的每一块存储空间起一个三维坐标说复杂点它是操作系统块设备抽象与物理硬件之间的那层翻译表。这篇文章我想聊的就是柱面号、盘面号、扇区号这三个东西各自代表什么、它们的编号顺序为什么不能随便定、以及最常考的“给定参数算容量、给定块号算地址”这类题到底怎么一步步推出来。适合两类人看一类是正在啃操作系统、计算机组成原理被地址换算绕晕的同学另一类是做底层开发、嵌入式存储、或者面试前需要临时把这块捡起来的工程师。前者能拿到一套能直接套用的计算流程后者能重新理解为什么现代磁盘和文件系统的块映射是这么设计的。我先给个结论免得你看到后面才回过味来磁盘地址结构的核心就是用小范围的三维编号C/H/S去换机械部件移动次数最少。所有公式、所有编号顺序、所有考题的坑都围绕这一句话展开。你把这个逻辑吃透了公式根本不用背现场就能推。2. 柱面、盘面、扇区三个编号参数到底在描述什么在动手算之前必须先把物理结构对齐。很多题目做错不是算错而是压根没搞清“盘面”和“磁头”是不是一回事、“柱面”和“磁道”能不能互换。这几个概念一旦混了后面所有计算都会连环塌方。2.1 盘面号与磁头号同一个东西的两个叫法一个硬盘里通常叠着好几张盘片platter每张盘片有两个面都能记录数据每个面对应一个磁头head。所以“盘面号”和“磁头号”说的是同一个维度的东西第几个记录面就等于第几个磁头。这里有个面试爱考的细节如果一个硬盘有 N 张盘片那记录面也就是磁头数一般是 2N。但要注意有些老式硬盘会保留一个面做伺服信息实际可用的盘面数不等于 2N。不过在课程计算题里默认每个面都能用所以直接乘 2 就行。我见过太多人算容量时只乘了盘片数忘了乘 2结果差一半血的教训。盘面号的取值范围是 0 到盘面数 - 1。为什么从 0 开始因为它是编号不是计数。计数是“有几个”编号是“第几个”。“第 0 个盘面”这种说法虽然别扭但在寻址里非常自然因为偏移量天然从 0 起算。2.2 柱面号与磁道号同心圆上的等价概念单个盘面上磁头划过的那个同心圆轨迹叫磁道track。所有盘面上半径相同的那些磁道摞在一起从空间上看就是一个圆柱面这就是柱面cylinder。所以有一条非常关键的等价关系柱面号 磁道号并且柱面数 单个盘面上的磁道数。你在题目里看到“每面 200 个磁道”和“200 个柱面”说的是同一件事。理解这一点的意义在于换柱面意味着磁头要径向移动也就是要寻道这是机械动作最慢而在同一个柱面内切换盘面只是电子信号切换磁头几乎不花时间。这个时间差直接决定了后面编号顺序的设计。柱面号一般从最外层开始编号为 0。为什么从外层开始因为外层磁道的线速度大同样转一圈能读更多数据历史上老硬盘从外圈开始用效率更高。这个细节考试通常不追问但知道来龙去脉能帮你记住方向。2.3 扇区号最小的物理读写单元每个磁道会被等分成若干段圆弧每一段就是一个扇区sector。扇区是磁盘读写的最小物理单位常见大小是 512 字节现代大容量盘也有 4096 字节的。磁头读到目标位置后不是想读多少读多少而是至少把一个扇区整个读出来。这里有个巨大的坑扇区号通常从 1 开始而柱面号和盘面号从 0 开始。也就是说某磁道上第一个扇区的扇区号是 1不是 0。这个不一致性直接导致了后面正向和反向计算的公式里要加一减一也是考试失分重灾区。为什么历史上这么设计说法不一有的是受早期格式规范影响有的纯粹是历史遗留。不管原因你只要记住这个不对称计算时别搞反就行。3. 编号顺序的讲究为什么先扫完一个柱面再换柱面搞清了三个维度接下来的问题才是真正拉开理解差距的地方这三万多个扇区系统到底按什么顺序给它们排线性地址是先编完一个盘面再换下一个还是先编完一个柱面这个顺序不是拍脑袋定的它直接对应性能。3.1 地址递增的物理顺序主流教材和真实硬盘采用的编号顺序是先扇区再盘面最后柱面。翻译成人话就是同一个柱面内先把所有盘面的扇区按盘面号依次编完每换一个盘面只是切换磁头不用移动磁臂再进入下一个柱面。举个具体例子帮助建立直觉。假设有 2 个盘面、每道 4 个扇区。线性块号从 0 开始的排列是这样的线性块号柱面号盘面号扇区号000110022003300440115012601370148101看到没块号 0 到 3 是柱面 0、盘面 0 上的四个扇区块号 4 到 7 换到了柱面 0、盘面 1直到整个柱面 0 的两个盘面都编完块号 8 才跳到柱面 1。这个顺序就是“柱面内优先”。3.2 寻道时间、旋转延迟与编号策略的联动为什么这么排因为磁盘寻址的总时间大致由三块组成寻道时间磁臂径向移动到目标柱面、旋转延迟等目标扇区转到磁头下、传输时间实际读写数据。其中寻道是纯机械动作最慢往往占大头。如果编号顺序改成“先编完一个盘面再换盘面再换柱面”那么读取连续数据时磁头读完一个柱面的一圈要跳到别的盘面继续等到把所有盘面都读完才换柱面。这期间磁臂本来可以不动现在却要为了换盘面之外的目标反复折腾。而按“柱面内优先”编号连续的逻辑块在物理上尽可能落在同一个柱面磁头只需要切换磁头或等待旋转几乎不寻道吞吐量自然高。这也解释了为什么文件系统倾向于把大文件的数据块分散在同一个柱面周围以及为什么早期磁盘调度算法比如先来先服务、最短寻道优先要专门优化磁臂移动。编号顺序和调度算法本质是同一套“少动机械部件”思想的两种体现。现代硬盘虽然普遍用 LBA 线性寻址把 CHS 藏在固件里但这套物理顺序的思想仍然活在固件的地址映射表里。4. 三组核心公式与地址换算的完整流程前面都是铺垫从这里开始进入可以“抄作业”的部分。我会把容量计算、正向换算CHS 转线性块号、反向换算线性块号还原 CHS三件事分开讲每一件都给出推导过程保证你不是死记而是能推。4.1 容量公式一步都别省磁盘的非格式化容量就是把所有记录面、所有磁道、所有扇区乘起来再乘扇区大小容量 柱面数 × 盘面数 × 每道扇区数 × 每扇区字节数注意几个易错点。第一盘面数 盘片数 × 2别只写盘片数。第二柱面数等于单个盘面的磁道数不是磁道总数磁道总数应该是柱面数 × 盘面数。第三单位换算要小心512 字节乘出来通常是 Byte题目有时要求 KB 或 MB1 KB 1024 B1 MB 1024 KB别用 1000 去约。我拿个例子走一遍某磁盘组 6 张盘片、每面 200 个磁道、每道 16 个扇区、每扇区 512 B。记录面数 6 × 2 12。容量 200柱面 × 12盘面 × 16扇区/道 × 512 B 200 × 12 24002400 × 16 38400 个扇区38400 × 512 19,660,800 B。换成 MB 就是 19,660,800 / 1024 / 1024 ≈ 18.75 MB。整个推导没有任何跳跃你只要保证每一步的物理意义对得上就行。4.2 正向换算从柱面号、盘面号、扇区号推出线性块号现在把三维坐标合成一个线性地址。设盘面数为 H每道扇区数为 S线性块号从 0 开始扇区号从 1 开始那么块号 柱面号 × (H × S) 盘面号 × S (扇区号 − 1)拆开理解每换一个柱面要跨过 H × S 个扇区每换一个盘面要跨过 S 个扇区扇区号本身从 1 开始所以减 1 得到柱面内的扇区偏移。用第 3 节那个小例子验证2 盘面、每道 4 扇区。取柱面 1、盘面 0、扇区 1代入得 1 × (2×4) 0 × 4 (1−1) 8正好对应表格里的块号 8。再取柱面 0、盘面 1、扇区 4得 0 1×4 (4−1) 7也对上了。公式不是背来的是数出来的。这里提醒一句如果你的题目里扇区号是从 0 开始的少数教材这么设定那个减 1 就要去掉。所以拿到题第一件事先确认扇区号起点这一步错了后面全错。4.3 反向换算从线性块号还原出柱面号、盘面号、扇区号反向换算是考试最爱考的也是实际做存储时最常用的。给定块号 b设每柱面扇区数 P H × S则柱面号 b ÷ P 向下取整柱面内偏移 b mod P盘面号 柱面内偏移 ÷ S 向下取整扇区号 (柱面内偏移 mod S) 1我把它写成一个可运行的脚本你可以改参数直接验证这在检查手算结果时特别有用def chs_from_block(block, heads, sectors_per_track): per_cylinder heads * sectors_per_track cylinder block // per_cylinder offset block % per_cylinder head offset // sectors_per_track sector offset % sectors_per_track 1 return cylinder, head, sector # 验证第3节的小例子 for b in range(9): print(b, chs_from_block(b, heads2, sectors_per_track4))跑出来的结果和前面表格完全一致。你可能觉得这么简单的题不值得写脚本但换成柱面几百、扇区几十的参数手算取模很容易错位脚本几秒钟就能验完。我做地址映射相关项目时养成一个习惯任何换算逻辑先用脚本穷举小规模验证再上真实参数。这个习惯帮我省过不少返工。5. 典型例题全解把公式真正用起来光看公式没用得在题目里滚一遍。下面三道题覆盖了最常见的考法我会把每一步的思考过程都写出来而不是只给答案。5.1 例题一给定磁盘参数求容量与块号分布题目某磁盘有 100 个柱面8 个盘面每道 16 个扇区每扇区 512 B。1求总容量2求块号 300 对应的柱面号、盘面号、扇区号。第一问直接套容量公式100 × 8 × 16 × 512 B 100×8800800×1612800 个扇区12800×512 6,553,600 B 6400 KB 6.25 MB。第二问先算每柱面扇区数 P 8 × 16 128。柱面号 300 ÷ 128 2因为 2×1282563×128384 超过 300向下取整得 2。柱面内偏移 300 − 256 44。盘面号 44 ÷ 16 22×16323×1648 超了。扇区号 (44 − 32) 1 13。所以答案是柱面 2、盘面 2、扇区 13。回代验证2×128 2×16 (13−1) 256 32 12 300对上了。这种回代是我强烈建议养成的习惯正向反向互验一次就能抓出取整或减一的错误。5.2 例题二扇区号起点的陷阱题目某磁盘每柱面有 20 个扇区、4 个盘面扇区号从 1 开始、柱面号和盘面号从 0 开始。已知某数据的地址是柱面 5、盘面 3、扇区 18请问它的线性块号是多少另外这个磁盘一共有 50 个柱面最后一个扇区的块号是多少第一问用正向公式块号 5 × (4×20) 3 × 20 (18−1) 5×80 60 17 400 60 17 477。第二问最后一个扇区就是柱面号最大、盘面号最大、扇区号最大。柱面号 49、盘面号 3、扇区号 20块号 49 × 80 3 × 20 (20−1) 3920 60 19 3999。总块数应该是 50 × 4 × 20 4000 块块号从 0 到 3999正好 4000 个验证通过。这道题的坑在于如果误以为扇区号从 0 开始第一问会算成 476第二问会算成 4000两个都错。所以再强调一次拿到题先看扇区号起点。5.3 例题三混合参数与传输率计算题目某硬盘转速 7200 r/min每道 32 个扇区每扇区 512 B共 500 个柱面、16 个盘面。1求平均旋转延迟2求数据传输率3求总容量。第一问转速 7200 r/min 120 r/s转一圈耗时 1/120 s ≈ 8.33 ms。平均旋转延迟是半圈的时间即 8.33 / 2 ≈ 4.17 ms。之所以取半圈是因为目标扇区随机分布平均要等半圈才转到磁头下。第二问数据传输率 每道字节数 × 每秒转数 (32 × 512) × 120 16384 × 120 1,966,080 B/s ≈ 1.875 MB/s。注意这里用的是“每秒转数”而不是“每分钟”单位容易错。第三问容量 500 × 16 × 32 × 512 B 500×1680008000×32256000 个扇区256000×512 131,072,000 B 128,000 KB 125 MB。这道题把几何参数和时间参数结合了起来实际工程里估算一个老磁盘的吞吐量也是这么算的。虽然现在 SSD 已经不用这套模型但理解这个计算能帮你想清楚“为什么机械盘随机读写那么慢”——因为每一次随机访问都要摊上一整个寻道加旋转延迟。6. 常见问题与避坑速查理论讲完了最后这部分是我踩过的坑和你大概也会踩的坑整理成能直接查的形式考前扫一眼能救好几分。6.1 编号起点的三个高频错误第一个错误是盘面数忘了乘 2。看到“6 张盘片”就写 6实际记录面是 12。第二个错误是扇区号起点搞反公式里的 ±1 加错位置。第三个错误是柱面号方向搞错以为从内圈开始。这三个错误每一个都会让整道题归零所以做题时先把“起点表”写在草稿纸角上参数常见起点备注柱面号0从外圈开始盘面号磁头号0第一个记录面扇区号1高频陷阱部分教材从 0线性块号0LBA 逻辑地址6.2 单位换算与取整的坑单位方面磁盘容量题默认 1 KB 1024 B但有些厂商标称用 1000题目没说明时按 1024 走。取整方面反向换算全是向下取整Python 里用//C 语言里整数除法天然向下取整正数情况下。如果你用浮点除法再取整可能因为精度问题在边界值上出错比如 300/128 算成 2.9999取整就成 2 错了。所以一律用整数运算。6.3 地址换算问题速查表我把最常见的问题和对应处理方式列成表遇到卡壳直接查现象可能原因解决方向算出的块号比实际多 1扇区号减一忘了做检查公式里的(扇区号 − 1)容量比别人少一半盘面数没乘 2记录面数 盘片数 × 2柱面号算出来偏大每柱面扇区数算错P 盘面数 × 每道扇区数反向换算盘面号越界柱面内偏移算错用b mod P而不是b mod S边界块号对不上扇区号起点判断错先确认题目扇区从 0 还是 1提示任何一道地址换算题做完之后都把结果回代进正向公式验算一遍。这一步只要十秒却能抓住绝大多数错误。我个人在实际做底层存储相关工作时体会最深的一点是磁盘地址结构这套 CHS 模型虽然现在被 LBA 和 SSD 淡化了但它训练的是“把抽象逻辑地址翻译回物理约束”的思维方式。你写文件系统、做块设备驱动、甚至优化数据库的页布局脑子里都得有这张物理映射图。CHS 只是最经典的那一版教学模型把它吃透了后面看 LBA 映射、看闪存的页和块结构会发现底层逻辑是相通的。
返回列表