讀懂操作系統之內存管理總結(八)

前言

內存由大量的字或字節組成,每個字或字節都有自己的地址。CPU根據程序計數器的值從內存中提取指令,這些指令可能會導致需要從特定的存儲器地址進行額外的加載並將其存儲到特定的存儲器地址。通常,程序以二進制可執行文件的形式駐留在磁盤上,該程序必須被帶入內存並放置在一個進程中才能執行。該執行過程可能會在磁盤和內存之間進行交互,磁盤上等待被帶入內存以供執行的進程的集合形成了輸入隊列。將程序加載到進程中執行勢必要進行內存管理,那麼我們如何纔能有效的進行內存管理呢?

內存管理

主內存必須同時容納操作系統和各種用戶進程。因此,我們需要以最有效的方式在主內存中分配不同部分。內存通常分爲兩個分區:一個分區用於駐留的操作系統,另一個分區用於用戶進程。我們可能會將操作系統放在低內存或高內存中。使用這種方法,每個進程都包含在內存的單個連續部分中。在早期對內存管理採取連續分配方式,但是我們必須解決2個主要問題。首先是空間分配,這意味着我們如何以連續的方式存儲數據。其次,是地址轉換,這意味着CPU生成一個邏輯地址,該邏輯地址應用於訪問輔助存儲器,然後如何將邏輯地址轉換爲物理地址以訪問主存儲器。因此,首先我們將瞭解空間分配策略。

固定大小分區

連續內存空間分配是將內存劃分爲幾個固定大小的分區。每個分區可能只包含一個進程。在這種多分區方法中,當一個分區空閒時,將從輸入隊列中選擇一個進程並將其加載到空閒分區中。當進程終止時,該分區可用於另一個進程。假設輔助存儲器中有進程P1,如果要將P1帶入主存儲器,則P1將以連續方式分配空間。如果有10 KB的內存,那麼我們將分區劃分爲固定大小的分區,但是所有分區之間的大小可能並不相同。因此,這種分區方法稱爲固定大小分區。在固定大小分區中,  我們對內存進行分區,並且每個分區的大小都是固定的,無法更改

舉一個栗子:當我們去餐館喫飯時,我們會看到那裏有固定的多個餐桌,有可供一人坐,有提供兩人坐,甚至也有提供了四人座,如此而滿足光顧餐館的不同人數

如圖兩人坐,若此時來的是一個人,那麼將剩餘一個座位,若接下來餐館來了兩人以上,那麼剩餘的一個座位將不再滿足需求,這就是我們所說的“碎片問題”。若通過連續內存空間分配將內存進行固定大小分區,現在,如果要在第2張圖片中放置大小爲4KB的進程P,則只能放置一個5KB的分區。當在5KB槽中放置4KB的進程時,將剩下1KB,這將導致內部碎片。因此,這是固定大小分區的一個主要缺點,即我們無法重用分區,並且會浪費內部空間。當進程從輔助存儲器移動到主存儲器時,由於固定大小分區,所以它不會被分成幾部分,而是整體上將其放置在主存儲器中。訪問數組是連續內存分配的一個很好例子,因爲在數組中,我們只需記住數組第一個元素的基地址,由於內存連續,因此我們可輕鬆訪問各個元素,所以連續分配的優點是可快速訪問即訪問時間非常短。

 

如上,如果我們有5KB的數據並將其放置在上述存儲塊中,那麼將無法放置它。即使我們有8KB可用的空間,但該8KB空間也是非連續的。這就是爲什麼我們不能在內存中放置5KB數據的原因。這將導致外部碎片。外部碎片意味着我們可以插入內存中的數據大小可用,但由於空間不連續,我們無法放置它們。在連續內存分配的情況下,這也是一個非常普遍的問題。

可變大小分區

爲了消除固定大小分區的缺點,引入了可變大小分區。在可變大小分區中,我們不對內存進行分區。只要有內存,進程就會到來,我們就會在內存中分配空間。假設內存大小爲10KB,若進程P1需要4KB,那麼我們將爲P1分配4KB,現在剩餘大小爲6KB。假設P2需要3KB,那麼我們將爲P2分配3KB,現在剩下3KB。在可變大小分區中,我們不會遇到內部碎片。

連續內存分配算法

無論我們通過【首次適配(選擇第一滿足存儲需求的可用空閒塊)】、【最優適配(選擇使用最小的可用空閒塊)】、【最差適配(選擇使用最大的可用空閒塊)】算法都會引起上述外部碎片的問題,這三個算法很簡單,在這裏我就不再詳細闡述。

非連續內存分配

由於連續內存分配或多或少會都引起內部或外部碎片,同時也爲了更好的對內存進行利用和管理,所以纔有了我們前面所將講解過的非連續內存分配的分段和分頁,比如其優點除此之外呢,還有允許共享代碼和數據,支持動態加載和動態鏈接(接下來我們也會講到)在這種情況下,當進程從輔助存儲器移動到主存儲器時,我們可以將其分爲幾部分並放置在主存儲器中。例如鏈表,我們可以直接訪問鏈表的最後一個節點嗎?當然不可以,因爲我們只能從訪問第一個節點開始,並且在第一個節點的幫助下,我們必須遍歷到最後一個節點。同理,在非連續的內存分配中,數據會分散在內存中,並且我們只能訪問該數據的開頭。非連續內存分配完全不會受到外部碎片的影響。若在非連續內存分配的情況下,可以在上圖中插入5KB數據,因爲5KB可以分爲幾部分(第一部分爲4KB,第二部分爲剩餘1KB)。但非連續內存分配的缺點是訪問速度非常慢,因爲我們必須在指針的幫助下才能訪問其他節點,並且必須逐個遍歷,這是很顯然也是必然的,但是它帶來的好處卻遠勝於此。

總結

內存管理大概內容基本都已講解完畢,本節也是內存管理最後一小節內容,接下來我們將進入程序執行操作、線程、進程等內容的詳細講解,感謝您的閱讀,我們下節見。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章