Windows核心編程學習筆記–第15章

來源:互聯網
上載者:User

第15章在應用程式中使用虛擬記憶體

        
Windows提供了三種機制來對記憶體進行操控。

Ø  虛擬記憶體:最適合用來管理大型物件數組或大型結構數組。----本章討論

Ø  記憶體對應檔:最合適用來管理大型資料流(通常是檔案),以及在同一機器上啟動並執行多個進程之間共用資料。----16章

Ø  堆:最適合用來管理大量的小型對象。----17章

再強調一次:虛擬記憶體最適合用來管理大型數組,無論是對象資料還是結構數組。

15.1預定地址空間地區

PVOID   VirtualAlloc(

PVOID  pvAddress,//NULL即可。

SIZE_T  dwSize,//想要預定地區的大小,位元組為單位。因系統始終根據CPU頁面大小的整數倍來預定地區,因此若在頁面大小為4KB的機器上預定62KB大小的地區的話,最終得到的地區大小為64KB(4的整數倍)。

DWORD  fdwAllocationType,//指明是預定地區還是調撥實體儲存體器。MEM_RESERVE用來預定地址空間地區。

DWORD  fdwProtect);//給地區指定保護屬性,一般為PAGE_READWRITE。地區的保護屬性和實體儲存體器的保護屬性無關。未給地區調撥實體儲存體器時,試圖訪問地區內的任何記憶體位址都會引發訪問違規。

傳回值:成功返回預定地區的基地址,失敗NULL。

15.2給地區調撥實體儲存體器

         預定地區後,需給地區調撥實體儲存體器,這樣才可訪問其中的記憶體位址。調撥實體儲存體器時,起始地址始終都是頁面大小的整數倍,整個大小也是頁面大小的整數倍。

         通過VirtualAlloc,第三個參數用MEM_COMMIT。對在已預訂的地區中,必須告訴VirtualAlloc要調撥多少實體儲存體器給哪裡。通過pvAddress(想調撥實體儲存體器給哪個記憶體位址)和dwSize(實體儲存體器的數量,以位元組為單位。8位(bit)=1位元組(Byte),1024位元組=1KB)來指定。此種方式用於對大型數組的操作。對不是在已預訂地區中調撥,即直接調撥時,不必指明記憶體位址。當然更不必先預訂虛擬記憶體了。

15.3同時預定和調撥實體儲存體器

         需給第三個參數傳入MEM_RESERVE | MEM_COMMIT

15.4何時調撥實體儲存體器

         對一個試算表,若它支援200行、256列。對每個儲存格,我們需要一個CELLDATA結構來描述儲存格的內容。對二維數組儲存格最簡單的操作方法,莫過於聲明如下變數:CELLDATA 
CellData[200][256];若CELLDATA  結構大小為128位元組,則此二維數組需要200*256*128位元組的實體儲存體器。而對一個試算表,大多數使用者只會用到少數幾個儲存格,有沒有覺得很浪費?

         若用鏈表方式,當試算表的某個儲存格中確實存放了資料時,才需建立與之對應的CELLDATA結構。節省大量實體儲存體器,但增大了讀取儲存格內容的難度,每次都得遍曆。

         虛擬記憶體技術提供了一種折中方案:

1) 
預定一塊足夠大地區來容納CELLDATA結構的整個數組。只預定地區不會消耗實體儲存體器。

2) 
當使用者在某個儲存格中輸入資料時,首先確定CELLDATA結構在地區中的記憶體位址。因還未給地址映射實體儲存體器,因此訪問該記憶體位址將引發訪問違規。

3) 
給第2步中的記憶體位址調撥實體儲存體器。

4) 
設定CELLDATA結構的成員。

存在的問題:必須確定什麼時候需要調撥實體儲存體器。若只是編輯或修改儲存格中資料,就不必再調撥實體儲存體器。有兩種方式可確定是否需要給地區中某一部分調撥實體儲存體器:

1) 
總是調撥實體儲存體器。若已調撥,系統將不再調撥,返回NULL。

2) 
使用結構化異常處理(SEH)------最佳方案。23-25章講。

15.5撤銷調撥實體儲存體器及釋放地區

BOOL  VirtaulFree(

         LPVOID  pvAddress,

         SIZE_T  dwSize,

         DWORD fdwFreeType);

         dwSize為0而pvAddress又是地區的基地址(即預訂地區時VirtualAlloc返回的地址),則VirtaulFree會釋放整個地區及調撥給該地區的實體儲存體器。第三個參數為MEM_RELEASE,告訴系統釋放為該地區預訂的所有地址空間。

         若想撤銷調撥給地區的一部分實體儲存體器,但又不想釋放整個地區,則需指定記憶體位址給pvAddress,用來告訴系統想撤銷調撥的第一個頁面的地址;dwSize中指定想要釋放的實體儲存體器的大小;並傳MEM_DECOMMIT給第三個參數。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.