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

下載本文檔

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

文檔簡(jiǎn)介

第四章存儲(chǔ)管理(中)存儲(chǔ)管理概述內(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ū)動(dòng)程序接口形式出現(xiàn)。一個(gè)頁面錯(cuò)誤陷阱處理程序用于解決硬件檢測(cè)到的內(nèi)存管理異常,并代表進(jìn)程將虛擬頁面裝入內(nèi)存。運(yùn)行在六個(gè)不同的核心態(tài)系統(tǒng)線程上下文中的幾個(gè)關(guān)鍵組件工作集管理器(MmWorkingSetManager)

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

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

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

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

C0000000進(jìn)程頁表BFFFFFFF

超空間

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

分頁緩沖池未分頁緩沖池

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

每個(gè)進(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頁目錄(每個(gè)進(jìn)程建立一張,1024項(xiàng))IndexPFNPTE頁表(每個(gè)進(jìn)程最多有512個(gè),系統(tǒng)空間最多占用512個(gè),每張表1024項(xiàng))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虛頁號(hào):17虛擬地址同時(shí)讀取并比較匹配地址轉(zhuǎn)換機(jī)制缺頁處理頁目錄項(xiàng)和頁表項(xiàng)的最低位為1,有效(Valid),表示該頁映射了物理內(nèi)存。當(dāng)要訪問的虛擬地址所在頁在物理內(nèi)存中時(shí),該虛擬地址所在頁相應(yīng)的PDE,PTE都有效,CPU自動(dòng)根據(jù)相應(yīng)的PDE,PTE把虛擬地址轉(zhuǎn)換成物理地址,完成訪問

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

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

頁文件偏移

保護(hù)

0

0

文件號(hào)

3112111095410

轉(zhuǎn)換

原型

有效

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

轉(zhuǎn)換

原型

有效

頁框號(hào)

保護(hù)限制

0

1

1

311211109543210

擁有者

直接寫

緩存禁用

保護(hù)限制

缺頁處理當(dāng)某條指令訪問的頁不在物理內(nèi)存中時(shí),CPU仍然會(huì)自動(dòng)通過頁目錄和頁表把虛擬地址轉(zhuǎn)換成物理地址,在地址轉(zhuǎn)換過程中,CPU將會(huì)發(fā)現(xiàn)對(duì)應(yīng)地址的頁表項(xiàng)無效,從而就會(huì)引發(fā)頁面錯(cuò)誤(PageFault)異常,該異常的中斷號(hào)是0xe,有時(shí)也稱為缺頁中斷。發(fā)生缺頁中斷時(shí),CPU自動(dòng)將引發(fā)異常時(shí)訪問的虛擬地址存入寄存器CR2。缺頁中斷缺頁處理在發(fā)生異常時(shí),CPU自動(dòng)根據(jù)中斷號(hào),在中斷描述符表中找到相應(yīng)的中斷描述符,根據(jù)中斷描述符中的地址,轉(zhuǎn)到異常處理程序ntoskrnl!KiTrap0E。異常處理程序KiTrap0E是操作系統(tǒng)提供的,它將會(huì)調(diào)用MmAccessFault,MmAccessFault通過CR2中的訪問地址,計(jì)算出相應(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個(gè)頁文件頁文件以非壓縮的形式被創(chuàng)建缺頁處理內(nèi)存分配方式以頁為單位的虛擬內(nèi)存分配方式函數(shù)(Virtualxxx)內(nèi)存映射文件函數(shù)(CreateFileMapping,MapViewOfFile),內(nèi)存堆方法(Heapxxx和早期的接口Localxxx和Globalxxx)。用戶空間內(nèi)存分配方式以頁為單位的虛擬內(nèi)存分配方法適合于管理大型對(duì)象數(shù)據(jù)結(jié)構(gòu),尤其是動(dòng)態(tài)或稀疏分配的。對(duì)于以頁為單位的虛擬內(nèi)存,Windows采用兩階段內(nèi)存分配方法:保留內(nèi)存和提交內(nèi)存。應(yīng)用程序可以首先保留地址空間,然后向此地址空間提交物理頁面。VirtualAlloc和VirtualAllocEx函數(shù)實(shí)現(xiàn)這些功能。保留地址空間是為線程將來使用所保留的一塊虛擬地址。在已保留的區(qū)域中,提交頁面必須指出將物理存儲(chǔ)器提交到何處以及提交多少。提交頁面在訪問時(shí)會(huì)轉(zhuǎn)變?yōu)槲锢韮?nèi)存中的有效頁面。VirtualFree或VirtualFreeEx函數(shù)回收頁面或釋放地址空間。用戶空間內(nèi)存分配方式使用VirtualAlloc可以在用戶地址空間中保留或者提交指定地址和大小的一段地址空間。那么系統(tǒng)如何知道指定的這段地址空間是不是已經(jīng)被分配(保留或者提交)。對(duì)于指定地址空間是否已經(jīng)被提交了物理內(nèi)存,可以通過頁目錄和頁表來判斷,不過這樣做很麻煩。而對(duì)于指定地址空間是否已經(jīng)被保留,通過頁目錄和頁表沒有辦法判斷。Windows中使用VAD來解決這個(gè)問題。用戶空間內(nèi)存分配方式以頁為單位的虛擬內(nèi)存分配方法虛擬地址描述符范圍:20000000到2000FFFF保護(hù)限制:讀/寫繼承:有范圍:00002000到0000FFFF保護(hù)限制:只讀繼承:無范圍:4E000000到4F000000保護(hù)限制:復(fù)制可寫入繼承:有范圍:32000000到3300FFFF保護(hù)限制:只讀繼承:無范圍:7AAA0000到7AAA00FF保護(hù)限制:讀/寫繼承:無用戶空間內(nèi)存分配方式對(duì)于每一個(gè)進(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)中被稱之為文件映射對(duì)象,表示可以被兩個(gè)或更多進(jìn)程所共享的內(nèi)存塊。區(qū)域?qū)ο笠部梢曰陧撐募reateFileMapping創(chuàng)建區(qū)域?qū)ο驧apViewOfFile函數(shù)映射區(qū)域?qū)ο蟮囊徊糠郑ń凶鰠^(qū)域視圖),并指定映射范圍當(dāng)兩個(gè)進(jìn)程對(duì)同一區(qū)域?qū)ο蠼⒁晥D時(shí),就發(fā)生了對(duì)該區(qū)域?qū)ο蟮墓蚕?。用戶空間內(nèi)存分配方式區(qū)域?qū)ο?sectionobject)區(qū)域?qū)ο蠛推渌麑?duì)象一樣由對(duì)象管理器創(chuàng)建和刪除,對(duì)象管理器負(fù)責(zé)用對(duì)象頭來管理區(qū)域?qū)ο?,而虛擬內(nèi)存管理器定義區(qū)域?qū)ο蟮膶?shí)體并實(shí)現(xiàn)對(duì)象服務(wù)。用戶空間內(nèi)存分配方式用戶空間內(nèi)存分配方式內(nèi)存堆方法內(nèi)存堆方法適合于大量的小型內(nèi)存申請(qǐng)。堆(heap)是保留的地址空間中一個(gè)或多個(gè)頁組成的區(qū)域,這個(gè)地址區(qū)域可以由堆管理器按更小塊劃分和分配。堆管理器是執(zhí)行體中分配和回收可變內(nèi)存的函數(shù)集。進(jìn)程啟動(dòng)時(shí)帶有一個(gè)缺省進(jìn)程堆,通常是1MB大小。為了從缺省堆中分配內(nèi)存,線程必須調(diào)用GetProcessHeap函數(shù)得到一個(gè)指向它的句柄。有了句柄后,線程可以調(diào)用HeapAlloc和HeapFree來從堆中分配和回收內(nèi)存塊。進(jìn)程也可以使用HeapCreate函數(shù)創(chuàng)建另外的私有堆。當(dāng)進(jìn)程不再需要私有堆時(shí),可以通過調(diào)用HeapDestroy釋放虛擬地址空間。系統(tǒng)內(nèi)存分配非分頁緩沖池

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

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

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

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

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

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

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

溫馨提示

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

評(píng)論

0/150

提交評(píng)論