1. 程式人生 > >作業系統-記憶體管理(參考王道)

作業系統-記憶體管理(參考王道)

記憶體管理的功能

1.記憶體空間的分配與回收:由作業系統完成主儲存器空間的分配和管理,使程式設計師擺脫儲存分配麻煩,提高程式設計效率。

2.地址轉換:在多道程式環境下,程式中的邏輯地址與記憶體中的實體地址不可能一致,因此儲存管理器必須提供地址變換功能,把邏輯地址轉換成相應的實體地址。

3.記憶體空間的擴充:利用虛擬儲存技術或者自動覆蓋技術,從邏輯上擴充記憶體。

4.儲存保護:保證各道作業在各自的儲存空間內執行,互不干擾。

連結的三種方式

1.靜態連結:在程式執行之前,先將各目標模組及它們所需的庫函式連結在一起,形成一個完整的裝入模組。

2.裝入時動態連結:將使用者源程式編譯後所得到的一組目標模組,在裝入記憶體時,採用邊裝入邊連結方式。

3.執行時動態連結:對某些目標模組的連結,是在程式執行中需要該目標模組時,才對它進行的連結,其優點是便於修改和更新,便於實現對目標模組的共享。

裝入

絕對裝入:在編譯時,如果知道程式駐留在記憶體中的某個位置,編譯程式將產生絕對的地址目的碼。絕對裝入由於邏輯與實際記憶體地址相同,故不需要對程式和資料的地址進行修改。絕對裝入只適用於單道程式環境,絕對地址可由程式設計師在編譯或者彙編時賦予。

可重定位裝入:在多道程式環境下,多個目標模組的起始地址通常都是從0開始,程式中的其他地址都是相對於起始地址的,此時採用可重定位裝入方式,根據記憶體的目前情況,將裝入模組裝入到記憶體的適當位置。裝入時對目標程式中指令和資料的修改稱為重定位,地址變換通常是在裝入時一次完成的。所以又稱靜態重定位。

,靜態重定位的特點是在一個作業裝入記憶體時,必須分配其要求的全部記憶體空間,如果沒有足夠的記憶體,就不能裝入該作業,此外,作業一旦進入記憶體後,在整個執行期間不能在記憶體中移動。

動態執行時裝入:也稱為動態重定位,程式在記憶體中如果發生移動,就需要採用動態的裝入方式。裝入程式在把裝入模組裝入記憶體後,並不立即把裝入模組中的相對地址轉換成絕對地址,而是把這種地址轉換推遲到程式真正要執行時才進行。因此,裝入記憶體後的所有地址均為相對地址。這種方式需要一個重定位暫存器的支援。

動態重定位的特點是可以將程式分配到不連續的儲存區中,在程式執行之前可以只裝入它的部分程式碼即可投入執行,然後在程式執行期間,根據需要動態申請分配的記憶體,便於程式段的共享,可以向用戶提供一個比儲存空間大得多的地址空間。

記憶體保護

兩種方式

1.CPU中設定一對上,下限暫存器,存放使用者作業在主存中的下限和上限,每當CPU要訪問一個地址時,分別和兩個暫存器的值相比,判斷有無越界。

2.通過採用重定位暫存器(或基址暫存器)和界地址暫存器(又稱限長暫存器)來實現這種保護,重定位暫存器含最小的實體地址值,界地址暫存器含邏輯地址的最大值,每個邏輯地址值必須小於界地址暫存器,記憶體管理機構動態的將邏輯地址與界地址暫存器進行比較,如果未發生地址越界。則加上重定位暫存器的值後對映成實體地址,再送交記憶體單元。

覆蓋與交換技術

1.覆蓋

由於程式執行時並非任何時候都要訪問程式及資料的各個部分(尤其是大程式),因此可以把使用者空間分成為一個固定區和若干個覆蓋區。將經常活躍的部分放在固定區,其餘部分按照呼叫關係分段,首先將那些即將要訪問的段放入覆蓋區,其他段放在外存中,在需要呼叫前,系統將其調如覆蓋區,替換覆蓋區中原有的段。覆蓋技術的特點是打破了必須將一個程序的全部資訊裝入記憶體後才能執行的限制,但當同時執行程式的程式碼量大於主存時仍不能執行,再而,大家要注意到,記憶體中能夠更新的地方只有覆蓋區的段,不在覆蓋區的段會常駐記憶體。

2.交換

把處於等待狀態(或CPU排程原則下被剝奪執行權力)的程式從記憶體移到輔存,把記憶體空間騰出來,這一過程又叫換出:把準備好競爭CPU執行的程式從輔存移到記憶體,這一過程又稱為換入。

注意:

1.交換需要備份儲存,通常是快速磁碟,它必須足夠大,並且提供對這些記憶體映像的直接訪問。

2.為了有效使用CPU,需要每個程序的執行時間比交換時間長,而影響交換時間的主要是轉移時間,轉移時間與所交換的空間記憶體成正比。

3.如果換出程序,比如確保該程序的記憶體空間成正比。

4.交換空間通常作為磁碟的一整塊,且獨立於檔案系統,因此使用就可能很快。

5.交換通常在有許多程序執行且記憶體空間吃緊時開始啟動,而系統負荷降低就暫停。

6.普通交換使用不多,但交換的策略的某些變種在許多系統中(如UNIX系統)仍然發揮作用。

交換技術主要是在不同程序(或作業)之間進行,而覆蓋則用於同一程式或程序中。

連續分配方式

1.單一連續分配方式

記憶體在此方式下分為系統區和使用者區,系統區僅提供給作業系統使用,通常在低地址部分;使用者區是為使用者提供的,除系統區之外的記憶體空間。

優點:無外部碎片,可以採用覆蓋技術,不需要額外技術支援。

缺點:只能用於單使用者,單任務作業系統中,有內部碎片,儲存器利用率極低。

2.固定分割槽分配

固定分割槽分配是最簡單的一種多道程式儲存管理方式,它將使用者記憶體空間劃分為若干個固定大小的區域,每個分割槽只裝入一道作業。當有空閒分割槽時,便可以再從外存的後背作業佇列中,選擇適當大小的作業裝入該分割槽,如此迴圈。

1.分割槽大小相等:用於利用一臺計算機控制多個相同物件的場合,缺乏靈活性

2.分割槽大小不等:劃分為含有多個較小的分割槽,適量的中等分割槽及少量的大分割槽。

優點:1.沒有外部碎片

缺點:1.程式可能太大而放不進任何一個分割槽中,這時使用者不得不使用覆蓋技術來使用記憶體空間。

2.主存利用率低,當程式小於固定分割槽大小時,也佔用一個完整的記憶體分割槽空間,這樣分割槽內部有空間浪費,這種現象稱為內部碎片。

3.不能多個程序共享一個主存區

3.動態分割槽分配

動態分割槽分配又稱為可變分割槽分配,是一種動態劃分記憶體的分割槽方法。這種分割槽方法不預先將記憶體劃分,而是要在程序裝入記憶體時,根據程序大小動態建立分割槽,並使分割槽的大小正好適合程序的需要。

缺點:外部隨便很多(通過緊湊消除,就是作業系統不時地對程序進行移動和整理。但是這需要動態重定位暫存器地支援,且相對費時。緊湊地過程實際上類似於Windows系統中地磁碟整理程式,只不過後者是對外存空間地緊湊)

1.首次適應演算法

2.最佳適應演算法

3.最壞適應演算法

4.鄰近適應

首次適應不僅最簡單,通常也是最好最快,不過首次適應演算法會使得記憶體低地址部分出現很多小的空閒分割槽,而每次查詢都要經過這些分割槽,因此也增加了查詢的開銷。鄰近演算法試圖解決這個問題,但實際上,它常常會導致在記憶體的末尾分配空間分裂成小的碎片,它通常比首次適應演算法結果要差。

最佳導致大量碎片,最壞導致沒有大的空間。

進過實驗,首次適應比最佳適應要好,他們都比最壞好。

非連續分配管理

需要額外地空間儲存(分散區域)地索引,使得非連續分配地方式儲存密度低於連續儲存方式。

根據分割槽大小是否固定分為分頁儲存管理方式和分段儲存管理方式。

1.分頁儲存管理方式(根據是否把所有頁面都裝入記憶體分為)

1.1 基本分頁儲存管理

1.2請求分頁儲存管理

分頁的方法形式上看,像分割槽相等的固定分割槽技術,分頁管理不會產生外部碎片,但它又又本質不同點:塊的大小相對分割槽要小很多,而且程序頁按照塊進行劃分,程序執行時按塊申請主存可用空間執行。每個程序平均只產生半個塊大小的內部碎片(也稱頁內碎片)

程序中的塊稱為頁,記憶體中的塊稱為頁框(頁幀),外存頁以同樣的單位進行劃分,直接稱為塊。

頁面過小頁表佔用空間大,頁面過大,碎片大。

頁式管理只需要給出一個整數就能確定對應的實體地址,這是因為頁面大小L是固定的,因此,頁式管理中地址空間是一維空間。

地址變換機構

有快表的地址變換機構

(有些處理機設計為快表和慢表同時查詢,如果在快表中查詢成功則終止慢表的查詢。

3.分段儲存管理方式

分段管理方式的提出則是考慮了使用者和程式設計師,以滿足方便程式設計,資訊保護和共享,動態增長及動態連結等多方面的需要。

段內要求連續,段間不要求連續

在段式系統中,段號和段內偏移量必須由使用者顯示提供,在高階程式設計語言中,這個工作由編譯程式完成。

段表:每個程序都有一張邏輯空間與記憶體空間對映的段表,其中每一個段表項對應程序的一個段,段表項記錄該段在記憶體中的起始地址和段的長度。

地址變換機構:

為了查詢方便,頂級頁表最多隻能有1個頁面

段頁式儲存管理方式:

頁式儲存管理能有效地提高記憶體利用率,而分段儲存管理能反映程式的邏輯結構並有利於段的共享。

作業的地址空間首先被分成若干個邏輯段,每段都有自己的段號,然後再將每一段分成若干個大小固定的頁。

邏輯地址有三部分構成:段號,頁號,頁內偏移量

段表表項:段號,頁表長度,頁表起始地址

頁表表項:頁號,塊號

段表暫存器:指出段表起始地址和段表長度

頁表暫存器:判斷是否越界

重要概念

1.虛擬記憶體的管理需要有相關硬體和軟體的支援,有請求分頁頁表機制,缺頁中斷機制,地址變換機構等。

2.在使用交換技術時,如果一個程序正在進行I/O操作時,則不能交換出主存。否則它的I/O資料區將被新換入的程序佔用,導致錯誤,不過可以在作業系統中開闢I/O緩衝區,將資料從外設或將資料輸出到外設的I/O活動在系統緩衝區中進行,這時在系統緩衝區與外設I/O時,程序交換不受限制。

3.當程式要訪問某個記憶體單元時,由硬體檢查是否允許,如果允許則執行,否則產生地址越界中斷。

4.段頁式儲存管理中,地址對映表是每個程序一張頁表,每個段一張段表。

5.記憶體保護需要由作業系統和硬體機構合作完成,以保證程序空間不被非法訪問,記憶體保護是記憶體管理的一部分,是作業系統的任務,但是處於安全性和效率考慮,必須由硬體實現,所以需要作業系統和硬體機構的合作來完成。

6.覆蓋技術是早期在單一連續儲存管理中使用的擴大儲存容量的一種技術,它同樣也可用於固定分割槽分配的儲存管理者中。

7.分頁式儲存管理有內部碎片,分段式儲存管理有外部碎片,固定分割槽儲存管理方式有內部碎片,分頁式儲存管理方式有內部碎片。

8.頁式儲存管理中,頁表的始地址存放在暫存器中(頁表基址暫存器(PTBR)),這樣才能滿足在地址變換時,能夠較快地完成邏輯地址和實體地址之間的轉換。

9.對重定位儲存管理方式,應在這個系統中設定一個重定位暫存器。因為系統處理器在通一個時刻只能執行一條指令或訪問資料,所以為每道程式(資料)設定一個暫存器是沒有必要的,而只需要在切換程式執行時重置暫存器內容即可。

10.採用可重用程式是通過減少對換數的方法來改善系統性能的。可重入程式通過共享來使用同一塊儲存空間,或者通過動態連結的方式將所需程式對映道相關程序中,其最大的優點是減少了對程式的調入/調出,因此減少了對換數量。

11.實現分頁,分段式儲存需要特定的資料結構,例如,頁表,段表等,為了提高效能還需要提供快存和地址加法器,代價高。分割槽儲存管理滿足多道程式設計的最簡單儲存管理方案,特別適合嵌入式等微型設別。

12.引入覆蓋和交換技術是時間換空間。

13.頁式儲存頁面大小是等長的。

14.引入段式儲存管理方式,主要是為了滿足使用者下列要求:方便程式設計,分段共享,分段保護,動態連結和動態增長

15.主存分配以塊為單位,訪問以位元組為單位。

16.儲存管理目的:1方便使用者2提高記憶體利用率

17.分頁是一維,分段是二維,因為分頁定長。

18.在多個程序併發執行時,所有程序的頁表大多數駐留在記憶體中,在系統中設定一個頁表暫存器(PTR),在其中存放頁表在記憶體的起始地址和頁表長度,平時,程序未執行時,頁表的起始地址和頁表長度存放在本程序的PCB中,當排程到程序時,才將兩個資料轉入頁表暫存器,每個程序都有一個單獨的邏輯地址,有一張屬於自己的頁表。

19.段頁式儲存管理兼有頁式管理和段式管理的優點,採用分段方法來分配和管理使用者地址空間,用分頁方法來管理物理儲存空間,但它的開銷比分段式和頁式管理的開銷都要大。

問答

1.為什麼要進行記憶體管理?

單道處理機系統階段,一個系統一個時間只執行一個程式,記憶體分配簡單。多道程式引入後,程序之間除了共享的不僅僅是處理機,還有主儲存器。共享記憶體比較複雜,此時不對記憶體進行管理,容易導致資料混亂,以至於限制程序併發執行。

2.頁式管理中每個頁表項的大小下限如何確定?

首先用總的位數m-頁內位數n,得到頁號的位數x,然後取log2x,然後對結果向上取正,因為頁表項以位元組為單位。(也可以選擇更大的頁表項大小以至於讓一個頁面能夠正好容下整數個頁表項以方便儲存(例如取成4B,那麼一頁正好可以裝下1K個頁表項)或者增加點其他什麼資訊)

3.多級頁表解決了什麼問題?又會帶來什麼問題?

多級頁表解決了當邏輯地址空間過大時,頁表長度會大大增加的問題。而採用多級頁表時一次訪盤需要多次訪問記憶體升至磁碟,會大大增加一次方寸的時間。

題目

1.(2011考研)在虛擬記憶體管理中,地址變換機構將邏輯地址變換為實體地址,形成該邏輯地址的階段是(C)

A.編輯 B.編譯 C.連結 D.裝載

編譯後的程式需要經過連結才能裝載,而連結後形成的目標程式中的地址是邏輯地址。以,C語言為例:C語言經過預處理(cpp)-->編譯(ccl)-->彙編(as)-->連結(ld)產生了可執行檔案。其連結的前一步,產生了可重定位的二進位制的目標檔案。C語言採用原始檔獨立編譯的方法,如程式main.c,file.c,file1.h,file2.h,在連結的前一步生成了main.o,file1.o,file2.o,這些目標模組採用的邏輯地址都從0開始,但只是相對該模組的邏輯地址。但只是相對於該模組的邏輯地址,連結器將這三個檔案,libc和其他庫檔案連結成一個可執行檔案,連結階段主要完成重定位,形成整個程式的完整邏輯地址空間。(完成該變換過程的是裝載階段)

2.(2010考研)

某計算機採用二級頁表的分頁儲存管理方式,按位元組編址,頁大小為2^10位元組,頁表項大小為2位元組,邏輯地址結構為

頁目錄號|頁號|頁內偏移量

邏輯地址空間大小為2^16,則表示整個邏輯地址空間的目錄表中包含表項的個數至少是(128)