Virtual-Memory

了解在僅使用大頁面大小的分頁的系統中如何發生內部碎片

  • July 5, 2021

下面的摘錄來自Galvin 等人的作業系統文本。人。

當我們使用分頁方案時,我們沒有外部碎片:任何空閒幀都可以分配給需要它的程序。但是,我們可能有一些內部碎片。請注意,幀是作為單位分配的。如果一個程序的記憶體需求沒有恰好與頁面邊界重合,那麼分配的最後一幀可能沒有完全填滿。例如,如果頁面大小是2,048字節,則字節程序72,766將需要35頁面加上1,086字節。它將被分配36幀,從而導致2,048 − 1,086 = 962字節的內部碎片。在最壞的情況下,一個程序需要n頁加1字節。它將被分配n + 1幀,導致幾乎整個幀的內部碎片。

在此處輸入圖像描述 上面的截圖來自佐治亞理工學院的“高性能電腦體系結構”……這裡講師說,這個過程的大小直到右邊的灰色大括號所示。我們的系統是這樣的,我們為程序分配了 2 頁,然後虛線部分是內部碎片。

圖片

我遇到的問題如下。我畫的情況如上圖。程序的虛擬地址空間顯示為綠色。在左側,我顯示了虛擬地址位。現在,在電腦中,頁面大小通常是 2 的冪。所以我猜頁面偏移量,不管多長,如果頁面大小小於虛擬地址空間大小,那麼它應該平均劃分程序的虛擬地址空間。現在如果等分的話,虛擬地址空間的最後一部分應該有棧部分,那怎麼會有一個$$ internal $$碎片化$$ in the last part of the last page as shown in the above pictures $$?

假設如果我們使用4 MBthen 的頁面大小:

圖片

我猜圖片可能是這樣的。請注意,我猜以藍色顯示的部分是內部碎片。雖然堆和堆棧之間的巨大差距不是在主記憶體中分配的幀,所以我們不必擔心它們……但我想這取決於堆棧的大小以及程式碼、數據和堆部分。無論它們是否按照頁面正確對齊,都會產生內部碎片,我覺得我們不能簡單地說只有最後一幀的最後一部分不被佔用,它是唯一的內部碎片。此外,Galvin文本如何計算程序的大小?

答案是您將自己完全設置在不會產生內部碎片的情況下,正如文本所定義的那樣,

如果程序的記憶體需求與頁邊界不一致

但在上面,您進行了設置,以使它們確實重合。所以……沒有碎片。除此之外,正如您所注意到的,未使用的堆和堆棧確實佔用了空間,並且這些空間應該被認為是“碎片化的”(但是無害的)。這就是為什麼您不想擁有大頁面的原因。

但是,我相信記憶體不是這樣分配的。頁面不僅僅是記憶體塊,它們具有可以設置的屬性。因此,例如,您可以將程式碼放在一堆頁面中,然後通知作業系統這些頁面是只讀的(和/或可以與其他程序共享)。你不能用堆做到這一點。相反,您可能會要求堆頁面不可執行,這樣一些安全漏洞將無法工作。

要享受這些好處,您需要為各種類型的程序記憶體分配單獨的頁面。

因此,無論頁面大小如何,程式碼、靜態數據和堆部分都不太可能完全對齊;在那裡,會發生內部碎片。

引用自:https://unix.stackexchange.com/questions/657122