操作系統——3.併發與進程

第三章 內存管理

3.1 程序的裝入和鏈接

★ 高級語言的源代碼轉化爲進程的3個基本步驟:
編譯:由編譯程序(compiler)將用戶源代碼編譯成若個目標模塊
鏈接:由鏈接程序(linker)將目標模塊和庫函數鏈接,形成一個完整的裝入模塊
裝入:由裝入程序(loader)將裝入模塊裝入內存。

★ 空間分類
名空間:編寫程序時,用符號名來訪問某一單元。符號名空間
邏輯空間:目標程序中,以0爲基址進行編址,符號名用具體的數據代替。
內存空間:物理地址

★ 鏈接
含義:源程序經過編譯後,可得到一組目標模塊,再利用鏈接程序將這組目標模塊與所需的庫函數鏈接形成裝入模塊。
靜態鏈接:在程序運行之前,先將各個目標模塊及它們所需的庫函數鏈接成一個完整的裝配模塊(又稱執行模塊),以後不再拆開。
裝入時動態鏈接:目標模塊在裝入內存時,採用邊裝入邊鏈接的鏈接方式。
運行時鏈接:對某些目標模塊的鏈接,是在程序執行中需要該目標模塊時,由操作系統去找到該模塊並將之裝入內存,隨後把它鏈接到調用者模塊上。

★ 裝入

裝入的任務:將可裝入模塊裝入內存;地址重定位:將執行文件中的邏輯地址轉化爲內存物理地址的過程。

絕對裝入方式:

  • 在編譯時就知道程序將駐留在內存中的具體位置,編譯程序產生絕對地址的目標代碼
  • 裝入模塊在裝入內存時,由於程序中的邏輯地址與實際內存地址完全相同,故不需對
    程序和數據的地址進行修改。
  • 優點:實現簡單、無須進行邏輯地址到物理地址的變換。
  • 缺點:程序每次必須裝入同一內存區;程序員必須事先了解內存的使用情況,根據內存情況確定程序的邏輯地址;不適於多道程序系統。

可重定位(靜態重定位)裝入方式:

  • 編譯時採用相對地址,即編譯器假設是裝入到從零開始的內存位置。
  • 邏輯地址與裝入內存後的物理地址無直接關係。
  • 必須重定位。靜態重定位技術:地址映射在程序裝入時進行,以後不再更改程序地址。
  • 缺點:程序重定位後就不能移動,因而不能重新分配內存,不利於內存的有效利用;程序在存儲空間中只能連續分配,不能分佈在內存的不同區域;難於共享。

運行時重定位(動態重定位)裝入方式:

  • 程序的地址轉換不是在裝入時進行,而是在程序運行時動態進行。
  • 運行時動態裝入需要硬件支持,即重定位寄存器,用於保存程序在內存中的起始地址。
  • 程序被執行時,通過重定位寄存器內的起始物理地址和指令或數據的邏輯地址計算其物理地址。
  • 優點:程序不必連續存放在內存中,可分散存儲,可移動;便於共享;有利於緊湊、碎片問題的解決;主流方式
  • 缺點:需要硬件支持,實現複雜;同一地址,可能多次轉換。

3.2 存儲管理

★ 單一連續分配

  • 整個內存空間分成系統區和用戶區,系統區給操作系統使用,用戶區給用戶使用。
  • 適合單用戶、單任務OS

3.2.1 分區管理
分區管理適用於多道程序系統和分時系統。

固定分區

  • 把內存分爲大小相等或不等的分區,在每個分區中只裝入一道程序。
  • 分區分配算法:爲進程分配某個空閒分區。
    分區相等時,任選一個空閒分區;
    分區不等時,根據空閒分區選擇最佳任務或根據任務選擇最佳空閒分區。
  • 存儲保護:界限寄存器
  • 優點: 比單一連續分配方法,內存利用率提高了;可以支持多道程序,無外部碎片;實現簡單
  • 缺點: 分區的數目在系統生成時確定,限制了系統中活躍進程的數目。小作業的內部碎片可能比較大;作業必須預先能夠估計自己要佔用多大的內存空間

動態分區

  • 根據進程的實際需要,動態地爲之分配內存空間。
  • 數據結構:空閒分區表、空閒分區鏈
  • 分區分配算法:首次匹配算法,從鏈首開始順序查找,按地址從低到高排列
    循環匹配算法,循環查找,按地址從低到高排列
    最佳匹配算法,分配滿足要求且最小的空閒分區,容量小到大排列
    最壞適應算法,分配滿足要求且最大的空閒分區,容量大到小排列
  • 存儲保護:上下界寄存器方法,存放作業的結束地址和開始地址。
    基址限長寄存器方法,存放作業的起始地址及作業的地址空間長度。
  • 優點: 支持多道程序;管理方案相對簡單,不需要更多的軟、硬件開銷;實現存儲保護的手段比較簡單
  • 缺點:主存利用不夠充分,存在外部碎片;無法實現多進程共享存儲器的信息;無法實現主存的邏輯擴充,進程的地址空間受實際物理內存的限制。

夥伴系統

  • 綜合靜態劃分技術和動態劃分技術的優點
  • 分配: 進程申請大小爲k的空間,系統分配一2i的空閒分區,其中,2i-1<k≤2i
    [1] 查找大小爲2i的空閒分區,若找到則分配;
    [2] 若未找到大小爲2i的空閒分區,則查找大小爲2i+1的空閒分區;若找到,則將該空閒分區劃分爲相等的兩個分區(一對夥伴),其中的一個用於分配,另一個分區加入大小爲2i的空閒分區鏈中;
    [3] 若未找到2i+1的空閒分區,則需要查找大小爲2i+2的空閒分區,若找到則需要進行兩次劃分。第一次將其分割爲大小爲2i+1的兩個分區,一個用於分配,另一個加入到大小爲2i+1的空閒分區鏈中;第二次將第一次用於分配的空閒分區分割爲2i的兩個分區,一個用於分配,另一個加入到大小爲2i的空閒分區鏈中。
    [4] 若仍未找到2i+2的空閒分區,則繼續查找2i+3的空閒分區,以此類推。
  • 回收: 釋放一個大小爲2i的分區時,算法:
    [1] 若事先不存在2i的空閒分區,則保留該分區爲一個獨立的空閒分區;
    [2] 若事先已存在2i的空閒分區時,則將其與夥伴分區合併爲大小爲爲2i+1的空閒分區;
    [3] 若事先已存在2i+1的空閒分區時,繼續合併爲2i+2的空閒分區,以此類推。
  • 缺點:速度快,但內存利用率不高。

3.2.2 對換

內存擴充:藉助大容量輔存在邏輯上實現內存擴充,來解決內存容量不足的問題。

覆蓋技術(overlay):

  • 基本思想:一個程序的幾個代碼段或數據段,按照時間先後來佔用公共的內存空間。
  • 實現: - 將程序的必要部分代碼和數據常駐內存;- 可選部分在其他程序模塊中實現,平時存放在外存中(覆蓋文件),需
    要用到時才裝入到內存;- 不存在調用關係的模塊不必同時裝入到內存,可相互覆蓋。

對換技術(swapping):

  • 基本思想:把內存中暫不能運行的進程或者暫不使用的程序和數據換出到外存上,以騰出足夠的內存空間,把已具備運行條件的進程或進程所需要的程序和數據換入內存。
  • 優點:不要求用戶給出程序段之間的邏輯覆蓋結構。

3.2.3 離散分配方式

★ 分頁存儲管理

頁面:程序地址空間被劃分成若干固定大小的片段,稱爲頁面;

頁框:物理內存被劃分成相同大小的塊,稱爲頁框。(頁面頁框大小相同)

邏輯地址結構
普通分頁存儲系統: 邏輯地址 = 頁號 + 頁內偏移量(頁內地址)
多級頁表存儲系統: 邏輯地址 = 頁面頁號 + 頁表頁內地址 + 頁內偏移地址

頁表:記錄進程的每個頁面對應的頁框信息。
在這裏插入圖片描述
地址轉換(普通)
① 根據邏輯地址分離出頁面號和頁內偏移
② 檢查頁面號是否非法,若非法則產生越界錯誤,否則繼續
③ 根據頁面號檢索頁表,獲得對應的頁框號
④ 檢查頁表的訪問控制字段,確定訪問是否合法
⑤ 用頁框號乘以頁面大小獲得其對應的起始地址,並將其送入物理地址的高端。
⑥ 將頁內偏移送入物理地址的低端,即形成完整的物理地址。

地址轉換(兩級頁表)
① 通過外部頁表寄存器找到外部頁表首址
② 根據邏輯地址中的頁表頁號找到對應的頁表頁首地址
③ 根據頁表頁內地址在頁表內找到對應的頁表項
④ 根據頁表項獲得頁框號
⑤ 根據頁框號算出頁的首址
⑥ 頁首址+頁內偏移地址得到形成物理地址

頁表的存儲:

  • 頁表存放在內存(主存);
  • PCB保存有頁表的起始地址;
  • 頁表寄存器存放當前運行進程的頁表的起始地址;

快表:高速緩存,專門保存當前進程最近訪問過的一組頁表項。

分頁存儲優點:存在頁內碎片,但碎片相對較小,內存利用率較高;實現了離散分配;無外部碎片。

缺點:需要專門的硬件支持,尤其是快表;不支持動態鏈接,不易實現共享。

★ 分段存儲管理

以段爲基本分配單位的存儲管理方式。

程序的邏輯地址空間被劃分爲若干個段,每個段定義了一組邏輯信息;段的長度由相應的邏輯信息組的長度決定,因而各段長度不等;分段系統往往需要編譯程序的支持。

邏輯地址結構
邏輯地址 = 段號 + 段內偏移量

優點:便於程序模塊化設計;便於動態鏈接;便於保護和共享;無內部碎片。

缺點:地址轉換需要硬件的支持——段表寄存器;分段的最大尺寸受到主存可用空間的限制;存在外部碎片。

★ 分頁系統和分段的比較

  1. 頁是信息的物理單位,分頁的目的是實現離散分配,減少內存的外部碎片,提高內存的利用率。或者說,分頁僅僅是由於系統管理的需要而不是用戶的需要。段則是信息的邏輯單位,它含有一組意義相對完整的信息。分段的目的是爲了能更好地滿足用戶的需要。
  2. 頁的大小固定且由系統決定,由系統把邏輯地址劃分爲頁號和頁內地址兩部分,是由機器硬件實現的,因而在系統中只能有一種大小的頁面;而段的長度卻不固定,決定於用戶所編寫的程序,通常由編譯程序在對源程序進行編譯時,根據信息的性質來劃分。
  3. 分頁的作業地址空間是一維的,即單一的線性地址空間,程序員只需利用一個記憶符,即可表示一個地址;而分段的作業地址空間則是二維的,程序員在標識一個地址時,既需給出段名,又需給出段內地址。
  4. 分頁存儲管理系統不易實現“共享”和“運行時動態鏈接”,而分段系統易於實現實現。

★ 段頁式存儲管理

採用分段方法組織用戶程序,採用分頁方法分配和管理內存。即用戶程序可以用模塊化思想進行設計,一個用戶程序由若干段構成。系統將內存劃分成固定大小的頁框,並將程序的每一段分割成若干頁後裝入內存執行時。

邏輯地址
邏輯地址 = 段號s + 段內頁號p + 頁內偏移量w

地址轉換流程:

  1. 根據邏輯地址分離出段號、頁號和頁內偏移量
  2. 檢查段號是否非法,若非法則產生越界錯誤,否則繼續
  3. 根據段號檢索段表,檢查段表的訪問控制字段,確定訪問是否合法,若合法則繼續,否則產生錯誤。
  4. 根據段表獲取頁表長度和頁表始址,檢查頁號是否非法,若非法則產生越界錯誤,否則繼續
  5. 根據頁表始址和頁號檢索頁表,獲得對應的頁框號。
  6. 用頁框號乘以頁面大小獲得其對應的起始地址,並將其送入物理地址的高端
  7. 將頁內偏移送入物理地址的低端,即形成完整的物理地址。
     優點:離散存儲;內存利用率高;便於保護和共享,支持動態鏈接;無外部碎片。
     缺點:地址轉換複雜;存在內部碎片。

3.3 虛擬存儲技術

基本思想:只裝入當前需要執行的部分頁或段讀入到內存,程序開始執行。缺頁/缺段則有處理器通知操作系統將相應頁/段調入內存。操作系統把暫時不使用的頁/段調出保存到外存。

虛擬存儲器特徵:離散型、局部性、對換性、虛擬性

常用的虛擬存儲技術: - 請求分頁存儲管理- 請求分段存儲管理- 請求段頁式存儲管理

★ 請求分頁存儲管理方式

基本原理:邏輯空間劃分爲頁面,物理空間劃分爲頁框,頁表記錄,引入請求調頁和頁面置換功能,頁面爲基本單位

優點:存在頁內碎片,但碎片相對較小,內存利用率較高;實現了離散分配;無外部碎片;提供了虛擬存儲器,併發度高;提供了虛擬存儲器,使大作業可以在較小的實際內存中運行

缺點:必須有硬件支持;不支持動態鏈接,不易共享;可能造成系統抖動。

頁面置換算法:

  • 最優置換(OPT) 換出不再訪問的,如果沒有則換出最久不訪問的
  • 先進先出置換(FIFO) 換出最早調入內存的
  • 最近最久未使用(LRU)換出最長時間未被訪問過的頁面
  • 時鐘置換算法(CLOCK,Not Recently Used)
    每個頁面設置一個訪問位,訪問該頁面時置1。所有頁面保存在環形鏈表中。發生缺頁中斷時,首先檢查錶針指向頁面,如果R爲0,則新頁面替換之;如果R爲1,則清0,錶針前移一個位置,重複上述過程。
  • 改進型時鐘置換算法

工作集:在某段時間間隔內,進程實際要訪問的頁面的集合。

抖動/顛簸:虛擬內存的典型問題。

  • 現象:頁面頻繁換入出,缺頁率急劇增加;內存有效存取時間加長
  • 原因:多道程序度過高,每個進程分配的頁框數目過少
  • 預防:採取局部置換策略;在CPU調度程序中運用工作集算法;
    L=S準則;掛起若干進程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章