1.23k likes | 1.38k Views
Windows 記憶體管理. 第 5 組. 記憶體管理概述 分頁式記憶體 管理 徐勝斌. 4.1 記憶體管理概述. 在 Intel x86 系統架構中,記憶體位址有三種類型: 實體位址 即記憶體儲存器的索引,當 CPU 操縱記憶體晶片時,它透過位址線腳位價上電子信號來讀取或寫入相關的記憶體單元。 虛擬位址 ( 又稱線性位址 ) 在邏輯位址轉換為實體位址的過程中,會先產生對應的虛擬位址。之後遵循分頁的機制,再由虛擬位址產生實體位址。 邏輯位址 由 CPU 所產生的位址,稱為邏輯位址 (logical address) 。
E N D
Windows 記憶體管理 第5組
記憶體管理概述 • 分頁式記憶體管理 • 徐勝斌
4.1 記憶體管理概述 • 在Intel x86 系統架構中,記憶體位址有三種類型: • 實體位址 • 即記憶體儲存器的索引,當CPU操縱記憶體晶片時,它透過位址線腳位價上電子信號來讀取或寫入相關的記憶體單元。 • 虛擬位址(又稱線性位址) • 在邏輯位址轉換為實體位址的過程中,會先產生對應的虛擬位址。之後遵循分頁的機制,再由虛擬位址產生實體位址。 • 邏輯位址 • 由CPU所產生的位址,稱為邏輯位址(logical address)。 • 要執行時,程式的這些部分在經過一些必要的處理之後,會變成對記憶體有意義的位址值。 + Logical Address Physical Address CPU 1004 Base Register 0004 1000 Memory
4.1 記憶體管理概述 • 把一個位址告訴CPU,讓它存取相對應的實體記憶體單元,這一過程是OS和CPU相互合作來完成的。 • CPU最終需要的是一個實體位址,所以他必須把軟體指令中的位址轉譯成實體位址 • 從OS的角度來看,需要有效的管理實體記憶體,使Process需要記憶體時,可以分配足夠的記憶體給這個Process • 每個Process有邏輯上獨立的位址空間,不同Process的位址空間應該是相互隔離的 • 在一個Process 1使用位址A來存取一個記憶體單元,與另外一個Process 2中用位址A存取的記憶體單元是不同的實體記憶體,這樣只可以避免有意或無意的侵入到另外一個Process的位址空間中。
4.1 記憶體管理概述 • 虛擬記憶體(Virtual Memory) • 當系統中Process數量增加時,所需的記憶體數量往往超過了總實體記憶體 • 一般的做法是把不緊急的Process中的資料或程式碼先存放到外部記憶體,而把它們佔用的實體記憶體騰出來給緊急Process使用 • 好處: • 允許Program Size大於Physical Memory Size仍能執行 • 程式撰寫者專心負責寫好程式,無須考量Program Size太大之問題 • Memory utilization 提升 Disk Memory SWAP out SWAP in
4.1.1 分頁式記憶體管理 • 在分頁式記憶體管理中,虛擬位址空間是按頁(page)來管理的,對應於實體記憶體也是按照頁(page)來管理,實體記憶體中的頁面有時後稱為分頁框架(page frame) • 在虛擬位址空間中連續的頁面對應於實體記憶體中的頁面可以不必是連續的 • 實體頁面可以被動態地分配給特定的虛擬頁面 虛擬位址 空間 實體位址 空間 虛擬頁面與實體頁面之間的對應
4.1.1 分頁式記憶體管理 • 動態變動分區之Memory Management • 在Multi programming 之下,系統(Memory)內存在有多個Process執行,而且各個Process之大小並不相同,進入系統及完成工作的時間也不盡相同 • 若採”Contiguous Allocation”,即系統要分配給Process夠大的連續可用空間,Process才能載入執行 • “Extended Fragmentation” Problem :沒有足夠大的連續性空間可以配置給Process使用 • “Internal Fragmentation” Problem :配置給Process的Memory空間大於Process實際所需空間 Memory Process 1 實 際 Process 所 佔 空 間 Process 150 K OS配置的 Memory Space Process 5 Allocated 300 K Free Process 6 內部碎裂(Internal Fragmentation)
4.1.1 分頁式記憶體管理 • 有了頁面(page)劃分機制後,每個虛擬位址32位元資訊中分成兩部分:頁索引+頁內偏移 • 根據頁索引去查Page Table,取得該Page之對應載入頁框之起始為址+頁偏移量即得Physical Address. 虛擬位址 Page offset Page # 會有Internal Fragmentation問題, 因為user program size不見得是 Page size的整數倍 eq: page size = 4KB process size = 21 KB =>須配 6 個 Frame =>內部碎裂:24– 21 = 3 KB Memory Page table f0 + 0 f1 f2 1 f2 f4 2 f5 f3 f4 f5
4.1.1 分頁式記憶體管理 • Intel x86採用分級分頁表的方式來管理 • 32位元的虛擬位址頁索引被分為頁目錄索引(10位元)和分頁表索引(10位元) • 分頁目錄項目(PDE, Page Directory Entry) :210 = 1024項的分頁表 • 分頁表項目(PTE, Page Table Entry) :210 = 1024項的頁面 31 22 21 0 12 11 分頁目錄索引 分頁表索引 頁內偏移 分頁表(PTE) 分頁目錄(PDE) 二級分頁表結構好處是,當虛擬位址空間中實際使用的記憶體比例較小時,很多分頁表不必在記憶體中建構出來 要付出效能的代價,在解析一個虛擬位址時,需要兩次查表動作 頁面
4.1.1 分頁式記憶體管理 • 位址轉譯快查緩衝區(TLB, Translation Look-aside Buffer) • 為了避免在分級分頁表解析過程中多次查表導致效能下降問題 • 包含最近使用過的頁面的記憶體對應資訊 • 在Intel x86 處理器中,TLB是完全由硬體來維護的 到TLB查詢有無對應的Page Number存在 若Hit,則輸出Frame起始位址 若Miss,則到Memory中取出Page Table查詢,已取得Frame起始位址
4.1.1 分頁式記憶體管理 • 實體位址擴充(PAE, Physical Address Extension) • 支援36位元實體位址,即64GB實體記憶體 • 但虛擬位址仍然是32位元 • 分頁目錄和分頁表中的每一項為64位元,可以描述更長的實體位址
區段式記憶體管理 985402024 黃郁誠
4.1.2 區段式記憶體管理 除了用虛擬位址來實作有效和靈活的記憶體管理以外 另一種記憶體管理方式是將實體記憶體劃分成若干個區段 (segment). 計算實體記憶體位址方式: “ 區段基址 + 偏移” 每個區段可以有它自己的存取屬性, 包括讀寫屬性、特權等級等。 例如,Intel x86的處理器中,有專門的區段暫存器,允許每行指令在存取記憶體時,指定在哪個區段上進行。
4.1.2 區段式記憶體管理 區段概念在Intel 8086/8088 真實模式中已經使用了,但當時區段的用途是擴充位址範圍,將系統的記憶體從64K擴充到1MB。 Intel 8086/8088都是16位元的,但位址線有20條。為了存取整個位址範圍,處理器的作法,將區段暫存器中的值左移4位元再加上一個16位元址值。 最大的位址值: (64K-1)*16+(64K-1)=1,114,095B Intel 80286 (24位元位址),在保護模式下:區段變成一個索引:指向段描述項表中的某一個段描述項,而段描述項才真正指定了區段的基底位址、區段長度以及一些保護屬性。 Intel 80386以後,處理器中的暫存器才真正轉移到32位元
4.1.2 區段式記憶體管理 Intel x86中,邏輯位址的區段部分稱為區段選擇符(segment selector),指定了區段的索引以及要存取的特權等級。 區段暫存器cs、ss、ds、es、 fs 和gs專門用於指定一個位址的區段選擇符,其中有三個區段暫存器有特殊的用途。 cs :程式暫存器,指向一個包括指令的區段。 ss :堆疊段暫存器,指向一個包含目前呼叫推疊的區段。 ds :資料區段暫存器,指向一個包含全域和靜態資料的區段。
4.1.2 區段式記憶體管理 雖然定指暫存器和資料暫存器都是32位元,但是區段選擇只有16位元,如下圖所示: 153210 一個段描述項表只包含213=8192的區段 GDTor LDT 請求者的目前特權等級(0~3) GDT : 全域段描述項表 LDT : 區域區段描述項表 區段選擇符格式
4.1.2 區段式記憶體管理 段描述項表格式: S: 0 表示系統區段 1 表示普通區段 區段內最大偏移(16-19) 未使用(作業系統可使用) DPL:描述項套全等級 區段偏移位址32位元(1)或1位元(0) 粒度標誌,最大偏移欄位位元組(0) 頁面(1)單位
4.1.2 區段式記憶體管理 G :當G = 0,指長度單位為位元組 G = 1 時,長度單位為4096位元組 區段長度可以達到220*4096=4GB=整個32位元線性位址 空間。 DPL :允許存取此區段的最低特權等級, 例如,DPL 為0的區段只能當CPL=0時才可以存取。 DPL 為3個區段可由任何CPL的程式碼存取。 類型:指定了區段的類型,包括程式段、資料段、TSS區段 和LDT區段。
4.1.2 區段式記憶體管理 GDT 和 LDT GDT︰系統全域範圍內有效的一張表,包含最多8192的段描述項,所以一張表需要8192*8=64KB記憶體空間
4.1.2 區段式記憶體管理 Intel x86 “區段+偏移” 形式的邏輯位址的解析過程 GDT gdtr 區段基底位址 0 1 LDT ldtr 區段基底位址
4.1.2 區段式記憶體管理 系統全域共同的空間可以透過GDT來安排案存取。此外,每個行程私有的資料和程式碼存放在LDT中,因而行程切換時,只需改變LDT表,就實作了行程私有位址的切換。 區段式記憶體管理和分頁式記憶體管理並不是對立的,它們可以組合起來在同一個系統使用。 “ 區段基址 + 偏移” 虛擬位址 實體位址 區段式記憶體管理單元 分頁式記憶體管理單元 Intel x86邏輯位址個完整解析過程
4.1.3 記憶體管理演算法介紹 記憶體管理演算法分為兩類: 點陣圖標記法:假設整個待分配記憶體的大小為N位元組,管理記憶體的粒度為M位元組,並且N=M*K,也就是說,記憶體管理的基本單元為M位元組,現在共有K個單元需要動態管理。 為了記錄這K個記憶體管理單元的使用情況,點陣圖標記法是用一個共有K個位元的點陣圖,其中每一位元的值(0或1)說明了這一位元所對應的記憶體單元是否空閒。 由於點陣圖精確地記錄了每一個記憶體單元的空閒或已被使用的情況,所以,當記憶體管理員接收到一個新的記憶體申請時,他只需掃描點陣圖,就能確定是否有合適的空閒記憶體可以滿足請求。
4.1.3 記憶體管理演算法介紹 點陣圖標技法的實作需要額外的記憶體負擔,通常為 所以,只需適當地選取M,就可以控制這部分額外的負擔。 使用者請求記憶體大小不一定是M位元組的倍數,因而在分配記憶體時,平均為M/2位元組的浪費。 記憶體管理員在分配記憶體時需要掃描連續個0位元,此操作並不高效率(複雜度O(K))
4.1.3 記憶體管理演算法介紹 空閒串列法:使用串列來描述已分配的空閒塊。 初始時,整個區塊被當作一個大的空閒區塊加入到空閒串列中。 當記憶體管理元接收到一個記憶體分配請求時,從空閒串列中找到一個合適的、能提供足夠記憶體的空閒區塊,並且從該空閒區塊中分離出足夠多的記憶體,交給客戶,剩下的記憶體仍然是一個空閒區塊,而且分配的記憶體加入到已分配記憶體串列中。
4.1.3 記憶體管理演算法介紹 當記憶體管理元接收到一個記憶體分配請求時,會使用不同的測略來搜尋適當的空閒區塊: 1.先適法(first-fit): 從空閒串列中找到第一個滿足客戶請求的空閒區塊。 2.佳適法(best-fit): 從空閒串列中找到最接近於客戶請求大小的空閒區塊。 3.差適法(worst-fit): 從空閒串列中找到最大的空閒區塊。 4. 次適法(next-fit): 從空閒串列的目前位置往後掃描,找到第一個滿足客戶 請求的空閒區塊。
頁面替換演算法Page Replacement Algorithms 985402001 索維廷
按需分頁(demand paging) • 行程所需資料最初所有頁面都在磁碟上 • 隨著控制流不斷前進,行程獲得越來越多實體記憶體頁面,趨向平滑 • 記憶體頁面的請求和滿足透過中斷或例外的方式來完成
按需分頁(demand paging) 程式A的工作集 程式B的工作集
工作集理論模型 t代表時間點 δ代表一段時間間隔 w(t, δ)代表行程的工作集
頁面替換演算法 • 實體記憶體吃緊 • 行程使用的頁面總數超過系統中頁面的數量 • 需要一個有效率的實體記憶體管理替換頁面的演算法
頁面替換演算法 • 最佳頁面替換演算法 (The Optimal Page Replacement Algorithm) • 最近未使用頁面替換演算法 (The Not Recently Used Page Algorithm) • 先進先出頁面替換演算法 (The First-In First-out Page Replacement Algorithm) • 第二次機會頁面替換演算法 (The Second Chance Page Replacement Algorithm) • 最近最不常使用頁面替換演算法 (The Least Recently Used Page Replacement Algorithm) • 最不常用頁面替換演算法 (The Not Frequently Used Page Replacement Algorithm)
最佳頁面替換演算法 (The Optimal Page Replacement Algorithm) • 分頁錯誤比率最低 • 替換未來最不可能被使用到的分頁 • 保證在頁框的數目固定之下,會得到最少的分頁錯誤次數 • 實際上無法實作,因為對於未來將要使用的分頁不可能完全預測成功 • 可提供分頁替換演算法的比較基準
最佳頁面替換演算法 (The Optimal Page Replacement Algorithm)
最近未使用頁面替換演算法 (The Not Recently Used Page Algorithm) • 存取位元R • 修改位元M • 此 2 位元(R, M)有下列 4 種組合,依據順序進行替換 • (0, 0):表示最近沒有被行程使用,也沒有被行程修改,是最佳的替換分頁 • (0, 1):表示最近沒有被行程使用,但是已經被修改過,此分頁須先寫回磁碟後,才可進行替換 • (1, 0):表示最近曾被行程使用,但是沒被修改過,由於可能再次被使用,故盡量不要替換此分頁 • (1, 1):表示最近曾被行程使用,也被修改過,所以需寫回磁碟中,是最差的替換分頁選擇
先進先出頁面替換演算法 (The First-In First-out Page Replacement Algorithm) • 每次有新的分頁需置入時,會選擇置入記憶體時間最久的分頁換出 • 兩種實作的方法: • 記錄每個分頁被置入到頁框的時間,當每次需要換出分頁時,會找置入時間最早的一頁 • 利用 FIFO 佇列來實作,當要進行分頁替換時,就把佇列最前端的分頁換出,再把要置入的分頁放到佇列的末端 • Belady反常:配置的頁框數目增加,分頁錯誤次數有可能會增加
先進先出頁面替換演算法 (The First-In First-out Page Replacement Algorithm)
第二次機會頁面替換演算法 (The Second Chance Page Replacement Algorithm) • 移位暫存器的大小設定為 0 個位元 • 記憶體中每個頁框均對應到一個參考位元,其初始值為 0;當某分頁被行程使用時,該參考位元會被設定為 1 • 進行分頁替換時,以先進先出的方式找尋被替換分頁;若找到的頁框參考位元為 0,則進行替換;若參考位元為 1,則將此分頁的參考位元設定為 0,給予此分頁第二次機會,不馬上將它替換;並把此分頁的時間標記設為目前的時間 • 繼續用先進先出的方式找尋被替換分頁,直到所有其它的分頁都被替換掉,或是都被給予第二次機會之後,該分頁才會被替換掉 • 利用鏈結串列較無效率,可換用環狀佇列方式
最常參考的頁 最先載入的頁 0 3 7 8 12 14 15 18 A B C D E F G H (a) 3 7 8 12 14 15 18 20 B C D E F G H A (b) 視A如新載入的分頁 參考位元 0 參考位元 1 第二次機會頁面替換演算法 (The Second Chance Page Replacement Algorithm)
A L B C K J D I E 參考位元 0 F H G 參考位元 1 第二次機會頁面替換演算法 (The Second Chance Page Replacement Algorithm)(The Clock Page Replacement Algorithm)
最近最不常使用頁面替換演算法 (The Least Recently Used Page Replacement Algorithm) • 優先考慮最近不常用的頁面 • 以存取頻率來決策替換的頁面 • 維護一個頁面串列,每次存取必須要把存取頁面移到串列之首,表示剛剛存取過,維護成本過高,難以硬體實作。
最不常用頁面替換演算法 (The Not Frequently Used Page Replacement Algorithm) • 與LRU一致,此為軟體實作。 • 每個頁面維護一個計數器,初始為0,每次時鐘中斷,系統會將存取位元(0 or 1)加到計數器上。 • 計數器有增無減,時間越長會影響到頁面替換演算法決策。 • 頁面老化演算法改進計數器有增無減的狀況,時鐘中斷修改計數器時,先將計數器右移一位元,把存取位元放入最左邊的位元上。
Windows記憶體管理概述 • 兩種特權等級 -核心模式(0) 、使用者模式(3) • 核心模式使用系統位置空間 -0x80000000-0xffffffff -存取自身行程資料也可以存取系統位置空間 • 使用者模式使用行程位置空間 -0x00000000-0x7fffffff -只能存取行程自身的資料
Windows記憶體管理概述 • 應用程式使用記憶體必須先申請根據申請和釋放操作來維護整個虛擬位址空間的記憶體分配情況。 • Windows採用Demand Paging,當一段虛擬記憶體被使用才為它分配分頁表和實體頁面。 • 每個行程虛擬位址空間的分配透過虛擬位址描述項(Virtual Address Descriptor)記錄下來,構成一棵平衡二元樹
分頁表 作業系統 6.重新執行指令 2.中斷 i 3.找尋產生分頁 錯誤的頁 jump func1 move ax,bx … 1.參考分頁表 func1: 5.設定分頁表 可用頁框 磁碟 4.載入產生分頁錯誤的頁 主記憶體 Page Fault處理步驟
Windows記憶體管理概述 • Page Frame Number Database描述實體記憶體每個頁面的狀態。 • Page Directory Entry和Page Table Entry(分頁目錄和分頁表)正確轉譯虛擬位址。4.3.1 • 位址空間建立後,未獲得實體頁面的虛擬位址時會觸發page fault例外來分配頁面、設置分頁表和頁面間的邏輯關係。 • 頁面替換由working set manager完成,它執行在一個balance set manger的系統緒程中。工作集縮減的過程稱為修剪(trim)
Windows記憶體管理重要元件 • 執行體層 -分配、釋放和管理虛擬位置。 • 分頁錯誤例外處理常式(分頁錯誤常式) -分配實體頁面、磁碟資料讀入頁面。 • 一組系統緒程 -平衡集管理員、行程/堆疊交換器、修改頁面寫出器、零 頁面緒程
4.2 Windows 記憶體管理 995202048 周定緯
系統位址空間 • 在 Intelx86處理器的Windows系統中 ,0x80000000 -0xf f ffffff是所有行程共用的位址空間. • i.e. , 2GB - 4GB是系統位址空間 • 在這段位址空間中 , 其配置結構是在核心初始化階段完成的
系統位址空間初始化 • 在核心獲得控制之前 ,Windows 載入程式 (ntldr) 已經打開了 Intel x86 處理器的分頁機制 , 並預先建立了足夠的分頁表以便 16MB 以下的低位址可以透過分頁表來存取其實體記憶體.
ntldr • Windows 載入程式 (NTloader) • 程式碼由兩部分組成 • 真實模式 ( 16位元模式 ) • 保護模式 (32位元模式 )