了解仅使用大页面大小的分页的系统中如何发生内部碎片

了解仅使用大页面大小的分页的系统中如何发生内部碎片

以下摘录自操作系统文本加尔文等。等人。

当我们使用分页方案时,我们没有外部碎片:任何空闲帧都可以分配给需要它的进程。然而,我们可能存在一些内部碎片。请注意,帧是作为单元分配的。如果进程的内存需求恰好与页边界不一致,最后分配的帧可能未完全填满。例如,如果页面大小是2,048字节,则字节进程72,766将需要35页面加上1,086字节。它将被分配36帧,导致2,048 − 1,086 = 962字节的内部碎片。在最坏的情况下,进程将需要n页加1字节。它将被分配n + 1帧,导致几乎整个帧的内部碎片。

在此输入图像描述 上面的截图来自佐治亚理工学院的《高性能计算机体系结构》……这里导师说,进程的大小直到右边灰色大括号所示的大小。我们的系统是这样的,我们为进程分配 2 个页面,那么虚线部分就是内部碎片。

图片

我遇到的问题如下。我把情况画了如上图。进程的虚拟地址空间显示为绿色。在左侧,我显示了虚拟地址位。现在,在计算机中,页面大小通常是2的幂。所以我猜页面偏移量无论多长,如果页面大小小于虚拟地址空间大小,那么它将平均划分进程的虚拟地址空间。现在如果是均分的话,虚拟地址空间的最后一部分应该有栈段,那么怎么会有[内部]碎片[在最后一页的最后部分,如上图所示]?

假设我们使用的页面大小为4 MB

图片

我猜图片可能是这样的。请注意,我猜蓝色显示的部分是内部碎片。虽然堆和堆栈之间的巨大差距没有在主内存中分配帧,所以我们不需要担心它们......但我想这取决于堆栈的大小以及代码、数据和堆部分。无论它们是否按照页面正确对齐,是否存在内部碎片,我觉得我们不能只是简单地说仅最后一帧的最后部分不应被占用,并且它是唯一的内部碎片。此外,如何加尔文计算文本大小的过程?

答案1

答案是,你将自己置于不会产生内部碎片的情况下,正如文本所定义的,文本中说:

如果一个进程的内存需求不巧重合有页面边界

但在上面,你设置了一些东西,使它们确实重合。所以...没有碎片。除了正如您所注意到的,未使用的堆和堆栈确实占用了空间,并且这些空间应该被视为“碎片”(尽管无害)。这就是为什么您不想拥有大页面的原因。

但是,我相信内存不是这样分配的。页面不仅仅是内存块,它们还具有可以设置的属性。因此,例如,您可以将代码放在一堆页面中,然后通知操作系统:这些页面是只读的(和/或可以是共享与其他进程)。你不能用堆来做到这一点。相反你可能会要求对于堆页不可执行,这样几个安全漏洞将不起作用。

为了享受这些好处,您需要为各种类型的进程内存分配单独的页面。

因此,代码、静态数据和堆部分不太可能与页面大小完全对齐;在那里,就会发生内部碎片。

相关内容