小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

WinCE內(nèi)存管理(注意棧部分)

 cici5177 2011-05-25
   如果你在寫Windows CE 程序中遇到的最重要的問題,那一定是內(nèi)存問題。一個(gè)WinCE 系統(tǒng)可能只有4MB 的RAM,這相對(duì)于個(gè)人電腦來說是十分少的,因?yàn)閭€(gè)人電腦的標(biāo)準(zhǔn)配置已經(jīng)到了128MB 甚至更多。事實(shí)上,運(yùn)行WinCE 的機(jī)器的內(nèi)存十分缺乏,以至于有時(shí)候有必要在寫程序的時(shí)候?yàn)楣?jié)約內(nèi)存而犧牲程序的整體性能。

     幸運(yùn)的是,盡管WinCE系統(tǒng)的內(nèi)存很小,但可用來管理內(nèi)存的函數(shù)卻十分完善。WinCE實(shí)現(xiàn)了Microsoft Windows XP和Microsoft Windows Me中可用到的幾乎全部的Win32內(nèi)存管理API。WinCE支持虛擬內(nèi)存(virtual memory)分配,本地(local)和分離(separate)的堆(heaps),甚至還有(memory-mapped files)內(nèi)存映射文件。

     像Windows XP一樣,WinCE支持一個(gè)帶有應(yīng)用程序間內(nèi)存保護(hù)功能的32位平面地址空間,但是WinCE是被設(shè)計(jì)來應(yīng)用于不同場(chǎng)合,所以它底層的內(nèi)存結(jié)構(gòu)不同于Windows XP。這些不同能夠影響到你如何設(shè)計(jì)一個(gè)WinCE 應(yīng)用程序。在這一章中,我將講述最基礎(chǔ)的WinCE內(nèi)存結(jié)構(gòu)。我也將講述包括WinCE中可用的內(nèi)存分配方式中的不同點(diǎn)以及如何使用這些不同的內(nèi)存類型來最小化你的程序的內(nèi)存占有率。

 

     對(duì)所有的電腦來說,系統(tǒng)地運(yùn)行一個(gè)WinCE,需要ROM(只讀存儲(chǔ)器)和RAM(隨機(jī)存儲(chǔ)器)。但不論如何,在WinCE系統(tǒng)中,ROM和RAM的使用還是稍微有些不同于個(gè)人電腦環(huán)境。

關(guān)于RAM
      RAM在WinCE 系統(tǒng)中被分為兩個(gè)區(qū)域:第一個(gè)是程序的存儲(chǔ)區(qū)(program memory),也叫做系統(tǒng)堆(system heap)。第二個(gè)是對(duì)象存儲(chǔ)區(qū)(object store)。這個(gè)對(duì)象存儲(chǔ)區(qū)有點(diǎn)像一個(gè)永久的虛擬RAM磁盤。不同于PC上的舊式的虛擬RAM磁盤,對(duì)象存儲(chǔ)區(qū)保留存儲(chǔ)的文件甚至當(dāng)系統(tǒng)被關(guān)閉以后。(腳注)這種安排的原因是WinCE 系統(tǒng),例如Pocket PC代表性地具有一個(gè)主電池和一個(gè)備用電池。當(dāng)用戶更換主電池的時(shí)候,備用電池的工作是提供電源給RAM以便維持文件在對(duì)象存儲(chǔ)區(qū)的存儲(chǔ)。當(dāng)用戶按了重啟鍵之后,WinCE核心就開始尋找在關(guān)閉系統(tǒng)前建立的對(duì)象存儲(chǔ)區(qū),如果找到的話就將繼續(xù)使用它。

      RAM中的另一個(gè)區(qū)域則用作程序存儲(chǔ)區(qū)。程序存儲(chǔ)區(qū)有點(diǎn)像個(gè)人電腦中的RAM,它為正在運(yùn)行的應(yīng)用程序保存堆和棧的內(nèi)容。在對(duì)象存儲(chǔ)區(qū)和程序存儲(chǔ)區(qū)之間的分界線是可以通過移動(dòng)它來改變的,用戶可以在控制面板中找到改變這條分界線的設(shè)置。在可用內(nèi)存降低的(low-memory)條件下,系統(tǒng)將會(huì)彈出對(duì)話框詢問用戶是否要將對(duì)象存儲(chǔ)區(qū)RAM劃分一些給程序存儲(chǔ)區(qū)RAM以滿足要運(yùn)行的應(yīng)用程序的需求。

關(guān)于ROM
      在個(gè)人電腦中,ROM是用來存儲(chǔ)BIOS(基本輸入輸出系統(tǒng))并且只有64-128KB。在WinCE系統(tǒng)中,ROM大小可以從4MB到32MB并且存放整個(gè)操作系統(tǒng)以及和系統(tǒng)捆綁在一起的應(yīng)用程序。在這種情況下,ROM在WinCE系統(tǒng)中就好像一個(gè)只讀的硬盤。

      在一個(gè)WinCE系統(tǒng)中,存儲(chǔ)在ROM之上的程序能夠以現(xiàn)場(chǎng)執(zhí)行(Execute in Place,XIP)的方式運(yùn)行。換句話說,程序可以直接從ROM中執(zhí)行而不必先加載到RAM中再執(zhí)行。這種能力對(duì)小型系統(tǒng)來說,使之在兩個(gè)方面具有巨大的優(yōu)勢(shì)。代碼直接從ROM中執(zhí)行意味著程序代碼不會(huì)占據(jù)更有價(jià)值的RAM。同樣,程序在執(zhí)行前也不必先復(fù)制到RAM中,這樣就只需要很少的時(shí)間來啟動(dòng)一個(gè)應(yīng)用程序。不在ROM中,但是被包含在對(duì)象存儲(chǔ)區(qū)(譯者注:上文將對(duì)象存儲(chǔ)區(qū)比作永久的RAM磁盤,故此處要說明,只有Intel力推的nor flash memroy類型才能以XIP方式執(zhí)行,ROM其實(shí)也是一種nor flash memory類型)或閃存卡(Flash memory storage card)中的程序?qū)⒉荒芤袁F(xiàn)場(chǎng)方式執(zhí)行,它們將被復(fù)制到RAM中再執(zhí)行。

關(guān)于虛擬內(nèi)存
       WinCE 實(shí)現(xiàn)了系統(tǒng)的虛擬內(nèi)存管理,在一個(gè)虛擬內(nèi)存系統(tǒng)中,應(yīng)用程序主要處理這個(gè)分離(譯者注:物理上可能分離,但系統(tǒng)將它們聯(lián)系起來),虛擬的地址空間,因此并不涉及到由硬件管理的物理內(nèi)存。操作系統(tǒng)使用微處理器的內(nèi)存管理單元來處理虛擬地址和物理地址間的實(shí)時(shí)轉(zhuǎn)換。

       這種虛擬內(nèi)存方法的優(yōu)勢(shì)能從MS-DOS系統(tǒng)復(fù)雜的地址空間看出來。一旦請(qǐng)求的RAM超過最初PC設(shè)計(jì)的640-KB限制,程序設(shè)計(jì)者將不得不作出像擴(kuò)展內(nèi)存一樣的計(jì)劃以便增加可用內(nèi)存的數(shù)量。OS/2 1.x(譯者注:IBM研制的操作系統(tǒng))和Windows 3.0采用了一種基于段(segment-based)的虛擬內(nèi)存系統(tǒng)來解決問題。應(yīng)用程序使用虛擬內(nèi)存不需要知道實(shí)際物理內(nèi)存的位置,只要有內(nèi)存可用就行。在這些系統(tǒng)中,虛擬內(nèi)存以一種段的方式被實(shí)現(xiàn)了,即可移動(dòng)的內(nèi)存塊(譯者注:段其實(shí)就是內(nèi)存分塊)大小從16字節(jié)到64KB。64-KB的限制并不是由于段本身原因,而是由于Intel 80286的特性所致,這就是Windows3.x和OS/21.x的分段式虛擬內(nèi)存系統(tǒng)結(jié)構(gòu)。

分頁(yè)存儲(chǔ)
Intel 80386支持的段大小已經(jīng)超過64KB,但是Microsoft和IBM開始設(shè)計(jì)OS/2 2.0,他們選擇了一種不同的虛擬內(nèi)存系統(tǒng),隨后也被386所支持,這就是分頁(yè)式虛擬內(nèi)存系統(tǒng)。在一個(gè)分頁(yè)存儲(chǔ)的系統(tǒng)中,最小的可被微處理器管理的單元是頁(yè)(page)。對(duì)于Windows NT和OS/2 2.0系統(tǒng)來說,頁(yè)大小都被設(shè)置為386處理器默認(rèn)的4096字節(jié)。當(dāng)一個(gè)應(yīng)用程序存取一個(gè)頁(yè)的時(shí)候,微處理器將轉(zhuǎn)換該頁(yè)的虛擬內(nèi)存地址到實(shí)際的ROM或RAM中的物理頁(yè)(譯者注:這就是實(shí)現(xiàn)了地址映射和轉(zhuǎn)換,將虛擬的和實(shí)際的存儲(chǔ)單元一一對(duì)應(yīng)),這一頁(yè)同時(shí)被標(biāo)記以便其他程序?qū)υ擁?yè)的訪問將被排斥。操作系統(tǒng)決定虛擬內(nèi)存頁(yè)是否有效,如果有效,將做一個(gè)物理內(nèi)存頁(yè)到虛擬頁(yè)的映射。

WinCE實(shí)現(xiàn)了一個(gè)和其他Win32操作系統(tǒng)類似的分頁(yè)式虛擬內(nèi)存系統(tǒng)。在WinCE中,一頁(yè)的大小可以從1024字節(jié)到4096字節(jié),基于微處理器的不同而不同。這和Windows XP不同,Windows XP頁(yè)面尺寸是Intel微處理器所支持的4096字節(jié)。對(duì)WinCE所支持的CPU類型來說,有486,Intel的Strong-ARM,和Hitachi SH4 都是是用了4096-byte 的頁(yè)面。NEC 4100在Windows CE 3.0中使用了4-KB的頁(yè)面尺寸但是在較早期的開放式系統(tǒng)版本中使用了1-KB的頁(yè)面大小。

虛擬內(nèi)存頁(yè)可以處在三種狀態(tài):自由(free),保留(reserved),或被提交(committed),)。自由頁(yè)就像它的名稱一樣,自由并且可被分配。保留頁(yè)是虛擬地址已經(jīng)被保留,并且不能被操作系統(tǒng)或進(jìn)程中的其他線程重新分配。保留頁(yè)不能用在別處,但是它同樣不能被當(dāng)前程序使用,因?yàn)樗鼪]有被映射到物理內(nèi)存。要想執(zhí)行映射,它必須被提交,一個(gè)提交頁(yè)能被應(yīng)用程序保留,并且直接映射到物理地址。

所有我剛才講述的內(nèi)容對(duì)有經(jīng)驗(yàn)的Win32 程序員們來說是些陳舊的知識(shí)。對(duì)Windows CE 程序員來說最重要的東西是學(xué)習(xí)Windows CE 是如何改變這些因素的。當(dāng)Windows CE 實(shí)現(xiàn)了大部分和它的老大哥Win32一樣的內(nèi)存API集的時(shí)候,Windows CE下面的基礎(chǔ)結(jié)構(gòu)將影響到上面的程序。在分開來看Window CE 應(yīng)用程序的內(nèi)存結(jié)構(gòu)之前,讓我們先來看看一些提供系統(tǒng)內(nèi)存全局狀態(tài)的函數(shù)。

 

Win XP和Wince系統(tǒng)內(nèi)存映射
Windows XP 和 Windows CE 都是 32 位操作系統(tǒng),都同樣支持 4 GB 的虛擬地址空間。Windows XP 將地址空間劃分為兩個(gè) 2 GB 區(qū)域。上半部地址空間是為系統(tǒng)保留的。下面 2 GB 地址空間則由每個(gè)正在運(yùn)行的應(yīng)用程序重復(fù)使用。

圖 1. Windows XP 虛擬內(nèi)存空間

WINCE <wbr>內(nèi)存管理


第一眼看,Windows CE 的虛擬地址空間是以類似系統(tǒng)保留區(qū)域的方式組織的,并且是重復(fù)的應(yīng)用程序空間。圖 2 顯示了 Windows CE 地址空間。在這里,上部 2GB 地址空間也是為系統(tǒng)保留的。下半部地址空間則劃分為很多區(qū)域。該區(qū)域的大多數(shù)(幾乎一半空間)被定義為大型內(nèi)存區(qū)域 (Large Memory Area)。該區(qū)域用來分配通常用于內(nèi)存映射文件的大型內(nèi)存空間塊。
在大型內(nèi)存區(qū)域的下面是另一個(gè)大型區(qū)域,本文稱為保留區(qū)域。在保留區(qū)域的下面,在內(nèi)存空間的最底端,是一個(gè) 64 MB 的區(qū)域。該 64 MB 區(qū)域,更準(zhǔn)確地說是最下面的 32 MB 區(qū)域,是每個(gè)正在運(yùn)行的應(yīng)用程序重復(fù)使用的區(qū)域。

圖 2. Windows CE 虛擬內(nèi)存空間

 

WINCE <wbr>內(nèi)存管理


Windows CE 應(yīng)用程序內(nèi)存映射
最下面的 64 MB 虛擬地址空間是駐留 Windows CE 應(yīng)用程序的地方。圖 3 顯示了該應(yīng)用程序虛擬地址空間。像在 Windows XP 應(yīng)用程序中一樣,應(yīng)用程序代碼從虛擬地址 0x10000 開始加載。應(yīng)用程序啟動(dòng)時(shí),將在地址空間中為所有代碼保留足夠的空間。然后,在需要實(shí)際代碼時(shí),這些代碼將被按需分頁(yè)調(diào)度進(jìn)該地址空間。
在為代碼保留的區(qū)域上面,頁(yè)是為只讀和讀/寫靜態(tài)數(shù)據(jù)區(qū)域保留的。此外,還為本地堆和應(yīng)用程序中運(yùn)行的每個(gè)線程的堆棧保留了區(qū)域。當(dāng)線程啟動(dòng)時(shí),為每個(gè)堆棧保留的區(qū)域的大小是固定的。只在堆棧增長(zhǎng)時(shí)才會(huì)提交實(shí)際的 RAM。另一方面,堆保留了需要在堆中分配 RAM 塊時(shí)增長(zhǎng)的區(qū)域。
當(dāng)加載“現(xiàn)場(chǎng)執(zhí)行”(XIP) DLL 時(shí),將從 64 MB 空間的頂部向下加載這些 DLL。當(dāng)創(chuàng)建 ROM 時(shí),每個(gè) XIP DLL 都會(huì)被定址(確定在地址空間中的位置)。加載非 XIP DLL 時(shí),將把它放在 32 MB 邊界的下面。非 XIP 的 DLL(也叫作基于 RAM 的 DLL)是指那些從對(duì)象存儲(chǔ)區(qū)加載的 DLL、從 ROM 解壓縮的 DLL或從外部文件系統(tǒng)(例如 Compact Flash 卡)加載的 DLL。應(yīng)用程序虛擬內(nèi)存空間中靠上位置的 32 MB 僅用于 XIP DLL。

 

WINCE <wbr>內(nèi)存管理


圖 3. Windows CE .NET 應(yīng)用程序虛擬內(nèi)存空間

由應(yīng)用程序通過創(chuàng)建單獨(dú)的堆或直接調(diào)用 VirtualAlloc API 所分配的任何其他內(nèi)存將從底部向上進(jìn)行分配,分配時(shí),系統(tǒng)將查找第一個(gè)足夠大、可滿足分配的可用區(qū)域。
盡管和Windows XP的應(yīng)用程序設(shè)計(jì)類似,但Windows CE應(yīng)用程序地址空間有一個(gè)巨大的不同影響到應(yīng)用程序。在Windows CE之下,一個(gè)應(yīng)用程序被限制在虛擬內(nèi)存空間中它自己的32MB slot(槽)和 32MB 的slot 1中,slot 1用來加載基于XIP的DLL(注:Windows CE將虛擬地址空間分為33個(gè)slot,每個(gè)slot 32MB,序號(hào)從0-32 )。當(dāng)系統(tǒng)只有4MB RAM的時(shí)候,分配給應(yīng)用程序32MB的虛擬地址空間看起來是比較合理的,Win32的程序員在使用這個(gè)2-GB的虛擬地址空間的時(shí)候,必須記住對(duì) Windows CE應(yīng)用程序的虛擬地址空間限制。

    要注意的是應(yīng)用程序是以一個(gè)64-KB的內(nèi)存區(qū)域開始從0x10000映射,記得最低的64KB地址空間是由Windows為所有應(yīng)用程序保留的。文件映象包括代碼,靜態(tài)數(shù)據(jù)段和資源段。在實(shí)際過程中,當(dāng)應(yīng)用程序啟動(dòng)時(shí)代碼頁(yè)(code pages)不會(huì)載入進(jìn)來,只有在需要該頁(yè)面被載入的時(shí)候,代碼才被載入進(jìn)來

    只讀靜態(tài)數(shù)據(jù)段(read-only static data segment)和可讀寫靜態(tài)數(shù)據(jù)區(qū)(read/write static data areas)只占很少的頁(yè)面。這些段都是排列在一起的。如同代碼一樣,只有當(dāng)這些數(shù)據(jù)段被應(yīng)用程序讀或者寫的時(shí)候才會(huì)提交給RAM。應(yīng)用程序的資源將被載入到一些分離的頁(yè)面中,這些資源是只讀的,并且只有當(dāng)它們被應(yīng)用程序獲取的時(shí)候才會(huì)分頁(yè)進(jìn)入RAM

    應(yīng)用程序的棧(stack)被映射到資源段之上。棧的段位置很容易被找到,因?yàn)樗峤坏捻?yè)就在被保留的區(qū)域的尾部。棧的表現(xiàn)是從高地址到低地址增長(zhǎng)(注:即從高到低填滿地址)。如果該應(yīng)用程序有超過一個(gè)線程,那么應(yīng)用程序的地址空間就會(huì)保留超過一個(gè)的棧的段

    緊接著棧的就是本地堆(local heap)。引導(dǎo)程序保留了大量的頁(yè),大約有幾百K交給heap來使用,但是只提交滿足malloc,new,LocalAlloc函數(shù)調(diào)用分配的內(nèi)存(注:這里是說,被分配多少內(nèi)存才可以提交多少內(nèi)存,沒被分配的不能用作提交)。從本地堆的保留頁(yè)尾部到non-XIP DLL開始的部分剩余保留頁(yè)面將被映射為自由的保留空間,如果RAM允許,應(yīng)用程序可以提交這些保留頁(yè)。Non-XIP DLLs 就是不能被在ROM中現(xiàn)場(chǎng)執(zhí)行的DLL將被從上至下載入到32MB的地址空間。Non-XIP DLLs 包括那些被壓縮存儲(chǔ)在ROM中的DLL。被壓縮的ROM 中的文件在被載入到RAM中執(zhí)行前必須先解壓縮。

比較關(guān)心的問題 
 棧是Windows CE內(nèi)存類型中最容易使用的(自行管理)。在Windows CE中的棧像其它操作系統(tǒng)一樣,是被引用函數(shù)的臨時(shí)變量存儲(chǔ)區(qū)。操作系統(tǒng)也用棧來存儲(chǔ)函數(shù)的返回地址和在異常處理中微處理器寄存器的狀態(tài)。
 在系統(tǒng)中,Windows CE給每個(gè)線程一個(gè)分離的棧。默認(rèn)情況下,系統(tǒng)中每個(gè)棧大小最大被限制為58KB。在一個(gè)進(jìn)程中,每個(gè)分離的線程可以增加棧的大小直到58-KB的限制。
這個(gè)限制使得要我們要知道Windows CE如何對(duì)棧管理。當(dāng)線程被建立的時(shí)候,Windows CE保留一個(gè)64-KB的區(qū)域給每個(gè)線程的棧。棧增加時(shí),提交虛擬內(nèi)存頁(yè)是從上至下的。當(dāng)棧減小時(shí),系統(tǒng)將處于的低內(nèi)存環(huán)境(low-memory),會(huì)回收在棧下面未使用但是仍然被提交的頁(yè)。58KB的限制來源于64-KB的區(qū)域減去用來防止棧的上溢和下溢的頁(yè)面數(shù)量。
 當(dāng)一個(gè)應(yīng)用程序建立一個(gè)新的線程時(shí),棧的最大尺寸可以通過建立線程時(shí)CreateThread調(diào)用來指定。應(yīng)用程序的主線程的棧大小可以通過應(yīng)用程序被連接時(shí)的連接器開關(guān)(linker switch)來指定。同樣會(huì)有一些頁(yè)用作防護(hù),但是棧的大小可以指定至1MB。注意,這個(gè)指定大小同樣會(huì)被用作所有分離線程棧的默認(rèn)棧大小。那就是說,如果你指定主棧為128KB,程序中所有其他的線程棧大小也限制為128KB,除非在用CreateThread建立線程時(shí)指定一個(gè)不同的大小。
 當(dāng)計(jì)劃如何在應(yīng)用程序中使用棧的時(shí)候,另一個(gè)要值得考慮事情的是。當(dāng)應(yīng)用程序調(diào)用一個(gè)需要棧空間的函數(shù)時(shí),Windows CE會(huì)試圖立即提交滿足要求的當(dāng)前棧之下的頁(yè)面,如果沒有物理RAM可用,需要棧空間的線程將會(huì)暫時(shí)停止。如果請(qǐng)求在短時(shí)間內(nèi)得不到允許,可能產(chǎn)生一個(gè)異常。但是如果系統(tǒng)不發(fā)生異常的化,Windows CE將會(huì)最大限度釋放請(qǐng)求的頁(yè)。

靜態(tài)數(shù)據(jù)
 C和C++應(yīng)用程序有一個(gè)預(yù)先定義好的內(nèi)存塊,這是由應(yīng)用程序被裝載時(shí)自動(dòng)分配的。這些塊被用來存儲(chǔ)靜態(tài)分配的字符串,緩沖區(qū)和全局變量,同時(shí)也包括通過靜態(tài)連接到應(yīng)用程序的靜態(tài)庫(kù)函數(shù)中的緩沖區(qū)。
 Windows CE分配給應(yīng)用程序兩塊RAM中的內(nèi)存塊存放靜態(tài)數(shù)據(jù),一個(gè)是可讀寫數(shù)據(jù)(read/write data)和只讀數(shù)據(jù)(read only data)。因?yàn)檫@些區(qū)域是基于頁(yè)分配的,所以你可以在一頁(yè)的靜態(tài)數(shù)據(jù)開始到下一頁(yè)開始之間找到一些剩余空間。細(xì)微調(diào)整Windows CE應(yīng)用程序就是要寫滿這些剩余的空間。如果你在靜態(tài)數(shù)據(jù)區(qū)有空間,最好把一個(gè)或兩個(gè)緩沖區(qū)放到靜態(tài)數(shù)據(jù)區(qū),避免動(dòng)態(tài)分配緩沖區(qū)。
 另一個(gè)值得考慮的事情是你是否在寫一個(gè)基于ROM的應(yīng)用程序。你要把盡可能多的數(shù)據(jù)移到只讀靜態(tài)數(shù)據(jù)區(qū)。Windows CE不會(huì)分配只讀的RAM給基于ROM的應(yīng)用程序。并且,ROM頁(yè)會(huì)直接映射到虛擬地址空間。這實(shí)際上就給你了一個(gè)無(wú)限制的只讀空間,而且不會(huì)影響到應(yīng)用程序?qū)AM的需求。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多