0x13 內存管理(二)

四、頁表結構

例子

一個具有32位邏輯地址空間的系統,頁大小4KB(也就是212),那麼一個頁表最多可包含1M個表項(232/212=220)。
假設每個頁表項4個字節,每個進程需4MB空間放頁表,也就是1024個連續頁面來存儲頁表本身。
顯然需要這麼多個連續頁面來存放頁表不一定能實現。

解決方法

  • 層次頁表
    將頁表劃分爲更小的部分,如兩級頁表就是將頁表再分頁。
  • 哈希頁表
  • 反向頁表

例子:4KB頁大小的32位系統
一個邏輯地址被分爲:
20位的頁號,12位的頁偏移
頁表所在頁被分頁,頁號被分爲:
10位的頁號,10位的頁偏移
因此,邏輯地址表如下:
在這裏插入圖片描述
在這裏插入圖片描述
對於64位的邏輯地址空間的系統,兩級頁表的方案就不再適合了。

三級分頁機制

設系統頁大小爲4KB(212),頁表可由252個表項組成。
使用兩級分頁方案。內部頁表p2用10位表示,即210個項。可用一頁表示,外部頁表有242項。
在這裏插入圖片描述

四級分頁方案

Intel x86-64
僅用48位,頁大小:4KB,2MB,1GB
在這裏插入圖片描述

哈希頁表

通常地址空間 > 32位,虛擬頁號被散列到一個頁表中。這種頁表的每一個條目都包括了一個鏈表元素,這些元素哈希成同一位置。
虛擬頁號與鏈表中的每個元素相比較,找到匹配項。如果匹配,則相應的物理幀被取出。
每一個進程都有一個頁表,該進程所用的每一頁在頁表中都有一項。

缺點:每個頁表可能由多個表項,這些表可能佔用大量的物理內存。

反向頁表

爲了解決這個問題,可以使用反向頁表
對於每個真正的內存頁或幀纔有一個條目。每個條目保存在真正內存位置的頁的虛擬地址,以及包括擁有這個頁的進程的信息。

反向頁表的地址空間中需要一個標識符以確保一個特定進程的一個邏輯頁可以映射到相應的物理幀。

反向頁表機制:

IBM RT系統
三元組:<進程id,頁號,頁偏移>
反向頁表的條目:<進程id,頁號>(其中進程id作爲地址空間標識符)
由<進程id,頁號>組成的虛擬地址送交到內存子系統,通過查找反向頁表來尋找匹配項。
如果匹配找到,取出這個條目的表項號i,即爲內存幀號,與頁偏移結合得到物理地址。

由於反向頁表按物理地址排序,而查找是很據虛擬地址,因此需要查找整張表來尋求匹配。雖然減少了需要儲存每個頁表的內存,但是當訪問一個頁時,增加了尋找頁表需要的時間。
可以使用哈希表來將查找限制在一個或少數幾個頁表條目。

實現共享內存困難,共享內存通常通過多個虛擬地址映射爲一個物理地址來實現。每個物理頁只有一個虛擬頁條目,所以一個物理頁不可能有兩個或更多的共享虛擬地址。

五、分段內存管理

分頁內存管理的問題:用戶視角的內存和實際物理內存的分離。
用戶通常願意將內存看成是一組不同長度的段的集合,段是邏輯上有意義的單位,而且段與段之間沒有一定的順序。

分段

支持用戶觀點的內存管理機制。
邏輯地址空間是由一組段組成的,每個段都有名稱和長度。地址指明瞭段名稱和段內偏移
所以邏輯地址由一個有序對組成:<段號,偏移>,這稱爲二維地址。
一個程序是一些段的集合,一個段是一個邏輯單位,如:
main program,procedure,function,local variables,global variables,common block,stack,symbol table,arrays

分段的邏輯視圖

在編譯用戶程序時。編譯器會自動根據輸入程序來構造段。
如一個C語言編譯器可能會創建如下段:代碼、全局變量、維、錢、標準的庫函數等。

分段機制(1)

一個邏輯地址是兩個向量的集合:
<segment-number,offset>;

段表-映射二維用戶地址,每個表項包括:

  • 基址 - 包含內存中段物理地址的起始地址;
  • 限長 - 指定段的長度;

段表基址寄存器(STBR)指向段表在內存中的地址;
段表限長寄存器(STLR)表明被一個程序所使用的段的數目;
如果段號s<STLR,段號s是合法的。

分段機制(2)

由於段的長度各不相同,內存分配是一個動態存儲-分配問題,可採用可變分區方案來實現;

內存分配

  • 首先/最佳適應法
  • 外碎片問題

重定位

  • 動態
  • 由段表來執行

段共享

  • 段是邏輯上有意義的單位
  • 實現更方便
  • 比頁共享更容易實現

分段機制(3)

保護,每個段表的表項有:

  • 有效位=0>非法段
  • 讀/寫/執行權利

保護位同段相聯繫,在段的級別進行代碼共享。

段頁式原理

分段和分頁原理的結合;

先將用戶程序分成若干個段,再把每個段分成若干個頁,併爲每個段賦予一個段號;

邏輯地址:<段號,頁號,頁內偏移>;
段號頁號頁內偏移
存在內碎片,無外碎片。

例子
當前程序被分爲3段,每段又被劃分爲4K大小的頁,主程序段被劃分爲4頁,子程序段被劃分爲2頁,數據段被分爲3頁。邏輯地址組成如圖(b)所示。
在這裏插入圖片描述
Intel32位CPU簡稱IA32,64位的簡稱IA64,支持分段和段頁式內存管理。

段頁式方法簡單來說,就是CPU產生的邏輯地址首先送入分段單元,生成線性地址,然後將線性地址交給分頁單元,生成內存中的物理地址。分段單元和分頁單元相當於內存管理單元MMU。

Intel386使用段頁結合來進行二級分頁的內存管理。

習題:
1.在段式存儲管理中,一個段是一個( )區域。

A.定長的連續
B.不定長的連續
C.定長的不連續
D.不定長的不連續

B

2.段頁式內存管理中,物理內存本質上是()的。

A.分段
B.分頁
C.段頁
D.這三個都不是

B

3.分段管理的突出的優點有()。

A.可以實現有意義的共享
B.用戶可以使用覆蓋技術
C.方便地址轉換
D.程序不需要連續的內存

A、C、D

4.段式和頁式存儲管理的地址結構很類似,但是他們之間有實質上的不同,表現爲( )。

A.頁式的邏輯地址是連續的,段式的邏輯地址可以不連續
B.頁式的地址是一維的,段式的地址是二維的
C.分頁是操作系統進行,分段是用戶確定
D.各頁可以分散存放在主存,每段必須佔用連續的主存空間

A、B、C、D

六、內存“擴充”技術

內存空間不足怎麼辦?

進程的虛擬地址空間大於系統能夠提供的物理內存空間,前面提到的內存管理方案,連續內存分配、分頁、分段管理都不能滿足該要求,而直接拒絕該進程的運行。

內存“擴充”技術

所謂的內存“擴充”,並不是指增加系統的物理內存,而是指在現有的物理內存基礎上,如何擴大內存的使用效率。
常用的內存擴充技術包括:緊縮、覆蓋、交換和虛擬內存。

有一種情況:
儘管空閒內存的總量可以滿足進程的需求,但這些內存碎片是不連續的,分散在不同的區域,這種情況可以採用我們前面可變分區管理中介紹過的緊縮技術,這實際上也是一種內存擴充技術。

覆蓋技術

當程序大小超過物理內存總和時,所採用的內存擴充技術。
具體實現時,是指在程序執行過程中,程序的不同部分相互替換。
程序執行時:只在內存中保留那些在低何時間都需要的指令和數據。
由程序員聲明覆蓋結構,不需要操作系統的特別支持。

技術的優點
不需要操作系統的特別支持。
技術的缺點
覆蓋結構的程序設計很複雜。

應用於早期的操作系統。

交換技術

在多道程序環境下

  • 在內存中的某些進程由於某事件尚未發生而被阻塞運行,但它卻佔用了大量的內存空間,甚至有時可能出現在內存中所有進程都被阻塞而迫使CPU停止下來等待的情況。
  • 另一方面,又有着許多作業在外存上等待,因無內存而不能進入內存運行的情況

存在問題

  • 浪費資源
  • 降低系統吞吐量

交換
把內存中暫時不能運行的進程或者暫時不用的程序和數據,調出到外存上的備份區,以便騰出足夠的內存空間,再把已具備運行條件的進程或進程所需的程序或數據,調入內存。

備份區——是一個固定的足夠大的可以容納所有用戶內存映像拷貝的快速磁盤;必須提供對這些內存映像的直接訪問

滾入,滾出——交換由於基於優先級的算法而不同,低優先級的進程被換出,這樣高優先級的進程可以被裝入和執行;

交換時間的主要部分是轉移時間,總的轉移時間直接同交換的內存的數量成正比;

交換較爲耗時(100MB大約4s);

標準交換技術在現代操作系統中一般很少使用

常用策略:當空閒內存不夠時採用交換

1.進程的哪些內容要交換到磁盤?

主要交換的內容應該是進程運行時創建或修改的內容,也就是棧或堆的內容,至於代碼部分,由於不需要修改且在外存上有備份,由此不需要被交換出去保存,直接丟棄即可。

2.在磁盤的什麼位置保存被換出的進程?

交換區(備份區):系統指定一塊特殊的磁盤區域作爲交換空間(swap space),包含連續的磁道,操作系統可以使用底層的磁盤讀寫操作對其高效訪問。
不同的操作系統對交換區的叫法不一樣,如Windows系統稱爲頁文件pagefile。

3.何時需要發生交換?

一種是進程只要不用或者很少再用的就換出;
第二種使用更多的策略則是內存空間不夠或有不夠的危險時啓動交換程序換出。lniux系統就是採用這種策略。

4.如何選擇被換出的選程?

根據進程的各種屬性
如,緊縮技術,有些選程在內存裏是不能隨意搬家的。
處於等待VO狀態的選程也不能殖意被交換出去。

5.如何處理進程空間增長?
一般採用預留空間的方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章