分页中是如何内部碎片而没有外部碎片?

时间:2015-09-23 16:18:31

标签: memory memory-management operating-system

请妥善解释。不要只写定义。还要解释它的作用以及它与细分的区别。

7 个答案:

答案 0 :(得分:7)

需要使用内存分配技术来考虑碎片。分页基本上不是内存分配技术,而是提供虚拟地址空间的方法。

考虑到与分段的比较,您可能要问的是使用固定大小块的内存分配技术(如分页页面,假设此处有4KB页面大小)和使用可变大小块的技术(如用于细分的细分市场。)

现在,假设您直接使用页面分配接口来实现内存管理,即您有两个处理内存的函数:

  • alloc_page,它分配一个页面并返回指向新可用地址空间开头的指针,
  • free_page,它释放了一个已分配的页面。

现在假设您使用了所有当前可用的虚拟内存,但是您需要存储1个额外的字节。你调用alloc_page并得到一个4KB的内存块。您只使用该巨大块的1个字节,但从分配器的角度来看,其他4095个字节也是使用的。如果多次发生这种情况,最终将分配所有页面,因此对alloc_page的进一步调用将失败。即使您只需要另外一个字节(可能是上面浪费的4095之一),分配器也会告诉您内存不足。这是内部碎片。

另一方面,如果你使用可变大小的块(比如分段),那么你很容易受到外部碎片的影响:假设你管理6个字节的内存(F意味着“免费”):

FFFFFF

首先为a分配3个字节,然后为b分配1个字节,最后为c分配2个字节:

aaabcc

现在您释放ac,只留下b

FFFbFF

您现在有5个字节的未使用内存,但如果您尝试分配4个字节的块(小于可用内存),则由于b的内存不利位置,分配将失败。这是外在的碎片化。

现在,如果您将页面分配器扩展为能够分配多个页面并添加alloc_multiple_pages,则必须同时处理内部外部碎片。

答案 1 :(得分:2)

分页中没有外部碎片,但存在内部碎片。 首先,我们需要了解什么是外部碎片。当我们有内存来容纳一个进程但它不连续时,会发生外部碎片。 如何在分页中没有出现? 分页将虚拟内存或相同大小的页面和物理内存中的所有进程划分为固定大小的帧。因此,您通常将称为页面的相同大小的块固定为称为帧的相等块形空间!尝试可视化并得出结论,永远不会有外部碎片。

在分割的情况下,我们将虚拟地址划分为不同大小的块,这就是为什么可能存在这样的情况:主存储器中的某些块必须粘在一起或紧凑以为新进程腾出空间!希望它有所帮助!

答案 2 :(得分:0)

在分页中,尽管可能发生内部碎片,但外部碎片的可能性非常低。

在分页方案中,整个主存储器和虚拟存储器被分成一些固定大小的插槽,这些插槽称为页面(在虚拟存储器的情况下)和页面帧(在主存储器或RAM或物理存储器的情况下)。因此,无论何时在主存储器中执行进程,它都占据页面帧的整个空间。假设主存储器有4096个页面帧,每个页面帧的大小为4096字节。假设有一个进程P1,它需要3000字节的空间才能在主存储器中执行。因此,为了执行P1,它被从虚拟存储器带到主存储器并放置在页面帧(F1)中,但是P1仅需要3000字节的空间来执行,因此(4096 - 3000 = 1096字节) )页面框架中的空间被浪费掉了。换句话说,这表示页框F1中内部碎片的情况。

同样,如果主存储器的某些空间不能包含在页面框架中,则可能发生外部碎片。但这种情况非常罕见,通常是主内存的大小,页面框架的大小以及总数。主存储器中的页面帧数可以用2的幂表示。

答案 3 :(得分:0)

分页允许以非连续方式为进程分配物理内存。我将回答为什么外部碎片不能在分页中发生。

当从物理内存中卸载分配了连续内存的进程时会发生外部碎片,这会在内存中创建一个漏洞(可用空间)。

现在,如果出现一个新进程,需要比这个漏洞更多的内存,那么由于非连续,我们无法将连续内存分配给该进程自由记忆的本质,这称为外部碎片。

现在,上面的问题是由于为进程分配连续内存的限制而产生的。这是通过允许进程获得非连续物理内存来解决分页的问题。

答案 4 :(得分:0)

据我所知,我会这样回答你的问题:

为什么内部碎片有分页?

因为页面具有固定大小,但进程可能请求更多或更少的空间。假设一个页面是32个单位,一个进程请求20个单位。然后,当页面被提供给请求进程时,尽管具有12个单元的空闲“内部”空间,但该页面不再可用。

为什么分页中存在没有外部碎片?

因为在分页中,一个进程允许被分配在物理内存中不连续的空间。同时,这些块的逻辑表示将在虚拟存储器中是连续的。这就是我的意思:

一个过程需要128个单位的空间。这是前一个例子中的4页。无论物理内存中的实际页码(正式帧号)如何,都会为这些页面提供数字0,1,2和3.这是虚拟表示,它是分页本身的定义特征。那些页面在实际物理存储器中可以是21,213,23,234。但它们确实可以是任何东西,连续的或不连续的。因此,即使分页在使用的空间之间留下小的 free 空间,这些小的空闲空间仍然可以一起使用,就像它们是一个连续的空间块一样。这就是外部碎片不会发生的原因。

答案 5 :(得分:0)

帧被分配为单位。如果某个进程的内存需求与页面边界不完全一致,则分配的最后一帧可能不会完全填满。

例如,如果页面大小为2,048字节,则72,766字节的过程将需要35页加上1,086字节。它将分配36帧,从而导致内部碎片2,048-1,086 = 962字节。在最坏的情况下,一个进程将需要11页加1个字节。它将分配11 +1帧,导致几乎整个帧的内部碎片。

答案 6 :(得分:0)

将进程划分为固定大小的页面时,通常最后一页中会有一些剩余空间(内部碎片)。当有许多进程时,它们最后一页的未使用区域的总和可能大于或等于一页的大小。现在,即使您必须拥有一个或多个页面的总可用大小,但是由于页面必须是连续的,因此您无法加载新页面。外部碎片化已发生。因此,我认为分页中的外部碎片不会完全为零。

编辑:这与如何定义外部碎片有关。内部碎片的收集不会导致外部碎片。 外部碎片是由分区(或页面)外部的空白所致。。因此,如果假设主存储器中只有两个帧(例如大小为16B),每个帧仅占用1B数据。每帧的内部碎片为15B。未使用的总空间为30B。现在,如果您要加载某个过程的新页面,您将看到没有可用的框架。即使您有30B的未使用空间,也无法加载新页面。您将其称为外部碎片吗?答案是否定的。因为这些15B的未使用空间在页面内部。因此,在分页中,内部碎片是可能的,但外部碎片是不可能的。