分段
分段(Segmentation)
程序是由若干个逻辑分段组成的,如可由代码分段、数据分段、栈段、堆段组成。分段是一个支持用户视角的内存管理技术,基于模块化开发时,程序员根据需要将进程分割成许多大小不一定相同的段(segment),系统则将物理内存动态划分成许多尺寸不一定相等的分区(partition)。当一个进程被装入物理内存时,系统将为该进程的每个段独立地分配一个连续分区,同一进程的多个段不必存放在连续的多个分区中。
段表(segment table)用于描述进程的分段情况,记载进程的各个段到物理内存中分区的映射情况。段表的基本元素包括段号、段的物理起始地址和段长度。
互动实验
跟着地址走过分段过程
访问权限PRO
PRO EXCLUSIVE探索不止于此
尊享 Pro 权益解锁完整互动实验、进阶解析与精选参考答案。
在采用这种分段模型的系统中,编译器、链接器和加载程序可以组织代码、全局变量、堆、各线程的栈和库函数等段。加载程序装入这些段,并为它们分配段号。
分段解决了程序本身不需要关心具体的物理内存地址的问题,但它也有一些不足之处,如内存碎片和内存交换的低效率问题。
这里的内存利用问题共有两处地方:
- 外部碎片:空闲物理内存不连续,且没有足够大的连续分区,导致新的进程无法被装载。
- 不常使用的数据仍占据物理内存:这会降低内存利用率,但不等于分配单位内未使用空间所造成的内部碎片。
可以通过交换并重新定位来整理外部碎片。例如把音乐进程占用的256MB内存写到硬盘,再读回到紧接已占用512MB内存的位置。若腾出的连续空闲空间为256MB,新的200MB进程就可以装载。
互动实验
看清内存碎片在哪里
访问权限PRO
PRO EXCLUSIVE探索不止于此
尊享 Pro 权益解锁完整互动实验、进阶解析与精选参考答案。
对于多进程的系统来说,分段很容易产生内存碎片,内存交换的过程就会产生性能瓶颈。因为硬盘的访问速度要比内存慢太多了,每一次内存交换,都需要把一大段连续的内存数据写到硬盘上。
知识测验
题目
某段基址1000、长度200、可读可执行,写入偏移40会怎样?
动手练习
认识段表
使用下列两个段表项。地址与长度以字节为单位,两次访问均为读操作。
| 段号 | 基址 | 长度 |
|---|---|---|
| 0 · 代码 | 1000 | 200 |
| 1 · 堆 | 5000 | 400 |
- 转换0号段偏移199和1号段偏移40的物理地址。
- 偏移200是否属于0号段?说明理由。
- 同一进程的不同段必须在物理内存中相邻吗?