Windows操作系統(tǒng)-存儲管理(中)_第1頁
Windows操作系統(tǒng)-存儲管理(中)_第2頁
Windows操作系統(tǒng)-存儲管理(中)_第3頁
Windows操作系統(tǒng)-存儲管理(中)_第4頁
Windows操作系統(tǒng)-存儲管理(中)_第5頁
已閱讀5頁,還剩70頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第四章存儲管理(中)存儲管理概述內(nèi)存管理的基本原理Windows的內(nèi)存管理外存管理的基本原理Windows的外存管理高速緩存管理的基本原理Windows的高速緩存管理

Windows的內(nèi)存管理內(nèi)存管理器的組成部分地址空間布局地址轉(zhuǎn)換機(jī)制缺頁處理內(nèi)存分配方式工作集物理內(nèi)存管理內(nèi)存管理器的組成部分一組執(zhí)行體系統(tǒng)服務(wù)程序,用于虛擬內(nèi)存的分配、回收和管理。大多數(shù)這些服務(wù)都是通過Win32API或內(nèi)核態(tài)的設(shè)備驅(qū)動程序接口形式出現(xiàn)。一個頁面錯誤陷阱處理程序用于解決硬件檢測到的內(nèi)存管理異常,并代表進(jìn)程將虛擬頁面裝入內(nèi)存。運(yùn)行在六個不同的核心態(tài)系統(tǒng)線程上下文中的幾個關(guān)鍵組件工作集管理器(MmWorkingSetManager)

:當(dāng)空閑內(nèi)存低于某一界限時,便啟動所有的內(nèi)存管理策略,如:工作集的修整、老化和已修改頁面的寫入等。進(jìn)程/堆棧交換器(KeSwapProcessOrStack)

:完成進(jìn)程和內(nèi)核線程堆棧的換入和換出操作。已修改頁面寫入器(MiModifiedPageWriter):將修改鏈表上的“臟”頁寫回到適當(dāng)?shù)捻撐募?。?nèi)存管理器的組成部分六個關(guān)鍵組件:映射頁面寫入器(MiMappedPageWriter):將映射文件中臟頁寫回磁盤。廢棄段線程(MiDereferenceSegmentThread):負(fù)責(zé)系統(tǒng)高速緩存和頁面文件的擴(kuò)大和縮小。零頁線程(MmZeroPageThread):將空閑鏈表中的頁面清零。內(nèi)存管理器的組成部分六個關(guān)鍵組件:地址空間布局應(yīng)用程序代碼全程變量每個線程堆棧DLL代碼3GB用戶空間1GB系統(tǒng)空間

7FFFFFFF80000000內(nèi)核和執(zhí)行體HAL

引導(dǎo)驅(qū)動程序

C0000000進(jìn)程頁表BFFFFFFF

超空間

C0800000系統(tǒng)高速緩存

分頁緩沖池未分頁緩沖池

FFFFFFFFFFFFFFFF0000000000000000在boot.ini中加入/3GB標(biāo)志地址空間布局系統(tǒng)代碼包括操作系統(tǒng)映像、HAL和用于引導(dǎo)系統(tǒng)的設(shè)備驅(qū)動程序。系統(tǒng)映射視圖用來映射Win32子系統(tǒng)可加載的核心態(tài)部分Win32k.sys,以及它使用的核心態(tài)圖形驅(qū)動程序。會話空間用來映射一個用戶的會話信息。進(jìn)程頁表和頁目錄描述虛擬地址映射的結(jié)構(gòu)。超空間一個特殊的區(qū)域用來映射進(jìn)程工作集鏈表,并為創(chuàng)建臨時映射物理頁面。系統(tǒng)地址空間布局地址空間布局系統(tǒng)工作集鏈表描述系統(tǒng)工作集的工作集鏈表數(shù)據(jù)結(jié)構(gòu)。系統(tǒng)高速緩存

用來映射在系統(tǒng)高速緩存中打開的文件的虛擬空間。分頁緩沖池可分頁系統(tǒng)內(nèi)存堆。系統(tǒng)PTE

系統(tǒng)PTE緩沖池,用來映射系統(tǒng)頁面。非分頁緩沖池不可分頁的系統(tǒng)內(nèi)存堆。系統(tǒng)地址空間布局地址空間布局MmSystemRangeStart系統(tǒng)空間的起始地址MmSystemCacheStartMmSystemCacheEnd系統(tǒng)高速緩存的起始、終止地址MiSystemCacheStartExtraMiSystemCacheEndExtra系統(tǒng)高速緩存擴(kuò)展(或系統(tǒng)PTE擴(kuò)展)的起始、終止地址MmPagedPoolStartMmPagedPoolEnd分頁緩沖池的起始、終止地址系統(tǒng)地址空間布局地址空間布局MmNonPagedSystemStart系統(tǒng)PTE的起始地址MmNonPagedPoolStartMmNonPagedPoolEnd非分頁緩沖池的起始、終止地址MmNonPagedPoolExpansionStart非分頁緩沖池擴(kuò)展的起始地址MmSystemCacheWorkingSetList系統(tǒng)工作集列表系統(tǒng)地址空間布局地址空間布局

每個進(jìn)程有自己的用戶地址空間(低2G),在用戶地址空間中有,進(jìn)程的環(huán)境變量、進(jìn)程的參數(shù)、進(jìn)程的堆(Heap)、進(jìn)程載入的模組、進(jìn)程PEB、線程的棧(Stack)、線程TEB用戶地址空間布局MmUserProbeAddress最高用戶空間地址地址轉(zhuǎn)換機(jī)制內(nèi)核進(jìn)程塊KPROCESS頁目錄索引頁表索引字節(jié)索引CR3物理地址IndexPFNPDE頁目錄(每個進(jìn)程建立一張,1024項)IndexPFNPTE頁表(每個進(jìn)程最多有512個,系統(tǒng)空間最多占用512個,每張表1024項)Index物理地址空間要求的字節(jié)要求的頁地址轉(zhuǎn)換機(jī)制硬件PDE/PTE的格式(X86)由HARDWARE_PTE結(jié)構(gòu)定義...............進(jìn)程1的頁表進(jìn)程2的頁表PTE0進(jìn)程1的頁目錄進(jìn)程2的頁目錄PTE0PDE0PDE0SystemPTE0PDE511PDE512PDEnPDEnPDE512PDE511..................SystemPTEn...系統(tǒng)頁表進(jìn)程沒有訪問的系統(tǒng)頁表各進(jìn)程私有地址轉(zhuǎn)換機(jī)制進(jìn)程頁表與系統(tǒng)頁表快表TLB

.

.

.虛頁5頁框290虛頁64無效虛頁17頁框1004虛頁65頁框801虛頁6頁框14虛頁7無效

TLB虛頁號:17虛擬地址同時讀取并比較匹配地址轉(zhuǎn)換機(jī)制缺頁處理頁目錄項和頁表項的最低位為1,有效(Valid),表示該頁映射了物理內(nèi)存。當(dāng)要訪問的虛擬地址所在頁在物理內(nèi)存中時,該虛擬地址所在頁相應(yīng)的PDE,PTE都有效,CPU自動根據(jù)相應(yīng)的PDE,PTE把虛擬地址轉(zhuǎn)換成物理地址,完成訪問

——這一過程操作系統(tǒng)不需介入。如果要訪問的虛擬地址所在頁在不物理內(nèi)存中,此時的PTE無效(最低位為0

)。對無效PTE的格式的定義,由操作系統(tǒng)負(fù)責(zé)。缺頁處理無效的頁表項頁文件所需的頁駐留在一個頁文件中,引發(fā)頁面調(diào)入操作請求零頁所需的頁必須是零頁面

頁文件偏移

保護(hù)

0

0

文件號

3112111095410

轉(zhuǎn)換

原型

有效

缺頁處理無效的頁表項轉(zhuǎn)換所需頁面在內(nèi)存中的后備鏈表、修改鏈表或修改尚未寫入鏈表未知頁表項為零,或者頁表不存在

轉(zhuǎn)換

原型

有效

頁框號

保護(hù)限制

0

1

1

311211109543210

擁有者

直接寫

緩存禁用

保護(hù)限制

缺頁處理當(dāng)某條指令訪問的頁不在物理內(nèi)存中時,CPU仍然會自動通過頁目錄和頁表把虛擬地址轉(zhuǎn)換成物理地址,在地址轉(zhuǎn)換過程中,CPU將會發(fā)現(xiàn)對應(yīng)地址的頁表項無效,從而就會引發(fā)頁面錯誤(PageFault)異常,該異常的中斷號是0xe,有時也稱為缺頁中斷。發(fā)生缺頁中斷時,CPU自動將引發(fā)異常時訪問的虛擬地址存入寄存器CR2。缺頁中斷缺頁處理在發(fā)生異常時,CPU自動根據(jù)中斷號,在中斷描述符表中找到相應(yīng)的中斷描述符,根據(jù)中斷描述符中的地址,轉(zhuǎn)到異常處理程序ntoskrnl!KiTrap0E。異常處理程序KiTrap0E是操作系統(tǒng)提供的,它將會調(diào)用MmAccessFault,MmAccessFault通過CR2中的訪問地址,計算出相應(yīng)的PDE/PTE地址,通過分析PTE中的內(nèi)容(無效的PDE/PTE的格式由操作系統(tǒng)定義),可以知道是哪種情況引起的異常,并根據(jù)情況作出相應(yīng)的處理。

缺頁中斷頁面調(diào)入I/O向文件(頁或映射文件)發(fā)出讀操作來解決缺頁問題頁面調(diào)入I/O是同步的缺頁處理頁文件使磁盤空間看起來象內(nèi)存一樣最多16個頁文件頁文件以非壓縮的形式被創(chuàng)建缺頁處理內(nèi)存分配方式以頁為單位的虛擬內(nèi)存分配方式函數(shù)(Virtualxxx)內(nèi)存映射文件函數(shù)(CreateFileMapping,MapViewOfFile),內(nèi)存堆方法(Heapxxx和早期的接口Localxxx和Globalxxx)。用戶空間內(nèi)存分配方式以頁為單位的虛擬內(nèi)存分配方法適合于管理大型對象數(shù)據(jù)結(jié)構(gòu),尤其是動態(tài)或稀疏分配的。對于以頁為單位的虛擬內(nèi)存,Windows采用兩階段內(nèi)存分配方法:保留內(nèi)存和提交內(nèi)存。應(yīng)用程序可以首先保留地址空間,然后向此地址空間提交物理頁面。VirtualAlloc和VirtualAllocEx函數(shù)實(shí)現(xiàn)這些功能。保留地址空間是為線程將來使用所保留的一塊虛擬地址。在已保留的區(qū)域中,提交頁面必須指出將物理存儲器提交到何處以及提交多少。提交頁面在訪問時會轉(zhuǎn)變?yōu)槲锢韮?nèi)存中的有效頁面。VirtualFree或VirtualFreeEx函數(shù)回收頁面或釋放地址空間。用戶空間內(nèi)存分配方式使用VirtualAlloc可以在用戶地址空間中保留或者提交指定地址和大小的一段地址空間。那么系統(tǒng)如何知道指定的這段地址空間是不是已經(jīng)被分配(保留或者提交)。對于指定地址空間是否已經(jīng)被提交了物理內(nèi)存,可以通過頁目錄和頁表來判斷,不過這樣做很麻煩。而對于指定地址空間是否已經(jīng)被保留,通過頁目錄和頁表沒有辦法判斷。Windows中使用VAD來解決這個問題。用戶空間內(nèi)存分配方式以頁為單位的虛擬內(nèi)存分配方法虛擬地址描述符范圍:20000000到2000FFFF保護(hù)限制:讀/寫繼承:有范圍:00002000到0000FFFF保護(hù)限制:只讀繼承:無范圍:4E000000到4F000000保護(hù)限制:復(fù)制可寫入繼承:有范圍:32000000到3300FFFF保護(hù)限制:只讀繼承:無范圍:7AAA0000到7AAA00FF保護(hù)限制:讀/寫繼承:無用戶空間內(nèi)存分配方式對于每一個進(jìn)程,Windows的內(nèi)存管理器維護(hù)一組虛擬地址描述符(VAD,VirtueAddressDescriptors)來描述一段被分配的進(jìn)程虛擬空間的狀態(tài)。虛擬地址描述信息被構(gòu)造成一棵自平衡二叉樹以使查找更有效率。

VAD二叉排序樹的根的地址保存在進(jìn)程結(jié)構(gòu)EPROCESS中。Windows的進(jìn)程結(jié)構(gòu)用戶空間內(nèi)存分配方式通過區(qū)域?qū)ο蠓?wù)提供的大數(shù)據(jù)流和內(nèi)存共享服務(wù)區(qū)域?qū)ο螅╯ectionobject)在Win32子系統(tǒng)中被稱之為文件映射對象,表示可以被兩個或更多進(jìn)程所共享的內(nèi)存塊。區(qū)域?qū)ο笠部梢曰陧撐募reateFileMapping創(chuàng)建區(qū)域?qū)ο驧apViewOfFile函數(shù)映射區(qū)域?qū)ο蟮囊徊糠郑ń凶鰠^(qū)域視圖),并指定映射范圍當(dāng)兩個進(jìn)程對同一區(qū)域?qū)ο蠼⒁晥D時,就發(fā)生了對該區(qū)域?qū)ο蟮墓蚕怼S脩艨臻g內(nèi)存分配方式區(qū)域?qū)ο?sectionobject)區(qū)域?qū)ο蠛推渌麑ο笠粯佑蓪ο蠊芾砥鲃?chuàng)建和刪除,對象管理器負(fù)責(zé)用對象頭來管理區(qū)域?qū)ο?,而虛擬內(nèi)存管理器定義區(qū)域?qū)ο蟮膶?shí)體并實(shí)現(xiàn)對象服務(wù)。用戶空間內(nèi)存分配方式用戶空間內(nèi)存分配方式內(nèi)存堆方法內(nèi)存堆方法適合于大量的小型內(nèi)存申請。堆(heap)是保留的地址空間中一個或多個頁組成的區(qū)域,這個地址區(qū)域可以由堆管理器按更小塊劃分和分配。堆管理器是執(zhí)行體中分配和回收可變內(nèi)存的函數(shù)集。進(jìn)程啟動時帶有一個缺省進(jìn)程堆,通常是1MB大小。為了從缺省堆中分配內(nèi)存,線程必須調(diào)用GetProcessHeap函數(shù)得到一個指向它的句柄。有了句柄后,線程可以調(diào)用HeapAlloc和HeapFree來從堆中分配和回收內(nèi)存塊。進(jìn)程也可以使用HeapCreate函數(shù)創(chuàng)建另外的私有堆。當(dāng)進(jìn)程不再需要私有堆時,可以通過調(diào)用HeapDestroy釋放虛擬地址空間。系統(tǒng)內(nèi)存分配非分頁緩沖池

由系統(tǒng)虛擬地址組成,它們長期駐留在物理內(nèi)存中,在任何時候都可以被訪問到(從任何IRQL級和任何進(jìn)程上下文),而不會發(fā)生頁錯誤。分頁緩沖池

是系統(tǒng)可以被分頁和換出的虛擬內(nèi)存的一個區(qū)域。不從DPC/調(diào)度級或更高級訪問內(nèi)存的設(shè)備驅(qū)動程序可以使用分頁緩沖池。內(nèi)存分配方式系統(tǒng)有兩種非分頁緩沖池:一種在一般情況下使用,另一種小型的(4頁)緩沖池在非分頁緩沖池已滿并且調(diào)用者不能允許分配失敗時,緊急使用。單處理機(jī)系統(tǒng)有三個分頁緩沖池;多處理機(jī)系統(tǒng)有五個。系統(tǒng)內(nèi)存分配系統(tǒng)內(nèi)存分配工作集工作集要討論的問題是分給每個進(jìn)程多少物理頁面,以及如何動態(tài)調(diào)整各進(jìn)程的物理頁面數(shù)。由Denning提出工作集——駐留在物理內(nèi)存中的虛擬頁面的子集。進(jìn)程工作集:為每個進(jìn)程分配的一定數(shù)量的頁框系統(tǒng)工作集:為可分頁的系統(tǒng)代碼和數(shù)據(jù)分配的頁框工作集大小的變化:進(jìn)程開始執(zhí)行后,隨著訪問新頁面逐步建立較穩(wěn)定的工作集。當(dāng)內(nèi)存訪問的局部性區(qū)域的位置大致穩(wěn)定時,工作集大小也大致穩(wěn)定;局部性區(qū)域的位置改變時,工作集快速擴(kuò)張和收縮過渡到下一個穩(wěn)定值。工作集取頁策略:內(nèi)存管理器利用請求式頁面調(diào)度算法以及簇(集群)方式將頁面裝入內(nèi)存置頁策略:選擇頁框應(yīng)使CPU內(nèi)存高速緩存不必要的震蕩最小換頁策略在多處理器系統(tǒng)中,Windows采用了局部先進(jìn)先出置換策略。而在單處理器系統(tǒng)中,其實(shí)現(xiàn)更接近于最近最少使用策略(LRU)(稱為“輪轉(zhuǎn)算法)。頁面調(diào)度策略工作集系統(tǒng)工作集的內(nèi)容系統(tǒng)高速緩存頁面分頁緩沖池Ntoskrnl.exe中可分頁的代碼和數(shù)據(jù)設(shè)備驅(qū)動程序中可分頁的代碼和數(shù)據(jù)系統(tǒng)映射視圖(部分映射在0xA0000000處,如Win32k.sys)工作集當(dāng)操作系統(tǒng)需要提供一個物理頁給應(yīng)用程序,來滿足應(yīng)用程序要求的時候,將遇到一個問題,系統(tǒng)如何知道哪些物理頁已經(jīng)被使用,哪些物理頁沒有被使用。頁框號數(shù)據(jù)庫(PageFrameNumberDataBase)和它的相關(guān)結(jié)構(gòu)用來解決這個問題。物理內(nèi)存管理PageFrameNumber——PFN對于每一個物理頁,操作系統(tǒng)使用一個24字節(jié)長的結(jié)構(gòu)MMPFN來保存它的相關(guān)信息。頁框號數(shù)據(jù)庫就是一個MMPFN數(shù)組,這個數(shù)組的每一項對應(yīng)一個物理頁,例如數(shù)組第0項,對應(yīng)物理頁0,也就是頁框號為0的物理頁框。Windows把頁框號數(shù)據(jù)庫的首地址保存在全局變量MmPfnDatabase中。

物理內(nèi)存管理物理內(nèi)存管理

活動(Active)/有效(Valid)這個物理頁在某個進(jìn)程的WorkingSet中,該進(jìn)程的一個有效的頁表項中的高20bit正是這個物理頁的PFN。 過渡(Transition)系統(tǒng)正在從一個文件將內(nèi)容讀入該物理頁,或者正在向一個文件寫出該物理頁內(nèi)容。

物理內(nèi)存中每個頁面的狀態(tài)物理內(nèi)存管理

后備(standby) 這個物理頁曾經(jīng)在某個進(jìn)程的WorkingSet中,并且物理頁中的內(nèi)容在被該進(jìn)程使用時沒有被改變過。但是現(xiàn)在已經(jīng)被移出該進(jìn)程的WorkingSet,不過物理頁中的內(nèi)容仍是在該進(jìn)程WorkingSet中時的內(nèi)容。該進(jìn)程相應(yīng)的PTE中的高20bit仍然是這個物理頁的頁框號,只是該P(yáng)TE被標(biāo)為invalid和transition。當(dāng)該進(jìn)程需要再次訪問這一頁的內(nèi)容時,只需要重新設(shè)定該P(yáng)TE的標(biāo)志,并把該P(yáng)TE變?yōu)橛行?。把該物理頁從Standby狀態(tài)變?yōu)锳ctive(Valid)狀態(tài)就可以了。物理內(nèi)存中每個頁面的狀態(tài)物理內(nèi)存管理修改(Modified)這個物理頁曾經(jīng)在某個進(jìn)程的WorkingSet中,并且物理頁中的內(nèi)容在被該進(jìn)程使用時被改變過。但是現(xiàn)在已經(jīng)被移出了該進(jìn)程的WorkingSet,不過物理頁中的內(nèi)容仍是被移出時的內(nèi)容。該進(jìn)程相應(yīng)的PTE中的高20bit仍然是這個物理頁的頁框號,只是該P(yáng)TE被標(biāo)為invalid和transition。當(dāng)該進(jìn)程需要再次訪問這一頁的內(nèi)容時,只需要重新設(shè)定該P(yáng)TE的標(biāo)志,并把該P(yáng)TE變?yōu)橛行?。把該物理頁從Modified狀態(tài)變?yōu)锳ctive(Valid)狀態(tài)就可以了。在該物理頁被系統(tǒng)作為其他用途使用之前,該物理頁中的內(nèi)容需要被寫入硬盤中的頁文件的相應(yīng)頁。

物理內(nèi)存中每個頁面的狀態(tài)物理內(nèi)存管理修改不寫入(Modifiedno-write)內(nèi)存管理器的ModifiedPageWriter將不會把這種物理頁寫入硬盤,其他和Modified物理頁一樣。

空閑(Free) 該物理頁中的內(nèi)容不再被需要零初始化(zeroed) 該頁free并且已經(jīng)被用零初始化壞 (Bad)該頁存在硬件錯誤,不能被使用 物理內(nèi)存中每個頁面的狀態(tài)進(jìn)程1的頁表進(jìn)程3的頁表頁框號數(shù)據(jù)庫有效無效:磁盤地址無效:過渡...進(jìn)程2的頁表有效無效:磁盤地址有效......有效無效:過渡無效:磁盤地址使用中后備鏈表使用中使用中修改鏈表...原型頁表項前向指針后向指針物理內(nèi)存管理物理內(nèi)存管理零初始化活動頁框號數(shù)據(jù)庫■活動活動■■■...空閑后備壞修改修改不寫入MmZeroedPageListHeadMmFreePageListHeadMmStandbyPageListHeadMmModifiedNoWritePageListHeadMmModifiedPageListHeadMmBadPageListHead進(jìn)程工作集后備頁鏈表修改頁面寫回程序修改頁鏈表空閑頁鏈表零初始化頁面線程零初始化頁鏈表壞頁鏈表“軟”缺頁故障工作集重置從外存或內(nèi)核配置讀入的頁面需求零缺頁故障物理內(nèi)存管理內(nèi)存映射文件內(nèi)存映射文件的應(yīng)用使用方法內(nèi)存映射文件與虛擬內(nèi)存一樣,內(nèi)存映射文件可以用來保留一個地址空間的區(qū)域,并將物理存儲器提交給該區(qū)域。它們之間的差別是,物理存儲器來自一個已經(jīng)位于磁盤上的文件,而不是系統(tǒng)的頁文件。一旦該文件被映射,就可以訪問它,就像整個文件已經(jīng)加載內(nèi)存一樣。內(nèi)存映射文件內(nèi)存映射文件的應(yīng)用加載和執(zhí)行.exe和dll文件,這可以節(jié)省頁文件空間和應(yīng)用程序啟動所需的時間;訪問磁盤上的數(shù)據(jù)文件,這可以減少文件I/O,并且不必對文件進(jìn)行緩存;實(shí)現(xiàn)多個進(jìn)程間的數(shù)據(jù)共享。內(nèi)存映射的EXE文件和DLL文件Windows創(chuàng)建一個進(jìn)程時,將執(zhí)行下列操作步驟:1)創(chuàng)建一個新進(jìn)程執(zhí)行體對象;2)為新進(jìn)程創(chuàng)建一個私有地址空間;3)保留一個足夠大的地址空間區(qū)域,用于存放該EXE文件。該區(qū)域需要的位置在EXE文件本身中設(shè)定。按照默認(rèn)設(shè)置,EXE文件的基地址是0x00400000,但是可以在創(chuàng)建應(yīng)用程序的EXE文件時重載這個地址,方法是在鏈接應(yīng)用程序時使用鏈接程序的/BASE選項。4)系統(tǒng)注意到支持已保留區(qū)域的物理存儲器是在磁盤上的EXE文件中,而不是在系統(tǒng)的頁文件中。5)當(dāng)EXE文件被映射到進(jìn)程的地址空間中之后,系統(tǒng)將訪問EXE文件的.idata節(jié),它列出了包含在EXE文件中的代碼要調(diào)用的函數(shù)的DLL文件。然后,系統(tǒng)為每個DLL文件調(diào)用LoadLibrary函數(shù),如果任何一個DLL需要更多的DLL,那么系統(tǒng)將調(diào)用LoadLibrary函數(shù),以便加載這些DLL。每當(dāng)調(diào)用LoadLibrary來加載一個DLL時,系統(tǒng)將執(zhí)行類似上面的第3和第4個步驟。內(nèi)存映射文件的應(yīng)用內(nèi)存映射的EXE文件和DLL文件內(nèi)存映射文件的應(yīng)用當(dāng)為正在運(yùn)行的應(yīng)用程序創(chuàng)建新進(jìn)程時,Windows將打開用于標(biāo)識可執(zhí)行文件映像的文件映射對象的另一個內(nèi)存映射視圖,并創(chuàng)建一個新進(jìn)程對象。系統(tǒng)將新的進(jìn)程ID賦予這個對象。通過使用內(nèi)存映射文件,同一個應(yīng)用程序的多個正在運(yùn)行的實(shí)例就能夠共享RAM中的相同代碼和數(shù)據(jù)。內(nèi)存映射的EXE文件和DLL文件內(nèi)存映射文件的應(yīng)用如果應(yīng)用程序的一個實(shí)例改變了駐留在數(shù)據(jù)頁面中的某些全局變量,那么該應(yīng)用程序的所有實(shí)例的內(nèi)存內(nèi)容都將改變,這種改變可能帶來災(zāi)難性的后果,因此是決不允許的。為此,Windows的內(nèi)存管理器利用寫時復(fù)制(copy-on-write)特性來防止進(jìn)行這種改變。每當(dāng)應(yīng)用程序嘗試將數(shù)據(jù)寫入它的內(nèi)存映射文件時,Windows就會抓住這種嘗試,為包含應(yīng)用程序嘗試寫入數(shù)據(jù)的內(nèi)存頁面分配一個新內(nèi)存頁,再復(fù)制該頁面的內(nèi)容,并允許該應(yīng)用程序?qū)?shù)據(jù)寫入這個新分配的內(nèi)存頁。結(jié)果,同一個應(yīng)用程序的所有其他實(shí)例的運(yùn)行都不會受到影響。寫時復(fù)制內(nèi)存映射文件的應(yīng)用內(nèi)存映射數(shù)據(jù)文件文件內(nèi)存映射文件的應(yīng)用問題:如何實(shí)現(xiàn)將一個文件中的所有字節(jié)倒放?方法1:一個文件,一個緩沖區(qū)方法2:兩個文件,一個緩沖區(qū)方法3:一個文件,兩個緩沖區(qū)方法4:一個文件,零緩沖區(qū)最大優(yōu)點(diǎn)是,操作系統(tǒng)能夠管理所有的文件緩沖區(qū)操作,不必分配任何內(nèi)存,或者將文件數(shù)據(jù)加載到內(nèi)存,也不必將數(shù)據(jù)重新寫入該文件,或者釋放任何內(nèi)存塊。使用內(nèi)存映射文件在進(jìn)程之間共享數(shù)據(jù)內(nèi)存映射文件的應(yīng)用數(shù)據(jù)共享方法是通過讓兩個或多個進(jìn)程映射同一個文件映射對象的視圖來實(shí)現(xiàn)的,這意味著它們將共享物理存儲器的同一個頁面。因此,當(dāng)一個進(jìn)程將數(shù)據(jù)寫入一個共享文件映射對象的視圖時,其他進(jìn)程可以立即看到它們視圖中的數(shù)據(jù)變更情況。注意,如果多個進(jìn)程共享單個文件映射對象,那么所有進(jìn)程必須使用相同的名字來表示該文件映射對象。使用內(nèi)存映射文件在進(jìn)程之間共享數(shù)據(jù)內(nèi)存映射文件的應(yīng)用使用過程若要使用內(nèi)存映射文件,必須執(zhí)行下列操作步驟:1)創(chuàng)建或打開一個文件對象,該對象用于標(biāo)識磁盤上想用作內(nèi)存映射文件的文件。2)創(chuàng)建一個文件映射對象,告訴系統(tǒng)該文件的大小和打算如何訪問該文件。3)讓系統(tǒng)將文件映射對象的全部或一部分映射到進(jìn)程地址空間中。使用過程當(dāng)完成對內(nèi)存映射文件的使用時,必須執(zhí)行下面這些步驟將它清除:1)告訴系統(tǒng)從進(jìn)程的地址空間中撤消文件映射對象的映像。2)關(guān)閉文件映射對象。3)關(guān)閉文件對象。使用過程步驟1:創(chuàng)建或打開文件dwDesiredAccess用于設(shè)定如何訪問該文件的內(nèi)容,GENERIC_READ/GENERIC_WRITE/GENERIC_READ|GENERIC_WRITEdwShareMode告訴系統(tǒng)如何共享該文件,F(xiàn)ILE_SHARE_READ/FILE_SHARE_WRITE/FILE_SHARE_READ|FILE_SHARE_WRITE使用過程步驟2:創(chuàng)建一個文件映射對象創(chuàng)建一個文件映射時,系統(tǒng)并不為它保留地址空間區(qū)域,也不將文件的存儲器映射到該區(qū)域。但是,當(dāng)系統(tǒng)將存儲器映射到進(jìn)程的地址空間中去時,系統(tǒng)必須知道應(yīng)該將什么保護(hù)屬性賦予物理存儲器的頁面。fdwProtect參數(shù)設(shè)定這些保護(hù)屬性:PAGE_READONLY/PAGE_READWRITE/PAGE_WRITECOPYdwMaximumSizeHigh和dwMaximumSizeLow參數(shù)將告訴系統(tǒng)該文件的最大字節(jié)數(shù)。使用64位的值,意味著Windows能夠處理最大為16EB的文件。使用過程步驟3:將文件數(shù)據(jù)映射到進(jìn)程的地址空間創(chuàng)建了一個文件映射對象后,必須讓系統(tǒng)為文件的數(shù)據(jù)保留一個地址空間區(qū)域,并將文件的數(shù)據(jù)作為映射到該區(qū)域的物理存儲器進(jìn)行提交。dwDesiredAccess用于標(biāo)識如何訪問該數(shù)據(jù):FILE_MAP_WRITE/FILE_MAP_READ/FILE_MAP_ALL_ACCESS/FILE_MAP_COPY最后3個參數(shù)與保留地址空間區(qū)域及將物理存儲器映射到該區(qū)域有關(guān)。將一個文件映射到進(jìn)程地址空間中時,不必一次性地映射整個文件。相反,可以只將文件的一小部分映射到地址空間。被映射到進(jìn)程的地址空間的這部分文件稱為一個視圖使用過程步驟4:從進(jìn)程的地址空間中撤消文件數(shù)據(jù)的映像pvBaseAddress用于設(shè)定返回區(qū)域的基地址,該值必須與調(diào)用MapViewOfFile函數(shù)返回的值相同。當(dāng)不再需要保留映射到進(jìn)程地址空間區(qū)域中的文件數(shù)據(jù)時,必須要調(diào)用UnmapViewOfFile函數(shù).如果沒有調(diào)用這個函數(shù),那么在進(jìn)程終止運(yùn)行前,保留的區(qū)域就不會被釋放。步驟5:關(guān)閉文件映射對象步驟6:關(guān)閉文件對象外存管理的基本原理外存管理通常指的是磁盤管理。內(nèi)存的訪問速度比磁盤要快若干個數(shù)量級,磁盤系統(tǒng)的性能對整個系統(tǒng)的性能有重要影響,磁盤設(shè)備管理的目標(biāo)就是提高磁盤系統(tǒng)的性能。磁盤存儲管理的主要任務(wù)是:為文件分配必要的存儲空間;提高磁盤存儲空間的利用率;提高對磁盤的I/O速度,以改善文件系統(tǒng)的性能;采取必要的冗余措施,來確保文件系統(tǒng)的可靠性。磁盤性能簡述磁盤I/O調(diào)度策略廉價冗余磁盤陣列RAID外存管理的基本原理盤片、面、磁道、扇區(qū)磁盤格式化格式化后每個扇區(qū)包括標(biāo)識符字段:其中一個字節(jié)作為該字段的定界符,利用磁道號、磁頭號及扇區(qū)三者來標(biāo)識一個扇區(qū);CRC字段用于段校驗(yàn)。數(shù)據(jù)字段:存放數(shù)據(jù)。1.?dāng)?shù)據(jù)的組織磁盤性能簡述2.磁盤的類型固定頭磁盤移動頭磁盤磁盤性能簡述3.磁盤I/O訪問時間的組成柱面定位時間:磁頭移動到指定柱面的機(jī)械運(yùn)動時間;旋轉(zhuǎn)延遲時間:磁盤旋轉(zhuǎn)到指定扇區(qū)的機(jī)械運(yùn)動時間;它與磁盤轉(zhuǎn)速相關(guān),如:軟盤轉(zhuǎn)速可為600rpm(每分鐘轉(zhuǎn)速),硬盤可為7200rpm。數(shù)據(jù)傳送時間:從指定扇區(qū)讀寫數(shù)據(jù)的時間。由于柱面定位時間在訪問時間中占主要部分,合理組成磁盤數(shù)據(jù)的存儲位置可提高磁盤I/O性能。例子:讀一個128KB大小的文件:(1)文件由8個連續(xù)磁道(每個磁道32個扇區(qū))上的256個扇區(qū)構(gòu)成:20ms+(8.3ms+16.7ms)*8=220ms;其中,柱面定位時間為20ms,旋轉(zhuǎn)延遲時間為8.3ms,32扇區(qū)數(shù)據(jù)傳送時間為16.7ms;(2)文件由256個隨機(jī)分布的扇區(qū)構(gòu)成:(20ms+8.3ms+0.5ms)*256=7373ms;其中,1扇區(qū)數(shù)據(jù)傳送時間為0.5ms;隨機(jī)分布時的訪問時間為連續(xù)分布時的33.5倍。磁盤性能簡述磁盤I/O調(diào)度策略先進(jìn)先出算法優(yōu)先級算法后進(jìn)先出算法短查找時間優(yōu)先算法掃描(SCAN)算法循環(huán)掃描(C-SCAN)算法N步掃描(N-step-SCAN)算法雙隊列掃描(FSCAN)算法來自不同進(jìn)程的磁盤I/O請求構(gòu)成一個隨機(jī)分布的請求隊列。磁盤I/O調(diào)度的主要目標(biāo)就是減少請求隊列對應(yīng)的平均柱面定位時間。先進(jìn)先出(FIFO,FirstInFirstOut)算法:磁盤I/O執(zhí)行順序?yàn)榇疟PI/O請求的先后順序。該算法的特點(diǎn)是公平性;在磁盤I/O負(fù)載較輕且每次讀寫多個連續(xù)扇區(qū)時,性能較好。優(yōu)先級算法:依據(jù)進(jìn)程優(yōu)先級來調(diào)整磁盤I/O請求的執(zhí)行順序。該算法反映進(jìn)程在系統(tǒng)的優(yōu)先級特征,目標(biāo)是系統(tǒng)目標(biāo)的實(shí)現(xiàn),而不是改進(jìn)磁盤I/O性能。磁盤I/O調(diào)度策略后進(jìn)先出(LIFO,LastInFirstOut)算法:后產(chǎn)生的磁盤I/O請求,先執(zhí)行。該算法是基于事務(wù)系統(tǒng)中順序文件中磁盤I/O的局部性特征,相鄰訪問的位置也相鄰。它的問題在于系統(tǒng)負(fù)載重時,可能有進(jìn)程的磁盤I/O永遠(yuǎn)不能執(zhí)行,處于饑餓狀態(tài)。短查找時間優(yōu)先(SSTF,Short

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論