什么是分段?
分段是另一种内存分配方法,可以替代或与分页一起使用。在其最纯粹的形式中,程序被分成多个段,每个段都是一个独立的单元,包括子程序或数据结构。
与页不同,段的大小可以变化。这要求MMU以与管理分页内存略有不同的方式来管理分段内存。分段MMU包含一个段表来跟踪驻留在内存中的段。
段可以在多个地址中的一个处创建,并且可以是任何大小,每个段表条目都应包含起始地址和段大小。一些系统允许段从任何地址开始,而其他系统则限制起始地址。英特尔X86架构中就存在这样一个限制,它要求段从地址的低四位为6000的地址开始。
具有此限制的系统不需要将其段表中存储这四个位,因为它们的值是隐式的。如下图所示,它显示了分段内存的简化地址转换方案。
偏移量与段大小进行比较。如果偏移量高于或等于段大小,则表示该位置不是段的一部分,会产生错误。如果偏移量具有真实值,则将其插入到段地址的开头以创建正确的物理内存地址。与分页一样,分段MMU也可以拥有TLB来加速段起始地址和大小的生成。
在分页中,页号被发送到页表(和TLB)以生成帧号。此值与偏移量连接以生成物理地址。在分段中,由段表或TLB生成的起始地址加到偏移量上,这个过程比连接更耗时。
由于段可以具有不同的尺寸,因此与分页相比,此方法既有优点也有缺点。考虑一下相对简单的CPU的分页示例。
在分页内存执行中,每页的大小为4K。大小为4K+1的程序需要MMU分配两页内存,即使第二页只使用了其4K位置中的一个。这被称为内部碎片。如果使用分段,则可以分配大小正好为4K+1的段,从而避免此问题。
分段存在一个称为外部碎片的问题。内存中有三个段和8K的可用空间。可用空间被细分,因此没有高于3K的段可以加载到内存中,而无需更改或删除当前加载的段之一。它通过将数据移回交换磁盘或重新定位到内存中来引入开销,这两者都会降低系统性能。