news 2026/5/14 18:07:32

分段与分页技术解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
分段与分页技术解析

分段与分页技术详解

分段和分页是现代操作系统内存管理的两种核心非连续分配技术,它们解决了连续内存分配导致的内存碎片问题,并支持虚拟内存实现。

1. 技术原理对比

特性维度分段存储管理分页存储管理
基本单位逻辑段(按程序结构划分)固定大小的物理页框和逻辑页
划分依据程序的逻辑结构(如代码段、数据段)系统的物理内存布局
地址空间二维地址(段号+段内偏移)一维线性地址
碎片问题产生外部碎片产生内部碎片
共享与保护天然支持(以段为单位)需额外机制支持
管理开销段表、段长检查页表、TLB快表

2. 分段存储管理实现

分段基于程序的逻辑结构,将地址空间划分为若干段(Segment),每个段有独立的名称和长度。

地址转换流程:

  1. CPU生成逻辑地址(s, d),s为段号,d为段内偏移
  2. 通过段表寄存器找到段表基址
  3. 用段号s索引段表,获取该段基址和段长
  4. 检查偏移d是否小于段长(越界保护)
  5. 物理地址 = 段基址 + 偏移d

分段管理数据结构示例:

// 段表项结构 struct SegmentTableEntry { int base; // 段在内存中的起始地址 int limit; // 段长度限制 int valid; // 段是否在内存中 int rwx; // 读写执行权限标志 }; // 地址转换函数 int translateSegmentedAddress(int segmentNum, int offset, SegmentTableEntry* segTable) { if (segmentNum >= MAX_SEGMENTS || offset < 0) { return -1; // 非法访问 } SegmentTableEntry entry = segTable[segmentNum]; if (!entry.valid) { triggerSegmentFault(); // 段错误 return -1; } if (offset >= entry.limit) { triggerProtectionFault(); // 越界保护 return -1; } return entry.base + offset; // 返回物理地址 }

分段支持高效的共享与保护,例如多个进程可共享只读代码段,而各自拥有独立的数据段。

3. 分页存储管理实现

分页将物理内存和逻辑地址空间划分为固定大小的页框(Frame)和页(Page),通常大小为4KB。

地址转换流程:

  1. CPU生成逻辑地址,分为页号p和页内偏移d
  2. 通过页表寄存器找到页表基址
  3. 用页号p索引页表,获取页框号f
  4. 物理地址 = f × 页大小 + d

分页管理核心代码:

#define PAGE_SIZE 4096 // 4KB页大小 #define PAGE_MASK 0xFFF // 页内偏移掩码 // 页表项结构 struct PageTableEntry { int frameNum; // 物理页框号 int valid; // 页是否在内存中 int dirty; // 页是否被修改 int referenced; // 访问标志(用于页面置换) int protection; // 访问权限 }; // 分页地址转换 int translatePagedAddress(int logicalAddr, PageTableEntry* pageTable) { int pageNum = logicalAddr / PAGE_SIZE; // 计算页号 int offset = logicalAddr & PAGE_MASK; // 计算页内偏移 if (pageNum >= MAX_PAGES) { return -1; // 页号越界 } PageTableEntry pte = pageTable[pageNum]; if (!pte.valid) { triggerPageFault(pageNum); // 触发缺页中断 return -1; } // 检查访问权限 if ((pte.protection & CURRENT_ACCESS) == 0) { triggerProtectionFault(); return -1; } // 更新访问标志(用于LRU等置换算法) pte.referenced = 1; return (pte.frameNum * PAGE_SIZE) + offset; // 合成物理地址 }

4. 段页式存储管理

结合分段和分页优点,先分段再分页,提供逻辑结构支持和内存利用率平衡。

地址转换流程:

  1. CPU生成逻辑地址(s, p, d),s为段号,p为段内页号,d为页内偏移
  2. 通过段号s查找段表,获取该段的页表基址
  3. 通过页号p在页表中查找物理页框号f
  4. 物理地址 = f × 页大小 + d
// 段页式地址转换 int translateSegPagedAddress(int segmentNum, int pageNum, int offset) { // 1. 段表查找 SegmentTableEntry segEntry = segmentTable[segmentNum]; if (!segEntry.valid) { triggerSegmentFault(); return -1; } // 2. 获取该段的页表 PageTableEntry* pageTable = segEntry.pageTablePtr; // 3. 页表查找 PageTableEntry pageEntry = pageTable[pageNum]; if (!pageEntry.valid) { triggerPageFault(segmentNum, pageNum); return -1; } // 4. 合成物理地址 return (pageEntry.frameNum * PAGE_SIZE) + offset; }

5. 实际应用场景

分段适用场景:

  • 程序模块化管理:编译器生成的目标文件通常包含.text、.data、.bss等段
  • 内存共享:多个进程共享动态链接库的代码段
  • 内存保护:设置代码段只读、数据段可读写

分页适用场景:

  • 虚拟内存系统:Linux、Windows等现代操作系统采用请求分页
  • 大数据处理:PrimeReact等前端框架使用虚拟分页处理大规模数据
  • 内存映射文件:将文件映射到进程地址空间

性能优化技术:

  1. TLB快表:缓存最近使用的页表项,加速地址转换
  2. 多级页表:减少页表内存占用,如x86-64的四级页表
  3. 反向页表:物理页框到进程的映射,节省大量页表空间

6. 技术演进与挑战

从早期覆盖技术、交换技术到现代虚拟内存,分段和分页技术不断演进。请求分页系统在程序运行时按需调入页面,结合页面置换算法(LRU、FIFO等)和缺页中断处理机制,实现了比物理内存更大的虚拟地址空间。

关键挑战包括:

  • 内部碎片:分页系统中最后一页未用满的空间浪费
  • 外部碎片:分段系统中内存分配释放产生的空隙
  • TLB失效开销:频繁的地址转换影响性能
  • 页面置换抖动:频繁的页面换入换出降低系统效率

分段提供自然的程序结构支持,分页提供高效的内存利用率,两者结合形成现代操作系统的内存管理基础。在实际系统设计中,需要根据具体应用场景和硬件特性选择合适的技术组合。


参考来源

  • PrimeReact大数据处理终极指南:虚拟滚动与数据分页的完美解决方案
  • 操作系统知识点复习(2):内存管理
  • OS存储器管理相关练习
  • 传统存储管理要求在程序运行前必须将其全部装入主存,若主存空间不足,则作业无法执行
  • 操作系统精髓-内存管理、调度及其他基础总结
  • 操作系统2-物理内存管理(连续内存分配,非连续内存分配)—— lab2习题
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/14 18:07:31

人工模拟降雨器喷洒性能提升方法【附方案】

✨ 长期致力于喷洒式人工模拟降雨器、降雨性能、试验测试、仿真研究、控制算法研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;喷洒结构多目标参数优化…

作者头像 李华
网站建设 2026/5/14 18:06:21

基于ESP32-S3的嵌入式视觉开发:从MEMENTO硬件到Arduino/PlatformIO实战

1. 项目概述与核心价值如果你正在寻找一个能快速上手、功能齐全的嵌入式视觉开发平台&#xff0c;Adafruit的MEMENTO绝对是一个让人眼前一亮的选项。它基于乐鑫的ESP32-S3芯片&#xff0c;集成了OV5640摄像头传感器、TFT显示屏、microSD卡槽、扬声器以及多个物理按键&#xff0…

作者头像 李华
网站建设 2026/5/14 18:05:48

【编译原理】语法制导翻译:属性分类、依赖图与求值逻辑全解析

博主前言&#xff1a; 在编译原理的学习中&#xff0c;语法制导翻译&#xff08;SDT&#xff09;是连接语法分析与中间代码生成的桥梁。本文根据今日课堂笔记整理&#xff0c;重点梳理 SDD/SDT 的核心概念&#xff0c;并总结出一套快速判断属性类型的“高分口诀”&#xff0c;希…

作者头像 李华
网站建设 2026/5/14 18:05:48

MATLAB 2024b深度学习新特性全面解析与DeepSeek大模型集成开发

第一章&#xff1a;MATLAB 2024b深度学习工具箱新特性简介1、MATLAB Deep Learning Toolbox概览2、实时脚本&#xff08;Live Script&#xff09;与交互控件&#xff08;Control&#xff09;功能介绍与演示3、批量大数据导入及Datastore类函数功能介绍与演示4、数据清洗&#x…

作者头像 李华
网站建设 2026/5/14 18:05:18

一站式解决文献翻译难题:Zotero PDF Translate 完全指南

一站式解决文献翻译难题&#xff1a;Zotero PDF Translate 完全指南 【免费下载链接】zotero-pdf-translate Translate PDF, EPub, webpage, metadata, annotations, notes to the target language. Support 20 translate services. 项目地址: https://gitcode.com/gh_mirror…

作者头像 李华
网站建设 2026/5/14 18:02:09

3PEAK思瑞浦 TPA7253A-SO1R SOP8 运算放大器

特性 运算放大器 -供电电压:3V至36V -低供电电流:220A(最大) -输入轨至-Vs&#xff0c;轨到轨输出 -卓越高频PSRR:100kHz时为65dB -TPA7252/7252A的偏移电压:在25C时最大为4 mv 2 mV TPA7253/7253A的偏移电压:在25C时最大为 电压参考 -2.5V输出&#xff0c;无负载至1-F负载下稳…

作者头像 李华