操作系统 分段
在操作系统中,分段是一种内存管理技术,将内存分成变量大小的部分。每个部分被称为一个段,可以分配给一个进程。
关于每个段的详细信息存储在一个称为段表的表中。段表存储在一个(或多个)段中。
段表主要包含两个关于段的信息:
- 基址:段的基地址
- 限制:段的长度
为什么需要分段
到目前为止,我们一直使用分页作为我们的主要内存管理技术。分页更加接近于操作系统,而不是用户。它将所有进程分段成页的形式,而不考虑一个进程可以有一些需要加载在同一页的相关部分。
操作系统不关心用户对进程的视图。它可能将相同的功能分段成不同的页面,这些页面可能会或可能不会同时加载到内存中。这降低了系统的效率。
最好使用分段将进程分成段。每个段包含相同类型的功能,例如主函数可以包含在一个段中,库函数可以包含在另一个段中。
通过段表将逻辑地址转换为物理地址
CPU生成一个包含两个部分的逻辑地址:
- 段号
- 偏移量
例如:
假设使用16位地址,其中4位用于段号,12位用于段偏移量,因此最大段大小为4096,可以引用的段的最大数量为16。
当程序加载到内存中时,分段系统试图找到足够大的空间来容纳进程的第一个段,空间信息是从内存管理器维护的空闲列表中获得的。然后它尝试为其他段找到空间。一旦为所有段定位到足够的空间,就会将它们加载到各自的区域。
操作系统还为每个程序生成一个段映射表。
在程序执行过程中,借助段映射表和硬件辅助,操作系统可以轻松地将逻辑地址转换为物理地址。
段号 映射到段表。与偏移量进行比较来判断该地址是否有效。如果偏移量小于限制,则地址有效;否则,将抛出错误,因为地址无效。
对于有效地址,将段的基地址与偏移量相加以获取主内存中实际单词的物理地址。
上图显示了在分段的情况下如何进行地址转换。
分段的优势
- 无内部碎片
- 平均段大小大于实际页面大小
- 开销较小
- 重新定位段比重新定位整个地址空间更容易
- 段表比分页中的页表要小
分段的劣势
- 可能存在外部碎片
- 为变长分区分配连续内存较困难
- 内存管理算法较昂贵