1. 程式人生 > 其它 >作業系統學習筆記(7)——儲存管理

作業系統學習筆記(7)——儲存管理



1、計算機儲存體系

  • 金字塔體系:暫存器>快取記憶體>主儲存器>磁碟快取>固定磁碟>可移動儲存介質
  • 主儲存器(記憶體):
    • 記憶體空間是由儲存單元組成的一維連續的地址空間
    • 存放程式碼及資料等資訊

    



2、儲存管理目標及任務

  • 目標:
    • 充分利用記憶體空間,為程序的併發執行提供儲存支援

    • 方便使用者使用,自動裝入程式、資料,使用者不必考慮硬體細節

  • 功能任務
    • 實現記憶體空間的管理、分配與回收
    • 實現邏輯地址到實體地址的自動轉換
    • 實現多個程序間的資訊共享與通訊
    • 實現多個程序隔離和資訊保護
    • 實現記憶體和輔存空間的協同使用
  • 地址重定位
    • 靜態地址重定位和動態地址重定位
    • 靜態地址重定位是在虛擬空間程式執行之前,由裝配程式完成的地址對映工作。對於虛擬空間內的指令和資料來說,靜態地址重定位只完成了一個首地址不同的連續地址變換。它要求所有待執行的程式必須在程式執行之前完成它們之間的連結,否則將無法得到正確的記憶體地址和記憶體空間。優點是不需要硬體支援,但是缺點是必須佔有連續的記憶體空間,這就難以做到資料和程式的共享。
    • 動態地址重定位是程式在執行過程中,在CPU訪問記憶體之前,將要訪問的程式或資料地址轉換為記憶體地址。動態地址重定位需要硬體的支援。地址重定位機構需要一個或多個基地址暫存器BR和一個或多個程式虛擬地址暫存器VR,指令或資料的記憶體地址MA與虛擬地址的計算關係如下:MA=(BR)+(VR),這裡的(BR),(VR)分別表示暫存器中的內容。優點有:記憶體可以不連續分配、提供實現虛存的基礎、有利於程式共享。


3、連續儲存區管理方案



4、分割槽儲存的管理方案

  • 儲存分割槽
    • 系統把記憶體使用者區劃分為若干分割槽
    • 分割槽大小可以相等,也可以不等
    • 一個程序佔據一個分割槽
    • 分類:固定分割槽儲存、可變分割槽儲存
  • 固定分割槽
    • 預先將記憶體分割成若干個連續區域
    • 每個連續區的大小可以相同,也可以不同,但是,一旦劃分好分割槽之後,主存中分割槽的個數就固定了,且每個分割槽的大小也固定不變
    • 如果有足夠大空閒區,則分配給建立的程序
    • 每個分割槽用來裝入一個作業,由於主存中有多個分割槽,就可同時在每個分割槽中裝入一個作業。所以,這種儲存管理方式是適用於多道程式系統的
    • 顯然為了管理主存空間的使用,必須設定一張“主存分配表”(分割槽說明表),用來說明各分割槽的分配情況。
    • 當作業佇列中有作業要裝入主存時,儲存管理可採用“順序分配演算法”進行主存空間的分配。順序檢視主存分配表,找到一個標誌為“0”的並且長度大於或等於欲裝入作業的地址空間長度的分割槽就可以了
    • 這種固定分割槽模式的地址轉換一般採用靜態重定位技術,如果記憶體需要擴充則採用覆蓋技術
    • 優點:實現簡單,無外部碎片
    • 缺點:a.當用戶程式太大時,可能所有的分割槽都不能滿足需求,此時不得不採用覆蓋技術解決,但這又會降低效能。b.會產生內部碎片,碎片大,存在小分割槽佔用大作業的情況,記憶體利用率低。
  • 可變分割槽/變長分割槽/動態分割槽
    • 與固定分割槽的區別就是:動態的劃分分割槽
    • 這種分配方式不會預先劃分記憶體分割槽,而是在程序裝入記憶體時,根據程序的大小動態地建立分割槽,並使分割槽的大小正好適合程序的需要,因此係統分割槽的大小和數目是可變的。
    • 可變分割槽模式下,剛開始,OS就緒,但任何使用者程式未進入記憶體前整個使用者記憶體區是一大空間。已佔用區和空閒分割槽並不是絕對的
    • 需要建立空閒區表和已分配區表來進行管理
    • 程式進入記憶體時的例行工作就是分配空閒區和裝入程式,並修改相應的空閒表和已分配區表
    • 一旦一個記憶體分割槽被分配給一個程序,該程序可以被裝入該塊中執行,裝入時需重定位。
    • 可變分割槽的實現過程同樣的系統要相應的資料結構表來記錄記憶體的使用情況
    • 可變分割槽的分配方式就是當有作業要裝入記憶體時,在空閒區表中找一找“未分配”的欄目,從中找出一個能容納作業的空閒區。若空閒區大於作業的長度時則被分成兩部分,一部分分配給作業;另一部分仍作為空閒區登記在表中。若找到的空閒區等於作業長度時,分配後該欄目狀態改為“空”狀。顯然這種動態的按需分配模式有效地解決了固定分割槽方式中由於分割槽內部剩餘記憶體空置所形成的內部碎片的問題。當一個新作業裝入記憶體時,我們也看到是需要按照一定的演算法,從空閒分割槽表(或空閒分割槽鏈)中選出一個分割槽分配給該作業的
    • 分割槽演算法
      • 最先(首次)適應分配演算法:每次都從低地址開始查詢,找到第一個能滿足大小的空閒分割槽。這種演算法優點是實現簡單,缺點是可能將低地址處大的空閒區分割成許多小的空閒區,形成許多不連續的“碎片”。碎片長度可能不能滿足作業要求,降低了記憶體利用率。
      • 最佳適應演算法:空閒分割槽按容量遞增次序連結。每次分配記憶體時順序查詢空閒分割槽表,找到大小能夠滿足要求的第一個空閒分割槽。這種演算法貌似最佳,儘可能地選擇了最適合的分割槽空間,但也因此產生大量的不能被使用的很小的空閒區。因此這種方法會產生很多的外部碎片。所以該演算法分配效果不一定是最佳的。
      • 最壞適應演算法:為了解決最佳適應演算法的問題——即留下太多難以利用的小碎片,我們轉換思路考慮可以在每次分配時,優先使用最大的連續空閒區,這樣分配後的空閒區就不會太小,更方便使用。顯然這種演算法分割後產生的空閒區一般仍可以供以後分配使用。但工作一段時間後,也不能滿足大作業對空閒區的請求。
    • 動態分割槽的地址轉換模式
      • 顯然,採用可變分割槽方式時,一般採用動態重定位方式裝入作業。
      • 它的記憶體擴充方面,雖然消除了固定分割槽造成的“內碎片”,但是不可避免的在記憶體空間造成“外碎片”。我們一般採用移動(緊縮)技術進行記憶體擴充,定時的或在記憶體緊張時,將記憶體中所有作業移到記憶體的一端,使其相鄰。
      • 那麼我們也看到經過緊縮後的程序在記憶體中的位置發生了變化,若不對程式和資料的地址進行修改,在程序就無法執行。要使其執行,必須進行“動態重定位”
    • (問題一)記憶體回收:空間合併,修改管理表格
    • (問題二)記憶體碎片:反覆分配回收後,產生很多不連續的小空閒塊
    • 問題解決方法:


5、 儲存覆蓋與交換技術

  • 引入原因
    • 多道環境下擴充記憶體,解決在較小的儲存空間中執行較大、較多程序時的矛盾
    • 程序的程式和資料主要放在外存,需要執行的部分放在記憶體,內外存之間進行資訊交換
  • 覆蓋技術
    • 程序若干程式段、資料段等共享同一儲存空間
    • 要求模組之間有明確呼叫結構,並向系統指明
  • 交換技術
    • 多個程序分時共享記憶體儲空間
    • 程序在內、外存之間動態排程
    • 需要在輔存設定一個盤交換區