Windows CE記憶體管理 (轉)

amyz發表於2007-08-14
Windows CE記憶體管理 (轉)[@more@] 

  WinCE管理報告:namespace prefix = o ns = "urn:schemas--com::office" />

1.  CE支援虛擬記憶體動態分配(virtual memory allocation),區域性和單獨的堆空間(Local and separate heaps),甚至記憶體對映(memory_mapped files,memory map simplifies file access. Instead of using a system-maintained pointer to write to the file, you can write directly to memory.)

2.  Windows CE環境下ROM和RAM的使用和我們平時的PC機有所不同。RAM被分為 兩個區域:區(proram memory),也叫堆(system heap),和( store)。

l  物件儲存可以被看作類似於一個永久的虛擬RAM。在Pocket PC上,當我們關閉螢幕後,系統實際上並沒有真正斷電,而是進入一個低功耗的睡眠狀態(由主電池來供電)。當我們按下後面的Reset按鈕後,Windows CE核心在RAM中尋找最近一次建立的物件儲存,如果找到的話,就是用這個物件儲存重新啟動。

l  RAM的另一個區域是程式區。這個區域就像PC機的RAM一樣。它存放所執行程式的堆和棧的空間。物件儲存和程式區的界限是可移動的。在低記憶體的情況下,系統會請求把部分可用的儲存物件空間提供給執行程式使用,以滿足程式執行的RAM需要。

u  PC機上,ROM用來儲存,通常是64-128K。在WindowCE系統中,ROM用來儲存整個以及和OS繫結的應用程式,大小可以4-32M不等。因此,WinCE下的ROM就像一個很小的只讀一樣。

u  在WinCE OS中,ROM_based程式可以被指定位就地(Excute in Place)。也就是說,它們直接從ROM中執行而不是先載入RAM然後再執行。這樣不僅可以節省寶貴的Ram資源,而且程式啟動更快。不在ROM中的程式(在物件儲存空間裡的或者是在Flash記憶體中的)不能原地執行。

3.  虛擬記憶體。OS使用微處理的記憶體管理單元實時地把虛擬地址轉換到實體地址。

u  分頁記憶體(Paged Memory)。在WinCE OS下,一頁是1K或者4K,取決於微處理。 的ARM,一頁是4K。

u  虛擬頁面有三種狀態:未用的(free),保留的(reserved)和佔用的(committed)。一個free的頁面,顧名思義就是可以被分配的。一個reserved頁面就是已經被預定的,所以他的虛擬地址空間不能再分配給作業系統和這個程式的另一個執行緒。它的地址還未對映到物理空間。一個committed頁就是已經被一個程式保留了並且已經直接對映到了一個實體地址空間。

4.WinCE地址空間

u  為所有的應用程式實現單個的2GB的虛擬地址,但是每個應用程式的記憶體空間都是受保護的,以保證其他應用程式不能訪問。從最低的虛擬地址空間開始分為33個slot,每個slot32M。每個slot被分配為當前執行的程式。Slot 0中存放的當前啟用的程式。當winCE在程式間切換時,它就重新對映地址空間,把老程式移出,新程式移進slot 0。這個任務是透過操作微的頁轉換表來迅速完成的。

u  33個slot以上地址區域是為OS和對映記憶體對映檔案保留的。和一樣,winCE也保留了最低的64K地址空間,任何程式都不能訪問。

5.查詢系統記憶體。

u  GetSystemInfo(LPSYSTEM_INFO)

u  GlobalMemoryStatus(LPMEMORYSTATUS)(paging files are not supported under windows CE)

6.各種記憶體分配方式

u  首先是Virtualxxxx,用來預留,提交和釋放虛擬記憶體頁。然後是堆。堆使用該應用程式管理的保留記憶體空間區域。堆有兩種:預設的區域性堆和獨立堆。堆API下來是靜態資料,這些資料塊由定義並且在載入時自動分配。最後是棧,它存放應用程式中每個函式的區域性變數。

u  wince不支援全域性堆。因此全域性堆API,wince都不支援。

u  在wince中減少記憶體使用的關鍵是選擇恰當的記憶體分配策略。

6.1 虛擬記憶體

  它是記憶體型別中最基本的。系統可以虛擬記憶體API來為其他記憶體型別分配空間,比如堆,棧。VirtualAlloc,VirtualFree,VirtualResize函式直接在這個應用程式的虛擬記憶體空間裡操作虛擬記憶體頁。可以使用這些函式預留,提交和是否實體記憶體。(以頁為單位的,舍入到頁的界限)

6.2 堆

  顯然,以頁為單位分配記憶體對於大多數程式是低效的。而堆就可以以位元組為單位來申請和釋放記憶體。粒度比虛擬記憶體函式要小(至少4位元組)。系統會隨著所執行程式的需求自動增長堆的大小。當堆中的一些塊被釋放後,系統檢檢視是否整個頁都被釋放了,如果是的話,這個頁就被decommit。由於在一個堆上不斷地allocate和free,這個堆很可能被分割為一些碎片,或者有可能這個堆幾乎是空的,但是系統還是不能從這個堆中釋放 a page,除非它全空。

u  Local Heap。每個應用程式在啟動時都會建立一個預設的堆。可以使用LocalAlloc,LocalFree和LocalRealloc函式操作這個堆。

u  Separate Heaps。為了避免把堆分割成很多碎片,如果在一段時間裡需要一塊連續的塊空間的話,更好的方法是建立一個單獨的堆。實際申請空間時才對映實體地址空間,並不才建立時就保留或者提交任何記憶體。Destroy這個堆時並不要求裡面的資料塊都釋放了。

  6.3棧

預設一個棧空間最大是58K。當棧空間逐漸變小時,系統將進入低記憶體狀態。棧空間的最大值可以在連結時指定。可以指定到1M。注意:

u  預設棧空間大小也是所有其他獨立執行緒棧的大小。

u  如果沒有可用的物理RAM,需要棧空間的執行緒就會被掛起。如果在給定的一小段時間內,這個記憶體需求不能得到響應,就會彈出系統異常。在低記憶體情況下不應該嘗試使用大量的棧空間。

6.4 靜態資料

  預定義記憶體塊在程式載入時為它們自動分配空間。這些塊中的資料包含了靜態申請的字串,緩衝區,和全域性變數以及和這個應用程式靜態連結的函式庫。Wince為一個應用程式申請兩個RAM塊:一個用於存放Read/Write資料,一個用於存放只讀資料。由於這些區域都是以頁為單位來分配記憶體的,所以為了節省空間,儘量使靜態資料段接近但不能超過頁的範圍。如果在靜態資料段還有相當空間,可以把本來動態申請的一些緩衝區移到靜態資料區。有時根據具體情況可以把只讀資料區中的一些資料移到讀寫資料區。決定的方法是檢視map檔案。

7.在低記憶體情況下WinCE如何處理應用程式的記憶體請求。

當系統執行需要更多的記憶體,而又不能滿足的情況下,會自動關閉該應用程式。因此wince提供了一些方法來在所有正在執行的程式間分配寶貴的記憶體資源。

u  WM_訊息。OS首先向非活動狀態的程式傳送此訊息,請求它們在不破壞各自內在狀態情況下儘量釋放多的記憶體,比如釋放GDI物件,緩衝資料等等。

u  記憶體門檻(memory thresholds)。WinCE定義了四種記憶體狀態:normal, limited, low and critical。這些狀態的劃分主要取決於當前可用的記憶體大小。當可用記憶體很少時,系統首先傳送WM_HIBERNATE訊息,然後限制記憶體申請的請求。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-956749/,如需轉載,請註明出處,否則將追究法律責任。

相關文章