操作系統精髓與設計原理學習筆記七:內存管理

在單道程序設計系統中,內存被劃分成兩個部分:一部分供操作系統使用(駐留監控程序、內核),一部分供當前正在執行的程序使用。在多道程序設計系統中,必須在內存中進一步細分出“用戶”部分,以滿足多個進程的要求。細分的任務由操作系統動態完成,這稱爲內存管理

有效的內存管理在多道程序設計系統中是至關重要的。如果只有少量進程在內存中,所有進程大部分時間都用來等待IO,這種情況下,處理器也處於空閒狀態。因此,必須有效地分配內存來保證有適當數目的就緒進程可以佔用這些可用的處理時間。


一、內存管理的需求

1 重定位

在多道程序設計系統中,可用的內存空間通常被多個進程共享。

通常情況下,程序員並不能事先知道在某個程序執行期間會有其他哪些程序駐留在內存中。此外還希望通過提供一個巨大的就緒進程池,能夠把活動進程換入或換出內存,以便使處理器的利用率最大。

一旦程序被換出磁盤,當下一次被換入時,需要把進程重定位到內存的不同區域。因此,我們事先不知道程序將會被放置到哪個區域,並且我們必須允許程序通過交換技術在內存中移動。

操作系統需要知道進程控制信息和執行棧的位置,以及該進程開始執行程序的入口點。

2 保護

每個進程都應該受到保護,以免被其他進程有意無意地干涉。因此,該進程以外的其他進程中的程序不能未經授權地訪問(進程讀操作或寫操作)該進程的內存單元。

通常,用戶進程不能訪問操作系統的任何部分,不論是程序還是數據。並且,一個進程中的程序通常不能跳轉到另一個進程中的指令。如果沒有特別的許可,一個進程中的程序不能訪問其他進程的數據區。

3 共享

任何保護機制都必須具有一定靈活性,以允許多個進程訪問內存的同一部分。

例如,如果多個進程正在執行同一個程序,則允許每個進程訪問該程序的同一個副本要比讓每個進程都有單獨的副本更有優勢。

合作完成同一個任務的進程可能需要共享訪問相同的數據結構。

4 邏輯組織

計算機系統中的內存總是被組織成線性的地址空間,並且地址空間是由一系列字節或字組成的。

但這種組織方式並不符合程序構造的典型方法。大多數程序被組織成模塊,某些模塊式不可修改的,某些模塊包含可以修改的數據。

如果操作系統和計算機硬件能夠有效的處理以某種模塊的形式組織的用戶程序和數據,則會帶來很多好處。

5 物理組織

系統主要關注的是內存和外存之間信息流的組織。在兩極存儲器間移動信息的任務應該是一種系統責任,而該任務恰恰就是儲存管理的本質所在。


二、內存分區

內存管理最基本的操作是由處理器把程序裝入內存中執行。

典型內存管理技術:

1)固定分區

2)動態分區

3)簡單分頁

4)簡單分段

5)虛擬內存分頁

6)虛擬內存分段

1 固定分區

在大多數內存管理方案中,可以假定操作系統佔據了內存中的某些固定部分,內存的其餘部分可供多個用戶進程使用。

管理用戶內存空間的最簡單的方案就是把它分區,從而形成若干邊界固定的區域。

對於固定分區的兩個難點:

1)程序可能太大而不能放到一個分區中。在這種情況下,程序員必須使用覆蓋技術設計程序,使得在任何時候該程序只有一部分需要放到內存中。

2)由於被裝入的數據塊小於分區大小,從而導致分區內部有空間浪費,這種現象稱爲內部碎片

對於大小相等的分區策略,進程在內存中的放置非常簡單。只要存在可用的分區,進程就可以裝入分區。由於所有的分區大小相等,因而使用哪個分區都沒有關係。如果所有的分區都被處於不可運行狀態的進程所佔據,那麼這些進程中的一個必須被換出,從而爲新進程讓出空間。

對於大小不等的分區策略,有兩種方法可以把進程分配到分區。最簡單的方法是把美國進程分配到能夠容納它的最小分區。在這種情況下,每個分區都需要維護一個調度隊列,用於保存從這個分區換出的進程。

一種更可取的方法是爲所有進程只提供一個隊列。當需要把一個進程裝入內存時,選擇可以容納該進程的最小可用分區。如果所有分區都已被佔據,則必須進行交換。

2 動態分區

對於動態分區,分區長度和數目是可變的。當進程被裝入內存時,系統會給它分配一塊和它所需容量完全相等的內存空間,不多也不少。

動態分區方法在開始時是很好的,但它最終會導致在內存中出現許多小的空洞。隨時間的推移,內存中產生了越來越多的碎片,內存利用率隨之下降。這種現象稱爲外部碎片,指在所有分區外的存儲空間變成越來越多的碎片。

克服外部碎片的一種技術室壓縮:操作系統不時地移動進程,使得進程佔用的空間連續,並且使所有空閒空間連成一片。

放置算法:當把一個進程裝入或換入內存時,如果內存中有多個足夠大的空閒塊,則操作系統必須確定要爲此進程分配哪個空閒塊。可供考慮的有三种放置算法:最佳適配、首次適配、下次適配。

換置算法:在使用動態分區的多道程序設計系統中,有時候會出現內存中的所有進程都處於阻塞態,並且即使進行了壓縮,對一個新的進程仍沒有足夠的內存空間。爲了避免由於等待一個活動進程解除阻塞狀態引起的處理器時間浪費,操作系統將把一個阻塞的進程換出內存,給新進程或處於就緒-掛起態的進程讓出空間。因此,操作系統必須選擇要替換哪個進程。

3 夥伴系統

固定分區方案限制了活動進程的數目,並且,如果可用分區的大小與進程大小非常不匹配,則內存空間的利用率非常低。

動態分區的維護特別複雜,並且引入了進行壓縮的額外開銷。

夥伴系統是一個合理的這種方案,它客服了固定分區和可變分區方案的缺陷。但在當前的操作系統中,基於分頁和分段機制的虛擬內存更先進。

4 重定位

當進程被換入或在內存中移動時,指令和數據單元的位置會發生改變。

邏輯地址是指與當前數據在內存中的物理分配地址無關的訪問地址,在執行對內存的訪問之前必須把它轉換成物理地址。相對地址是邏輯地址的一個特例,是相對於某些一直點的存儲單元。物理地址或絕對地址是數據在內存中的實際位置。

首先,基址寄存器中的值假設相對地址產生一個絕對地址;然後得到的結果與接線寄存器的值想比較,如果這個地址在界限範圍內,則繼續該指令的執行。


三、分頁

假如內存被劃分稱爲大小固定相等的塊,且塊相對比較小,每個進程也被分成同樣大小的小塊,那麼進程中稱爲的塊可以指定到內存中稱爲頁框的可用塊。

簡單扉頁類似於固定分區,他們的不同之處在於:採用分頁技術的分區相當小,一個程序可以佔據多個分區,並且這些分區不需要是連續的。

使用頁大小爲2的冪的頁的結果是雙重的。首先,邏輯地址方案多編程者、彙編器和鏈接是透明的。程序的每個邏輯地址(頁號,偏移量)與它的相對地址是一致的。第二,用硬件實現運行時動態地址轉換的功能相對比較容易。

總之,採用簡單分頁技術,內存被分成許多大小相等且很小的頁框,每個進程被劃分成同樣大小的頁;較小的進程需要較少的頁,較大的進程需要較多的頁;當一個進程被裝入時,它的所有頁都被裝入到可用頁框中,並且建立一個頁表。


四、分段

採用分段技術,可以把程序和其相關的數據劃分到幾個中。儘管段有一個最大長度限制,但並不要求所有程序的所有段的長度都相等。和分頁一樣,採用分段技術時的邏輯地址也是由兩部分組成:段號和偏移量。

與動態分區不同的是,在分段方案中,一個程序可以佔據多個分區,並且這些分區不要求是連續的。分段消除了內部碎片,但是和動態分區一樣,它會產生外部碎片,不過由於進程被分成多個小塊,因此外部碎片也會很小。

分頁對程序員來說是透明的,而分段通常是可見的,並且作爲組織程序和數據的一種方便手段提供給程序員。

類似於分頁,在簡單的分段方案中,每個進程都有一段表,系統也會維護一個內存中的空閒塊列表。每個段表象必須給出相應的端在內存中的起始地址,還必須指明段的長度,以確保不會使用無效地址。

總之,採用簡單分段技術,進程被劃分成許多段,段的大小不需要相等;當一個進程被調入時,它的所有段都被裝入內存的可用區域,並建立一個段表。


五、安全問題

最明顯的安全需求是防止進程的內存中的內容遭受到未授權訪問。

如果進程未生命共享其他部分內存,則其他程序不得訪問這部分內存內容。

如果進程生命其某些部分內存可以被指定程序共享,那麼操作系統的安全服務必須保證只有這些指定進程可以訪問這部分內存。


六、小結

內存管理是操作系統中最重要、最複雜的任務之一。內存管理把內存視爲一個資源,可以分配給多個活動進程,或者由多個活動進程共享。爲有效地使用處理器和IO設備,需要在內存中保留儘可能多的進程。此外,程序員在進程程序開發時最好能不受程序大小的限制。

內存管理的基本工具是分頁和分段。採用分頁技術,每個進程被劃分成相對比較小的、大小固定的頁。採用分段技術可以使用大小不同的塊。還可以再一個單獨的內存管理方案中把分頁技術和分段技術結合起來使用。

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