1. 程式人生 > >作業系統--第四章儲存器管理_1

作業系統--第四章儲存器管理_1

程式進記憶體的一般過程:
編譯compiler:編譯程式:將使用者原始碼編譯成若干個目標模組。
連結link:連結程式:將形成的一組目標模組,及它們需要的庫函式連結在一起,形成一個完整的裝入模組。
裝入load:由裝入程式將裝入模組裝入記憶體,構造PCB,形成程序,開始執行(使用實體地址)。

程式裝入中的地址處理

邏輯地址 ==== 實體地址:

  • 絕對裝入方式:
    編譯程式生成的“目的碼”就是”裝入模組” ,邏輯地址直接從某個地址R處增長,裝入模組直接裝入記憶體地址R處。
    優點:裝入過程簡單。不需任何地址變換,程式中的邏輯地址與實際記憶體實體地址完全相同。
    缺點:過於依賴硬體結構, 只適用早期針對硬體直接程式設計、單道環境下。

現在程式裝入一般都要從邏輯地址對映到實體地址:
重定位:把目標程式中的指令和資料的邏輯地址變成記憶體中的實體地址的地址變換過程。

邏輯地址 →重定位→ 實體地址:

  • 靜態可重定位裝入方式:
    地址對映在程式執行之前進行,重定位後實體地址不再改變。
    可由專門設計的重定位裝配程式完成(軟):裝入時根據所定位的記憶體地址去修改每個邏輯地址,新增相應偏移量,重定位為實體地址。
    優點:不需硬體支援,可以裝入有限的多道程式
    缺點:軟體裝入一次完成,一個程式通常需要佔用連續的記憶體空間,程式裝入記憶體後不能移動。也不易實現共享。
  • 動態執行時(重定位)裝入方式:
    實際執行中往往會需要程式在記憶體中的各位置移動,即經常需要重定位到不同的實體地址上。這種執行時移動程式要求地址變換要快速,實現時一般依靠硬體地址變換機構——一個重定位暫存器。
    程式裝入記憶體時,可多次重定位到不同位置。且可以不立即把裝入模組中的相對地址轉換為絕對地址,而是把這種地址轉換推遲到程式真正要執行時才進行。

不同的程式連結方式

根據連結時間的不同,分成三種:

  • 靜態連結:裝入執行前將多個目標模組及所需庫函式連結成一個整體,以後不再拆開。

  • 裝入時動態連結:裝入記憶體時,邊裝入邊連結的連結方式。
    對比:
    靜態連結好的程式,修改部分模組後,需重新連結成可裝入程式。動態方式則便於修改和更新。
    便於實現共享,靜態的N個程式都需要一個模組時,需要進行N次拷貝。

  • 執行時動態連結:對某些目標模組的連結,在執行中需要該目標模組時,才對它進行連結。
    優點:程式執行裝入的內容少了,加快了裝入過程,而且節省大量的記憶體空間。

記憶體的連續分配方式

  1. 單一連續分配:記憶體分為系統區和使用者區兩部分:
    系統區:僅提供給OS使用,通常放在記憶體低址部分
    使用者區:除系統區以外的全部記憶體空間,提供給使用者使用。
    這是最簡單的一種儲存管理方式,只能用於單使用者、單任務的作業系統中。
    優點:易於管理。
    缺點:對要求記憶體空間少的程式,造成記憶體浪費;程式全部裝入,很少使用的程式部分也佔用記憶體。
  2. 固定分割槽分配:把記憶體分為一些大小相等或不等的分割槽,每個應用程序佔用一個分割槽。作業系統佔用其中一個分割槽。
    優點:支援多個程式併發執行,適用於多道程式系統和分時系統。(劃分幾個分割槽便允許幾個多道程式執行).
    缺點:內碎片(一個分割槽內的剩餘空間)造成浪費. 分割槽總數固定,限制併發執行的程式數目。
  3. 動態分割槽分配:分割槽的大小不固定:在裝入程式時根據程序實際需要,動態分配記憶體空間,即——需要多少劃分多少。
    優點:併發程序數沒有固定數的限制,不產生內碎片。
    缺點:有外碎片(分割槽間無法利用的空間)當前記憶體分配有3個小碎片,分別為30K,64K,40K。若有一個120K的作業申請一塊連續空間,無法滿足。

記憶體空間管理之對換

當記憶體空間還是滿足不了需求時,引入“對換”:
把記憶體中暫時不能執行、或暫時不用的程式和資料調到外存上,以騰出足夠的記憶體;把已具備執行條件的程序和程序所需要的程式和資料,調入記憶體。
按對換單位分類:
整體對換(或程序對換):以整個程序為單位(連續分配)
頁面對換或分段對換:以頁或段為單位(離散分配)