内存分段
一个 C 编译器可能会创建如下段:,
- 代码
- 全局变量
- 堆(内存从堆上分配)
- 每个线程使用的栈
- 标准的C库
段式存储管理地址变换机构
逻辑地址 = 段的基地址 + 段内地址
程序中各个段对应的情况图
内存分页
基本原理
- 将进程的逻辑地址空间分成若干个大小相等的片,称为页面或页;
- 内存空间分成与页大小相等的若干个存储块,称为物理块或页框。
- 在为进程分配内存时,以块为单位,将进程中的若干页分别装入多个可以不相邻的块中。
页面大小的选择
页面的大小由机器的地址结构决定的。
页面的大小的权衡
- 页面较小----内存碎片小;页表过长,占用较大内存空间。
- 页面较大----页表短,占用较少内存;内存碎片大。
- 通常页面的大小要适中,在512B~4MB之间。
页式存储管理逻辑地址结构
逻辑地址被分为两部分:
- 页号
- 页内位移
例如逻辑地址1500的二进制形式为0000 0101 1101 1100 由于页的大小为1024B,故页内位移占10位,剩下6位为页号
- 逻辑地址1500对应的页号为1(二进制为0000 01)
- 页内位移为476(二进制为01 1101 1100)
分页和分段的区别
分页和分段的目的
- 页是信息的物理单位,分页是系统管理的需要,而不是用户的需要。
- 段是信息的逻辑单位,它含一组意义完整的信息。分段是为了更好地满足用户的要求。
划分规则:
- 页按物理结构划分,会有内部碎片
- 段按逻辑结构划分,会有外部碎片
- 段页基本分段和基本分页,会有内部碎片
页和段长度
- 页的大小固定,由系统确定。
- 段的长度不固定,决定于用户所编写的程序。
地址空间
- 分页的作业地址空间是一维的,即单一的线性地址空间。
- 分段的作业地址空间是二维的,程序员在标识一个地址时,需给出段名和段内地址。
内存碎片分为:内部碎片和外部碎片
【内部碎片】
内部碎片就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间;
内部碎片是处于(操作系统分配的用于装载某一进程的内存)区域内部或页面内部的存储块。占有这些区域或页面的进程并不使用这个存储块。而在进程占有这块存储块时,系统无法利用它。直到进程释放它,或进程结束时,系统才有可能利用这个存储块。
【外部碎片】
外部碎片指的是还没有被分配出去(不属于任何进程),但由于太小了无法满足申请内存空间的新进程的请求。
外部碎片是处于任何两个已分配区域或页面之间的空闲存储块。这些存储块的总和可以满足当前申请的长度要求,但是由于它们的地址不连续或其他原因,使得系统无法满足当前申请。