当前位置: 首页 > news >正文

段式存储、页式存储、段页式存储:三种内存管理策略的演进与权衡

段式存储、页式存储、段页式存储:三种内存管理策略的演进与权衡

在现代操作系统与计算机体系结构中,内存管理单元(MMU)通过“段”“页”两种粒度把逻辑地址映射到物理地址。段式、页式、段页式三种机制决定了地址转换效率、内存碎片、共享与保护能力,是操作系统、编译器、虚拟化、嵌入式系统设计的核心基础。


一、三种机制总览

维度段式存储页式存储段页式存储
逻辑划分单位段(Segment)页(Page)先分段再分页
物理划分单位连续物理块固定大小页框段内再分页
地址结构段号+段内偏移页号+页内偏移段号+页号+页内偏移
碎片类型外部碎片内部碎片外部+内部(可控)
共享粒度段级共享页级共享段级共享+页级映射
硬件支持段表寄存器、界限寄存器TLB、页表寄存器段表+页表+TLB
典型系统早期 80286、Unix System Vx86 32/64 位、ARMv8x86 保护模式、Linux 用户态
段式
基址+界限
页式
页框号
段页式
逻辑地址
段表
物理地址
页表
段表
页表

二、知识点详解

2.1 段式存储(Segmentation)

段式存储把程序按逻辑意义划分为若干“段”,如代码段、数据段、堆段、栈段。每个段在内存中占据一段连续区域,由操作系统维护一张段表(Segment Table),表项包含:

  • 段基址(Base):段在物理内存的起始地址
  • 段界限(Limit):段的最大长度
  • 保护位:读/写/执行权限
  • 存在位、有效位等

地址转换过程:
逻辑地址 = 段号 + 段内偏移
若偏移 ≤ Limit,则物理地址 = Base + 偏移;否则触发段越界异常。

优点

  • 逻辑与物理视图一致,便于共享、保护、动态扩展。
  • 支持可变长段,无内部碎片。

缺点

  • 段长可变,频繁分配/释放导致外部碎片严重。
  • 需要连续物理区域,内存利用率随运行时间下降。
2.2 页式存储(Paging)

页式存储把逻辑地址空间与物理地址空间都划分为固定大小的块,分别称为“页”与“页框”(Frame)。操作系统维护页表(Page Table),页表项(PTE)包含:

  • 页框号(Frame Number)
  • 有效位、脏位、访问位
  • 保护位、缓存禁用位等

地址转换过程:
逻辑地址 = 页号 + 页内偏移
页号作为索引查页表得页框号,再拼接页内偏移即得物理地址。现代 CPU 通过 TLB(快表)缓存近期 PTE,加速转换。

优点

  • 固定大小分配,无外部碎片
  • 支持离散分配,提高内存利用率。
  • 易于实现共享、写时复制、按需调页(Demand Paging)。

缺点

  • 存在内部碎片:平均浪费半页。
  • 页表本身占用内存;多级页表、反向页表、哈希页表等结构增加复杂度。
2.3 段页式存储(Segmented Paging)

段页式存储是前两者的折中:先按逻辑意义分段,再把每个段内部按固定大小分页。逻辑地址被划分为:

段号 | 页号 | 页内偏移

硬件需维护两级结构:

  1. 段表:记录每个段的页表起始地址页表长度
  2. 页表:记录段内各页对应的页框号。

地址转换流程:
段号 → 查段表得页表基址 → 页号 → 查页表得页框号 → 拼接页内偏移 → 物理地址。

优点

  • 兼具段的逻辑可管理性与页的无外部碎片优势。
  • 支持段级保护、共享,同时允许段内离散分配。
  • 可通过多级页表、TLB 进一步优化。

缺点

  • 地址转换需两次查表(段表+页表),增加延迟;需硬件 TLB 缓解。
  • 实现复杂,需要操作系统与 MMU 协同维护两级表结构。

三、总结与对比

比较维度段式页式段页式
碎片外部碎片内部碎片内部碎片(可控)
连续需求必须连续离散段内离散
共享粒度段级页级段级+页级
地址转换一次加法一次查表两次查表
硬件支持段寄存器+界限TLB+页表寄存器段表+页表+TLB
典型应用早期 80286、嵌入式 RTOS现代通用 OSx86 保护模式、Linux 用户态

架构师洞见

  1. 在 64 位系统与虚拟化场景下,纯段式已退出历史舞台,但“段”概念仍用于权限隔离(x86 FS/GS 段、ARMv8 TBI)。
  2. 页式是现代操作系统与硬件的默认选择,TLB 命中率与页表级数直接影响性能;大页(HugePage)、五级页表、IOMMU 是演进方向。
  3. 段页式在需要逻辑隔离与离散分配并存的场景(如微内核、可信执行环境)仍有价值,未来或将以“域-页”两级映射形式回归。
http://www.dtcms.com/a/352611.html

相关文章:

  • PyTorch生成式人工智能——PatchGAN详解与实现
  • Docker实战系列:使用Docker部署YouTrack项目管理系统
  • Linux修改bootflag(启动标签)到指定分区
  • RedHat 5.7升级为PAE内核,并更新yum源
  • 软件产品线过程模型全景解析:双生命周期、SEI 与三生命周期
  • 《数据之心》——鱼小妖全传
  • 数据结构07(Java)-- (堆,大根堆,堆排序)
  • JHipster 一个基于 Yeoman 的全栈应用生成器
  • 常见软件优化功能项
  • More Effective C++ 条款09:使用析构函数防止资源泄漏
  • 用友NCC 如何通过OpenApi 上传附件
  • 【计组】总线与IO
  • 【C++】智能指针底层原理:引用计数与资源管理机制
  • 菜鸡还没有找到工作(DAY41)
  • 永磁同步电机无速度算法--高频脉振正弦波注入到两相静止坐标系
  • 全新机器人遥操作触觉感知解决方案
  • postman使用教程
  • MATLAB 实现子图不规则排列
  • 【软考论文】论自动化测试方法及其应用
  • 这个AI有点懒
  • ZAM5404B:通道速率和信号带宽双提升,工业采集更高效
  • Tokenizer
  • 2025全国大学生数学建模B题思路+模型+代码9.4开赛后第一时间更新,备战国赛,算法解析支持向量机(SVM)
  • 华为云之CodeArts IDE Online平台部署Homepage个人导航页【玩转华为云】
  • k230 canMV 单路、双路、三路摄像头高清显示源代码
  • 数据存储工具 ——Redis
  • 构建面向人工智能决策的世界模型引擎所需的基本知识体系
  • 视觉工具:文字显示、图像标注与多模板匹配
  • Mysql——一条 update 语句的执行过程
  • Prometheus 指标类型