分段存储

简介: 分段存储

分段存储(Segmentation)是另一种内存管理技术,它将进程的逻辑地址空间划分为若干个具有逻辑意义的段(Segment)。每个段代表程序中的一个相对独立的部分,如代码段、数据段、堆段、栈段等。与分页存储相比,分段存储更侧重于根据程序的逻辑结构来组织内存,而不是基于固定的页面大小。以下是分段存储的主要特点、工作原理及其优缺点:

主要特点:

  1. 逻辑地址结构
  • 分段存储的逻辑地址由段号(Segment Number, SN)和段内偏移(Offset)组成。段号标识进程逻辑空间中的某个段,段内偏移则指明在该段内的具体位置。
  1. 段表
  • 系统为每个进程维护一个段表(Segment Table),其中每个条目(Segment Table Entry, STE)记录了一个段的相关信息,如基址(Base Address)、界限(Limit)、权限位等。基址指示该段在物理内存中的起始地址,界限定义了段的最大长度。
  1. 硬件支持
  • 类似于分页存储,硬件(MMU)负责逻辑地址到物理地址的转换。当CPU发出一个逻辑地址访问请求时,MMU首先提取出段号和段内偏移,然后查找段表获取对应STE。如果访问在段的合法范围内(即段内偏移小于界限),则将基址与段内偏移拼接成物理地址;否则触发段错误(Segmentation Fault),由操作系统处理。
  1. 段的动态性与可变长度
  • 分段存储允许段的长度根据程序的实际需求动态变化,不同的段可以有不同的长度。这与分页存储中固定大小的页面形成对比。
  1. 内存保护与共享
  • 通过段表中的权限位可以实现对每个段的访问权限控制。此外,多个进程可以共享同一段的物理内存,只需在各自的段表中指向相同的物理地址范围。

工作原理:

  • 进程创建与加载
  • 操作系统在创建或加载一个进程时,根据其程序结构生成段表,为每个段分配合适的内存,并填写相应的STE。某些段(如只读代码段)可能已存在于共享内存区域。
  • 地址转换
  • 进程执行过程中,CPU生成逻辑地址。MMU截获访问请求,通过查段表将逻辑地址转换为物理地址。若访问在段的有效范围内,则直接访问;否则触发段错误。
  • 段错误处理
  • 若发生段错误,操作系统检查是否因访问越界、权限错误或段不存在导致。对于合法访问请求,调整段表或重新分配内存;对于非法访问,则终止相应进程。
  • 内存分配与回收
  • 分段存储允许动态分配和回收内存。当程序动态申请或释放内存(如堆操作)时,操作系统相应地调整相关段的大小和基址,并更新段表。
  • 段共享
  • 多个进程可以通过在各自的段表中映射到相同的物理内存区域来实现段共享。操作系统负责管理共享段的访问权限和同步问题。

优缺点对比:

优点:

  • 符合程序逻辑:分段存储与程序的逻辑结构紧密关联,有利于模块化编程和数据保护。
  • 动态内存分配:段的长度可以根据需要动态改变,适应程序运行时内存需求的变化。
  • 便于内存共享:由于段具有明确的逻辑意义,多个进程可以方便地共享特定的段(如共享库)。
  • 内存保护:通过对每个段设置不同的访问权限,可以更好地实现内存保护和数据隔离。

缺点:

  • 外部碎片:由于段的长度可变,可能导致内存中出现无法利用的小块空闲空间(外部碎片)。
  • 段表管理复杂:与页表相比,段表可能需要更复杂的管理机制,特别是在处理动态增长或收缩的段时。
  • 段间转移开销:跨段的指令或数据访问可能需要多次段表查找,增加了地址转换的开销。现代系统通过使用多级段表、段表缓存(如段表寄存器)等方式来缓解这一问题。
  • 段边界对齐:由于段的长度不固定,可能需要进行复杂的边界对齐处理以确保段的有效使用。

总结来说,分段存储是一种根据程序逻辑结构划分内存的内存管理技术,它强调段的逻辑意义、动态性以及对程序模块化的支持。虽然在内存碎片、段表管理等方面存在挑战,但通过合理的系统设计和优化,分段存储能够提供良好的程序结构适应性、动态内存管理和内存保护功能。在某些系统中,分段存储可能与分页存储结合使用,形成段页式存储管理方式,兼顾两者的优点。

相关文章
|
数据安全/隐私保护
[羊城杯 2020]easyre 1题解
buuctf-[羊城杯 2020]easyre 1题解
681 0
[羊城杯 2020]easyre 1题解
|
前端开发 容器
彻底理解粘性定位 - position: sticky
彻底理解粘性定位 - position: sticky
1393 154
|
机器学习/深度学习 算法 信息无障碍
归一化还是标准化?如何为你的数据选择最佳缩放方法
当你的特征们身高不一、体重各异时,如何让它们在机器学习的舞台上公平竞争?本文用轻松幽默的方式带你掌握特征缩放中的归一化和标准化技巧,让你的模型表现更上一层楼!
321 0
|
atlas
Cesium导入geojson数据
这篇文章详细描述了如何在Cesium中导入GeoJSON数据来绘制地理矢量数据,并提供了实现的具体方法和示例代码。
1096 2
Cesium导入geojson数据
|
消息中间件 Linux 安全
|
机器学习/深度学习 运维 监控
有人想让我讲讲应用性能管理(APM)工具
有人想让我讲讲应用性能管理(APM)工具
1182 2
|
消息中间件 资源调度 安全
操作系统----临界区,临界资源,互斥量,互斥对象
操作系统----临界区,临界资源,互斥量,互斥对象
793 2
|
边缘计算 自动驾驶 物联网
5G技术的低延迟目标及其对4G的显著改进
5G技术的低延迟目标及其对4G的显著改进
1558 0
hexo 博客插入本地图片时遇到的坑
在使用Hexo博客时,作者遇到了将本地图片插入文章的问题。安装了`hexo-asset-image`插件(v1.0.0)并启用资源文件夹功能后,图片并未正确显示。问题在于图片路径未被转换。通过卸载`hexo-asset-image`,改用`hexo-asset-img`插件,并调整图片引用格式为`![alt](文章名/图片名.png)`,成功解决了图片显示问题。此问题源于`hexo-asset-image`在Hexo 5及更高版本中已失效。