[面试题] 页表和段表分别是什么?分页和分段有什么区别?
📖 版块 A:知识讲解版 (温故知新)
- 页表(Page Table):
- 分页管理中的核心数据结构。
- 负责建立“虚拟页号 -> 物理块号”的映射关系。
- 程序访问地址时,硬件会根据页号查页表,再定位到具体物理页框。
- 段表(Segment Table):
- 分段管理中的核心数据结构。
- 每一项通常记录段基址、段长度以及访问权限等信息。
- 逻辑地址一般写成“段号 + 段内偏移”。
- 分页和分段的核心区别:
- 划分依据不同:
- 分页按固定大小切分。
- 分段按逻辑意义切分。
- 长度是否固定不同:
- 页大小固定。
- 段长度可变。
- 语义不同:
- 页对程序员基本无感,没有业务语义。
- 段通常有明确语义,比如代码段、数据段、栈段。
- 碎片类型不同:
- 分页基本避免外部碎片,但可能有内部碎片。
- 分段容易产生外部碎片。
- 划分依据不同:
- 一句话总结:
- 分页偏管理效率,分段偏逻辑表达。
🎤 版块 B:面试实战版 (高手逐字稿)
Q:页表和段表分别是什么?分页和分段有什么区别?
🧠 破局思路:这题最怕答成“分页固定、分段不固定”就结束了。真正能拉开差距的是你把“操作系统视角”和“程序员视角”都说出来。
💬 高手逐字稿:
先说页表和段表是什么。
如果操作系统采用的是分页管理,那么核心数据结构就是页表。页表的作用非常直接:把虚拟地址里的页号,映射到物理内存里的页框号。程序访问一个地址时,硬件会先根据页号去查页表,找到对应的物理块,再结合页内偏移定位到真正的物理地址。
如果采用的是分段管理,那对应的核心数据结构就是段表。段表里通常记录每个段的基址、长度以及权限信息。程序地址一般表示成“段号 + 偏移量”,系统先通过段号找到段表项,再检查偏移量是否越界,最后定位实际地址。
接下来再说分页和分段的区别。我一般会从四个角度答。
第一,划分方式不同。分页是按固定大小切分,页和页之间没有逻辑含义;分段是按程序逻辑切分,比如代码段、数据段、栈段。
第二,长度特征不同。页的大小是固定的,由系统预先规定;段的大小是可变的,取决于程序本身的逻辑结构。
第三,面向的目标不同。分页更像是操作系统为了方便内存管理做的抽象,核心目标是规整和高效;分段更像是为了贴近程序员的认知模型,强调逻辑意义和边界。
第四,碎片问题不同。分页通常不会有严重的外部碎片,但可能会因为最后一页没装满而产生内部碎片;分段由于每段长度不固定,更容易产生外部碎片。
所以如果一句话总结:分页是“为系统管理服务”的,分段是“为程序逻辑服务”的。
这也是为什么现代操作系统里,经常会把两者结合起来,最后演化成段页式管理。
最后更新于: