2、内存分段(Segmentation)

一、为什么需要“分段”?

在程序运行时,代码、数据、堆栈等部分具有不同的功能和访问属性
为了更好地管理这些不同类型的内存区域,操作系统提出了“分段机制”。

📘 类比:

想象内存是一栋大楼,程序由多个部门组成(代码区、数据区、堆区、栈区),
分段就是给每个部门划定单独楼层,每层的权限、用途都不同。


二、分段的基本原理

1️⃣ 程序结构

程序一般由以下逻辑段组成:

  • 代码段(存放程序指令)
  • 数据段(存放全局变量)
  • 堆段(动态分配内存)
  • 栈段(函数调用与局部变量)

每个段有不同的读写执行属性。


2️⃣ 虚拟地址结构

在分段机制下,虚拟地址由两部分组成

虚拟地址 = 段选择因子(Segment Selector) + 段内偏移量(Offset)
  • 段选择因子:决定访问哪个段(存在 CPU 段寄存器中),
    内含:
    • 段号(索引段表)
    • 特权等级(权限控制)
    • 段界限(最大长度)
  • 段内偏移量:表示段内的偏移距离。

📘 类比:

段选择因子是“楼层号”,偏移量是“楼层内房间号”。


3️⃣ 地址转换过程

  1. 程序提供虚拟地址(段号 + 偏移量)
  2. CPU 查段表,找到段的基地址(Base Address)
  3. 物理地址 = 段基地址 + 段内偏移量

举例:

若段3的基地址为 7000,偏移量为 500,
那么物理地址 = 7000 + 500 = 7500

📘 类比:

找房间时,先确定楼层(段表基址 7000),
再加上房间号(偏移 500),最终定位房间 7500。


三、分段的优势

优点

说明

1️⃣ 逻辑清晰

各功能模块(代码、数据、堆栈)相互独立

2️⃣ 方便管理

不同段可设不同访问权限(只读/读写/执行)

3️⃣ 易于共享与保护

例如多个程序可共享只读代码段


四、分段存在的问题

虽然分段机制解决了地址隔离问题,但在多进程系统中,仍存在性能和空间管理问题:


1️⃣ 内存碎片问题

  • 内部碎片:分配的空间大于实际使用(分段机制中较少出现)。
  • 外部碎片:多个不连续的小空闲区域无法拼出足够大的连续空间。

📘 示例:
假设 1GB 内存被以下程序使用:

游戏:512MB
浏览器:128MB
音乐:256MB

关闭浏览器后空闲了 256MB,但可能被分成两块 128MB。
于是一个需要 200MB 的新程序就无法加载。

📘 类比:

房间之间有空隙,但因为不连续,放不下一个大柜子。


2️⃣ 内存交换效率低

为解决碎片问题,系统可以使用 Swap(交换空间)

  • 把某段内存内容写入硬盘;
  • 重新调整位置;
  • 再读回内存中形成连续空间。

问题是:

  • 硬盘访问速度远慢于内存;
  • 每次交换都是“大段搬家”;
  • 导致系统卡顿、性能下降。

📘 类比:

为腾出一间连续的会议室,要先把一整层办公室的家具搬到仓库再搬回来,非常低效。


五、总结:分段机制的本质与局限

项目

内容

目标

让程序逻辑上独立运行,不直接使用物理地址

原理

段表记录每段基址与界限;虚拟地址 = 段号 + 偏移量

优点

清晰结构、权限管理、支持共享

缺点

会产生外部碎片、内存交换低效

结果

分段机制最终被 分页机制(Paging) 取代

📘 一句话理解:

分段像是“按功能划区”的内存管理方案,
逻辑清晰但容易“空间不够拼”,
后来人们发明了“分页”,把内存切成小块更灵活。


一句话总结:

分段机制让程序更结构化、更安全,但难以高效利用内存。
外部碎片与低效的交换使它逐渐让位于“分页机制”,为现代虚拟内存奠定了基础。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值