windows提供了3種進行記憶體管理的方法:
• 虛擬記憶體,最適合用來管理大型物件或結構陣列。
• 記憶體對映檔案,最適合用來管理大型資料流(通常來自檔案)以及在單個計算機上執行的多個程序之間共享資料。
• 記憶體堆疊,最適合用來管理大量的小物件。
pvoid virtualalloc(
pvoid pvaddress,
size_t dwsize,
dword fdwallocationtype,
dword fdwprotect);
第乙個引數pvaddress包含乙個記憶體位址,用於設定想讓系統將位址空間保留在什麼地方。
如果在特定的位址上不存在空閒區域,或者如果空閒區域不夠大,那麼系統就不能滿足你的要求,virtualalloc函式返回null。注意,為pvaddress引數傳遞的任何位址必須始終位於程序的使用者方式分割槽中,否則對virtualalloc函式的呼叫就會失敗。
位址空間區域總是按照分配粒度的邊界來保留的(迄今為止在所有的windows環境下均是64kb)。
第二個引數是dwsize,用於設定想保留的區域的大小(以位元組為計量單位)。由於系統保留的區域始終必須是cpu頁面大小的倍數。
第三個引數是fdwallocationtype,它能夠告訴系統你想保留乙個區域還是提交物理儲存器(這樣的區分是必要的,因為virtualalloc函式也可以用來提交物理儲存器)。若要保留乙個位址空間區域,必須傳遞mem_reserve識別符號作為fdwallocationtype引數的值。
如果保留的區域預計在很長時間內不會被釋放,那麼可以在盡可能高的記憶體位址上保留該區域。這樣,該區域就不會從程序位址空間的中間位置上進行保留。因為在這個位置上它可能導致區域分成碎片。如果想讓系統在最高記憶體位址上保留乙個區域,必須為pvaddress引數fdwallocationtype 引數傳遞null,還必須逐位使用or 將mem_top_down標誌和mem_reserve標誌連線起來
最後乙個引數是fdwprotect,用於指明應該賦予該位址空間區域的保護屬性。與該區域相關聯的保護屬性對對映到該區域的已提交記憶體沒有影響。
當保留乙個區域時,應該為該區域賦予乙個已提交記憶體最常用的保護屬性。例如,如果打算提交的物理儲存器的保護屬性是page_readwrite(這是最常用的保護屬性),那麼應該用page_readwrite保護屬性來保留該區域。當區域的保護屬性與已提交記憶體的保護屬性相匹配時,系統儲存的內部記錄的執行效率最高。
可以使用下列保護屬性中的任何乙個: page_noaccess、page_readwrite、page_readonly、page_execute、page_execute_read或page_execute _readwrite。但是,既不能設定page_writecopy屬性,也不能設定page_execute_writecopy屬性。如果設定了這些屬性,virtualalloc函式將不保留該區域,並且返回null。另外,當保留位址空間區域時,不能使用保護屬性標誌page_guard,page_nocache或page_writecombine,這些標誌只能用於已提交的記憶體。
當保留乙個區域後,必須將物理儲存器提交給該區域,然後才能訪問該區域中包含的記憶體位址。物理儲存器總是按頁面邊界和頁面大小的塊來提交的。
若要提交物理儲存器,必須再次呼叫virtualalloc函式, fdwallocationtype引數傳遞的是mem_commit, 不必立即將物理儲存器提交給整個區域(可以先提供一部分)。
同乙個記憶體頁面的不同部分不能使用不同的保護屬性。然而,區域中的乙個頁面可以使用一種保護屬性(比如page_readwrite),而同乙個區域中的另乙個頁面可以使用不同的保護屬性(比如page_readonly)。
pvoid pvmem = virtualalloc(null, 99 * 1024,
mem_reserve | mem_commit, page_readwrite);
bool virtualfree(
lpvoid pvaddress,
size_t dwsize,
dword fdwfreetype);
引數pvaddress:必須是該區域的基位址。此位址與該區域被保留時virtualalloc函式返回的位址相同。
引數dwsize:系統知道在特定記憶體位址上的該區域的大小,因此可以為dwsize引數傳遞0。實際上,必須為dwsize引數傳遞0,否則對virtualfree的呼叫就會失敗。
引數fdwfreetype:必須傳遞mem_release,以告訴系統將所有對映的物理儲存器提交給該區域並釋放該區域。
當釋放乙個區域時,必須釋放該區域保留的所有位址空間。例如不能保留乙個128 kb的區域,然後決定只釋放它的64 kb。必須釋放所有的128 kb。
當想要從乙個區域**某些物理儲存器,但是卻不釋放該區域時,也可以呼叫virtualfree函式。
若要**某些物理儲存器,必須在virtualfree函式的pvaddress引數中傳遞用於標識要**的第乙個頁面的記憶體位址,還必須在dwsize引數中設定要釋放的位元組數,並在fdwfreetype引數中傳遞mem_decommit標誌。
與提交物理儲存器的情況一樣,**時也必須按照頁面的分配粒度來進行。這就是說,設定頁面中間的乙個記憶體位址就可以**整個頁面。當然,如果pvaddress + dwsize的值位於乙個頁面的中間,那麼包含該位址的整個頁面將被**。因此位於pvaddress 至pvaddress +dwsize範圍內的所有頁面均被**。
windows 虛擬記憶體
虛擬記憶體的實現方法和過程 1 當乙個應用程式被啟動時,作業系統就建立乙個新的程序,被給每個程序分配2gb的虛擬位址 不是記憶體,只是位址 2 虛擬記憶體管理器將應用程式的 對映到那個那個應用程式的虛擬位址中的某個位置,並把當前所需要的 讀取到實體地址中 注意 虛擬位址和應用程式 的實體地址記憶體中...
《Windows核心程式設計》筆記 虛擬記憶體 記憶體
1 32位系統支援的最大位址空間4gb 2 32 為何是4gb而不是4gb呢?因為最小儲存單元是byte 這個是由系統決定,有些系統可能不一樣 由上可知 記憶體條容量大於4gb時,32位系統可能會浪費記憶體。記憶體條小於4gb時,32位系統支援的最大定址空間由記憶體條容量決定。2 虛擬記憶體是為了擴...
windows虛擬記憶體(win32)
windows是乙個以虛擬記憶體為基礎的作業系統。在這種系統環境下,windows記憶體管理器經常在記憶體中來回移動物件,依此來 滿足各種應用程式的記憶體需要。物件被移動意味著它的位址變化了。如果位址總是如此變化,我們該到 去找物件呢?為了解決這個問題,windows作業系統為各應用程式騰出一些記憶...