新聞中心

WinCE中的paging pool

作者: 時(shí)間:2016-10-08 來(lái)源:網(wǎng)絡(luò) 收藏

我們知道,在Config.bib配置中,RAM指定的內(nèi)存區(qū)域會(huì)被劃分為程序內(nèi)存和對(duì)象存儲(chǔ)。但在使用paging pool時(shí),RAM段要減去paging pool的大小,剩余空間再劃分為程序內(nèi)存和對(duì)象存儲(chǔ)。其中程序內(nèi)存主要為正在運(yùn)行的程序保存堆和棧的內(nèi)容。

本文引用地址:http://2s4d.com/article/201610/305907.htm

那么paging pool是什么呢,使用paging pool有什么好處呢?在查閱了相關(guān)資料后談?wù)勎业囊稽c(diǎn)認(rèn)識(shí),如有錯(cuò)誤,也希望批評(píng)指正。(其中參考了Sue Loh的《Paging and the Windows CE Paging Pool》一文,有興趣的可以看一下。)

先看一下paging pool的概念。Paging pool是RAM中reserved的一塊區(qū)域。用于存放pageale data(只讀的可執(zhí)行文件的代碼,數(shù)據(jù)以及內(nèi)存映射文件)。如果使用paging pool就會(huì)給pageale data所使用的內(nèi)存設(shè)定限制,它還包括將pagable data從內(nèi)存移出的算法機(jī)制。

在WinCE3.0以前的系統(tǒng),并沒(méi)有使用paging pool。這意味著系統(tǒng)對(duì)保存pageable data所使用的RAM沒(méi)有限制。那么如果運(yùn)行大量的程序或訪問(wèn)大量的內(nèi)存映射文件時(shí),內(nèi)存使用率就會(huì)大大增加,直到系統(tǒng)耗盡內(nèi)存,這時(shí)再分配內(nèi)存就會(huì)失敗??雌饋?lái)好像內(nèi)存真的用完了,但實(shí)際上還存在大量可以通過(guò)page data out從而釋放的空間。最后,當(dāng)系統(tǒng)到達(dá)一個(gè)最低內(nèi)存限制時(shí),kernel就會(huì)把所有的pageble的數(shù)據(jù)全部page out。這樣突然間系統(tǒng)就會(huì)出現(xiàn)大量可用內(nèi)存,你要使用的數(shù)據(jù)就會(huì)通過(guò)產(chǎn)生page fault重新page in到內(nèi)存。但這樣會(huì)帶來(lái)系統(tǒng)的不穩(wěn)定。

因此WinCE引入了paging pool。The paging pool limits an amount of pageable memory system can has so it would be less thrashing prone. 使用paging pool,會(huì)設(shè)置有限的RAM用于存放pageable的data。Pool的size設(shè)置太小,這意味著pages可能會(huì)被過(guò)早地page out,盡管他們?nèi)匀辉谑褂?,從而引起頻繁的page fault。Pool大小設(shè)置得太大,這意味著操作系統(tǒng)將保留更多的內(nèi)存用于pageable data。這樣就會(huì)減少page faults ,因?yàn)楦嗟拇a存儲(chǔ)在paging pool中。但Pool內(nèi)存將無(wú)法被應(yīng)用程序使用。

在CE 6.0中,虛擬內(nèi)存的架構(gòu)改變了,涉及Windows CE的存儲(chǔ)系統(tǒng)的重寫,包括paging pool。CE 6.0的paging pool原理仍然相當(dāng)簡(jiǎn)單,但有一點(diǎn)更加靈活。CE 6.0有兩個(gè)paging pools:loader pool用來(lái)存放可執(zhí)行代碼,file pool用于存放所有file-backed memory-mapped文件和CE6.0新增的文件cache過(guò)濾器,或者叫cache管理器。以這種方式,OEMs不但可以設(shè)置只讀數(shù)據(jù)的內(nèi)存使用量,而且可以設(shè)置read-write數(shù)據(jù)的內(nèi)存使用量了。并且可以分別為代碼和數(shù)據(jù)設(shè)置內(nèi)存使用的限制。

這兩個(gè)pool有幾個(gè)參數(shù)。主要的參數(shù)是target size和maximum size。原理是操作系統(tǒng)總會(huì)保證pool擁有至少target數(shù)量的內(nèi)存使用。如果有多余的可用內(nèi)存,內(nèi)核允許pool占有多于target的內(nèi)存。但是當(dāng)這種情況發(fā)生時(shí),內(nèi)核會(huì)喚醒一個(gè)低優(yōu)先級(jí)的線程去page out一些數(shù)據(jù),重新使pool慢慢降到target以下。采用這種方式,在busy “spikes”內(nèi)存使用時(shí),比如系統(tǒng)啟動(dòng),系統(tǒng)會(huì)占用相當(dāng)多的內(nèi)存用來(lái)存放pagable data。但是在steady-state,系統(tǒng)的pool內(nèi)存使用量在target上下徘徊。Maximum size為內(nèi)存消耗設(shè)置了硬性的限制。OEMs可以把這個(gè)maximum設(shè)的很大從而避免pool的限制。OEMs也可以把target和maximum大小設(shè)置的相同,從而獲取CE6之前的版本的paging pool的效果。

paging和paging pool是獨(dú)立的。不管是不是paging pool都會(huì)發(fā)生paging。如果你關(guān)閉了paging pool,你也就關(guān)掉了用于paging的RAM的限制。但是pages仍然可以paging。如果你打開了paging pool,那么就會(huì)有限制。只不過(guò)對(duì)于paging pool,page in的data還可以page out。而對(duì)于非paging pool中的data則不會(huì)被page out。

ROM中的中的FILES中可執(zhí)行文件的code和只讀data將會(huì)使用pool??蓤?zhí)行文件中的R/W data不能被page out,所以不會(huì)使用paging pool。MODULES中的壓縮的可執(zhí)行文件中的code和只讀data也會(huì)使用pool。如果Image是從NOR或者RAM運(yùn)行,MODULES中未壓縮的可執(zhí)行文件將直接運(yùn)行,而不使用pool。NAND中Image中MODULES中的可執(zhí)行文件將會(huì)使用pool。

如果可執(zhí)行文件被標(biāo)志為“non-pagable”,則在加載時(shí)就會(huì)被page到RAM中,不會(huì)被page out,直到被卸載。這些Pages不使用pool。你也可以創(chuàng)造些“partially pagable”的可執(zhí)行文件,通過(guò)告訴linker使部分sections non-pagable。一般如果code和data是ISR的一部分,或者在suspend/resume時(shí)被調(diào)用,或被其他電源管理調(diào)用,就不能是pagable的,因?yàn)閜aging會(huì)造成系統(tǒng)崩潰或死鎖。如果code和data被IST訪問(wèn)也不能是pagable,因?yàn)閜aging會(huì)影響實(shí)時(shí)性。

RAM-backed的內(nèi)存映射文件不會(huì)使用Pool。在CE5或更老的版本中,只讀的file-back mapfiles會(huì)使用Pool而R/W mapfiles不使用。在CE6中,所有的file-backed mapfiles都使用file pool。并且新的file cache filter(cache manager)會(huì)映射所有打開的文件,所以cached file data也使用pool。

在CE5.0中,如果想使用paging pool,只需在Config.bib中定義如下:

#define PAGINGPOOLSIZE 00500000

cbNKPagingPoolSize 00000000 $(PAGINGPOOLSIZE) FIXUPVAR

即把paging pool的size設(shè)置為5MB。如果設(shè)置為0或者不設(shè)置的話,就沒(méi)打開paging pool,沒(méi)有對(duì)存放pageable的data和code的RAM的限制,效果和上面談到的WinCE3.0之前沒(méi)有paging pool時(shí)一樣。不過(guò)建議使用paging pool。Pool的size設(shè)置是個(gè)難題,過(guò)大過(guò)小都不合適。不過(guò)在CE 6.0中,如果將size設(shè)置為0的話,系統(tǒng)就會(huì)自動(dòng)調(diào)節(jié)cbNKPagingPoolSize,這樣就比較方便了。

本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/flyalice/archive/2009/02/16/3897253.aspx



關(guān)鍵詞:

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉