操作系統0x08-內存管理概念

3.1.1 內存管理的基本原理和要求

內存管理:操作系統對內存的劃分和動態分配。
內存管理的功能:

功能 說明
內存空間的分配與回收 由操作系統完成主存儲空間的分配和管理,使程序員擺脫存儲分配的麻煩,提高編程效率。
地址轉換 在多道程序環境下,程序中的邏輯地址與內存中的物理地址不可能一致,因此存儲管理必須提供地址變換功能,把邏輯地址轉換爲相應的物理地址
內存空間的擴充 利用虛擬存儲技術和自動覆蓋技術,從邏輯上擴充內存。
存儲保護 保證各道作業在各自的存儲空間內運行,互不干擾。

程序的裝入和鏈接

      創建進程首先要將程序和數據裝入內存,將用戶源程序變爲可在內存中執行的程序。有以下三個步驟:
編譯:由編譯程序將用戶源代碼編譯成若干目標模塊。
鏈接:由鏈接程序,將編譯後形成的一組目標模塊及所需的庫函數鏈接在一起,形成一個完整的裝入模塊。
裝入:由裝入程序將裝入模塊裝入內存運行。
      程序的鏈接有以下三種方式:
靜態鏈接:在程序運行之前,先將各目標模塊及他們所需的庫函數鏈接成一個完整的可執行程序,以後不再拆開。
裝入時動態鏈接:將用戶源程序編譯後所得到的一組目標程序再裝入內存時,採用邊裝入邊鏈接的方式。
運行時動態鏈接:對某些目標模塊的連接是在程序執行中需要該目標模塊時才進行的。其優點是便於修改和更新,便於實現對目標模塊的共享。

邏輯地址與物理地址

      編譯後,每個目標模塊都從0號單元開始編址,這稱爲該目標模塊的相對地址(邏輯地址)。當鏈接程序將各個目標程序鏈接成一個完整的可執行目標程序時,鏈接程序順序依次按各個模塊的相對地址構成統一的從0號單元開始編址的邏輯地址空間
      物理地址空間是指內存中物理單元的集合,它是地址轉換的最終地址,進程在運行時執行指令和訪問數據,最後都要通過物理地址從主存中存取。當裝入程序將可執行代碼裝入內存中,必須通過地址轉換將邏輯地址轉換爲物理地址,這個過程稱爲地址重定位

內存保護

(1)在CPU中設置一對上、下限寄存器,存放用戶作業在主存中的下限和上限地址,每當CPU要訪問一個地址時,分別和兩個寄存器的值對比,判斷有無越界。
(2)採用重定位寄存器和界地址寄存器來實現這種保護。重定位寄存器含最小的物理地址值,界地址寄存器含邏輯地址的最大值。每個邏輯地址值必須小於界地址寄存器。內存管理機構動態的將邏輯地址與界地址寄存器進行比較,若未發生地址越界,則加上重定位寄存器的值後映射成物理地址,再送交內存單元。
在這裏插入圖片描述

3.1.2 覆蓋與交換

覆蓋

      由於程序運行時並非任何時候都要訪問程序及數據的各個部分。因此,可把用戶空間分成一個固定區和若干覆蓋區,將經常活躍的部分放在固定區,其餘部分按調用關係分段,首先將那些即將要訪問到的段放入覆蓋區,其他段放在外存中,在需要調用前,系統再將其調入覆蓋區替換覆蓋區中原有的段。
      覆蓋技術的特點是打破了必須將一個進程的全部信息裝入主存後才能運行的限制。但當同時運行程序的代碼量大於儲存時,仍不能運行。此外,內存中能夠更新的地方只有覆蓋區的段,不在覆蓋區的段會常駐內存。

交換

      把處於等待狀態的程序從內存移到輔存,把內存空間騰出來,這一過程稱爲換出,把準備好競爭CPU運行的程序,從輔存移到內存,這一過程又稱換入

3.1.3 連續分配管理方式

      連續分配方式是指爲一個用戶程序分配一個連續的內存空間。

單一連續分配

      內存在此方式下分爲系統區和用戶區,系統區僅供操作系統使用,通常在低地址部分;用戶區是爲用戶提供的除系統區之外的內存空間,這種方式無需進行內存保護,因爲內存中永遠只有一道程序,因此肯定不會因爲訪問越界而干擾其他程序。
      優點是簡單,無外部碎片可以採用覆蓋技術,不需要額外的技術支持。缺點是隻能用於單用戶單任務的操作系統,有內部碎片,存儲器的利用率極低。

固定分區分配

      固定分區分配是最簡單的一種多道程序存儲管理方式,它將用戶內存空間劃分爲若干固定大小的區域,每個分區只裝入一道作業,當有空閒分區時,便可在從外存的後備作業隊列中選擇適當大小的作業裝入該分區,如此循環。
      固定分區分配在劃分隊列中有兩種不同的方式:
在這裏插入圖片描述
(1)大小相等的分區:用於利用同一臺計算機去控制多個相同對象的場合,缺乏靈活性。
(2)大小不等的分區:劃分爲多個較小的分區、適量的中等分區和少量大分區。
      爲便於內存分配,通常將分區按大小排隊,併爲之建立一張分區說明表。其中個表象包括每個分區的初始地址、大小及狀態。

分區號 大小/KB 起址 狀態
1 12 20 已分配
2 32 32 已分配
3 64 64 已分配
4 128 128 已分配

      這種分區方式存在兩個問題:一是程序可能太大而放不進任何一個分區中,這時用戶不得不使用覆蓋技術來使用內存空間;二是主存利用率低,當程序小於固定分區大小時,也獨佔一個完整的內存分區空間,這樣分區內部就存在空間浪費,這種現象稱爲內部碎片
      固定分區是可用於多道程序設計的最簡單的存儲分配,無外部碎片,但不能實現多進程共享一個主存區,所以存儲空間利用率低。

動態分區分配

      不預先劃分內存,而是在進程裝入內存時,根據進程的大小動態地建立分區,並使分區的大小正好適合進程的需要。
在這裏插入圖片描述
      隨着進程的換入/換出,在內存中會產生越來越多的碎片,如上圖的6MB,4MB。這些小的內存快成爲外存碎片。克服外部碎片可以通過緊湊技術來解決。即操作系統不斷地對進程進行移動和整理,但這需要動態重定位寄存器的支持,且相對費時。
      在進程裝入或換入主存時,若內存中有多個足夠大的空閒塊,則操作系統必須確定分配哪個內存塊給進程使用,這就是動態分區的分配策略。有以下幾種算法:

  • 首次適應算法:空閒分區以地址遞增的次序鏈接。分配內存時順序查找,找到大小能滿足要求的第一個空閒分區。
  • 最佳適應算法:空閒分區以容量遞增的方式形成分區鏈,找到第一個能滿足要求的空閒分區。
  • 最壞適應算法:空閒分區以容量遞減的次序鏈接,找到第一個能滿足要求的空閒分區。
  • 鄰近適應算法:由首次適應算法演變而成,不同在於分配內存時從上次查找結束的位置開始繼續查找。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章