在將主內存分配給操作系統中的進程時,有兩個主要部分。 在連續內存分配中,進程被分配主內存的順序塊給整個進程。 要獲得有關連續內存分配的更多見解,請參閱此 關聯. 在第二種方法中,進程被劃分並加載到彼此不連續的主內存中,這稱為非連續內存分配。
範圍:
連續內存分配:
當用戶進程佔用的內存部分與包含兩個下一個進程的部分相鄰且相鄰時。連續內存分配有兩種主要類型。我們將簡要討論這些。
固定大小分區方案是連續內存分配的第一種方法。在這種方法中,操作系統將整個內存劃分為固定大小的分區。舉個例子,系統有 500 KB 的主內存,假設操作系統被加載到 100 KB 的主內存中,那麼操作系統仍然有 400 KB 的主內存可供用戶進程使用。
假設操作系統將 400 KB 的主內存劃分為每個 10 KB 的固定大小,因此系統將在主內存中獲得 40 個分區,可以放置用戶進程。
假設操作系統有 3 個進程要加載到大小為 4 KB、9 KB 和 12 KB 的主內存中。 現在操作系統會為前兩個進程分配連續的內存在兩個連續的 10 KB 塊中,但是在這些分區中,它會分別留下一些 6 KB 和 1 KB 的空間,這些空間不會被操作系統使用。 這種內存浪費被稱為 內部碎片化。 無論如何,操作系統不會為 12 KB 的進程提供任何分區,但仍有 38 個 10 KB 的分區可供使用但無法使用,因此稱為 外部碎片.
這種固定分區方案在 1900 年代初期使用,並且很容易實現,因為我們在執行任何進程之前預先計算了分區的大小,因此它也稱為靜態內存分配。
連續內存分配的第二種技術是可變大小分區方案。這種內存分配技術是建立在固定大小分區的一些缺點之上的。另一方面,在這種技術中,操作系統不會預先計算分區的大小,當某些進程來並請求一塊內存時,操作系統會分配一個與所請求內存的確切大小相同的分區。
讓我們考慮上面的例子,我們有 500 KB 的主內存,其中 100 KB 被操作系統佔用,然後當 3 個進程的大小分別為 4 KB、9 KB 和 12 KB。在這種情況下,操作系統將分別動態分配大小為 4KB、9 KB 和 12 KB 的連續內存分區。這就是我們稱之為動態內存分配技術的原因之一。
這將消除內部碎片的威脅,但仍然存在外部碎片。假設我們已經完全佔用了主內存,沒有額外的空間,然後突然超過 4 KB 的進程由於 I/O 操作而超出了主內存,那麼將會有 4 KB 的孔現在沒有使用,假設進程帶有 6 KB內存要求那麼操作系統沒有任何分區選擇,它將累積 6 KB 在這種情況下,這些 4 KB 分區可以被視為符合外部碎片的內存浪費。這幾乎與連續內存分配有關。
非連續內存分配:
我們在連續內存分配技術中討論了可變大小分區,它仍然有外部碎片的開銷。為了減少這種開銷,有兩種主要的非連續內存分配技術。主要目的是減少在連續內存分配中發生的外部碎片。非連續內存分配技術比連續內存分配技術更難實現。為了實現在主存的不同分區中分配進程的目標,它引入了地址轉換機制,CPU 生成邏輯地址,然後將其轉換為物理地址以獲取必要的數據。它比連續的內存分配消耗更多的時間。此外,它使用額外的內存來存儲與地址轉換算法相關的映射,這些映射在分頁和分段中分別稱為頁表和段表。
在分頁中,操作系統將主內存劃分為一個固定大小的幀,這有點類似於固定大小的分區方案連續內存分配,同時操作系統將進程劃分為與主內存中的幀大小相同的頁面。之後,操作系統將這些頁面加載到主內存中的非連續幀中。當 CPU 需要來自主存儲器的某個頁面時,它將生成一個邏輯地址,該地址將在頁表的幫助下轉換為物理地址,以將必要的頁面提供給 CPU。在這種情況下,如果任何頁面超出主存儲器,那麼其他相同大小的頁面將適合該幀,因為幀大小和頁面大小相同,這將導致外部碎片最小化,但相反,它可以發生這種情況可以將進程劃分為一些頁面小於幀大小的頁面,那麼在分頁中可能會出現內部碎片。
為了解決非連續內存分配分段中分頁的這一缺點,引入了分段。在分段中,操作系統將進程劃分為可變大小的段,然後將這些段加載到主內存中,然後進入可變大小的非連續幀。它與分頁具有相同的工作流程,CPU 將生成一個邏輯地址,然後將其映射到基於段表的物理地址。
在非連續內存分配中,不會像連續內存分配那樣浪費主內存。另一方面,與連續內存分配相比,很難實現更多的執行時間。
概括:
1.在連續內存分配中,操作系統將連續的內存塊分配給等待執行的進程。
2.固定大小分區和可變大小分區是連續內存分配中使用的兩種主要內存分配技術
3. 在非連續內存分配中,操作系統將進程劃分為多個部分,然後將其加載到彼此不連續的主內存分區中。
4. 分頁和分段是實現非連續內存分配的主要內存分配技術。
作者簡介:
Akash Pawar 是一名軟件工程師,熱衷於撰寫技術博客,擁有數據結構和算法、操作系統方面的專業知識,並接觸過大規模系統設計。