虛擬記憶體使用一、
簡介windows
提供了3
中進行記憶體管理的方法,包括:
虛擬記憶體:一般用來管理大型資料結構,受到硬碟調頁檔案的支援
記憶體對映檔案:常用來管理大型資料流和多程序共享。
記憶體堆:最適合用來管理大量的小物件。
二、虛擬記憶體的使用
1、我們可以在程序的位址空間中保留乙個區域:
pvoid virtualalloc(
pvoid pvaddress,
需要保留的位址
size_t dwsize,
需要保留的位址大小
dword fdwalloccationtype,
是保留還是提交
dword fdwprotect);
保留頁面的訪問屬性
第乙個引數用於設定讓系統位址將位址空間保留在什麼地方,一般情況下,可將該引數設定位
null
,此時,系統將自動尋找適合的位址空間並保留之。
2、提交區域
提交記憶體區域也是通過
virtualalloc
函式來實現的,只是在
fdwalloccationtype
引數中傳遞
mem_commit
引數。注:在提交保留的記憶體時,可以只提交被保留記憶體的一部分。
3、同時保留並提交記憶體
同時保留並提交記憶體同樣通過
virtualalloc
函式來實現的,只是在
fdwalloccationtype
引數中傳遞
mem_reserve | mem_commit
引數。4、
**虛擬記憶體
**對映到乙個區域的物理儲存區,或者是否這個位址空間區域,可通過呼叫
virtualfree
函式。bool virtualfree(
lpvoid pvaddress,
需要釋放的位址
size_to dwsize,
需要釋放的空間大小,必須設定為
0
dword fdwfreetype);
必須傳遞
mem_release
5、取消提交虛擬記憶體
當想要從乙個區域**某些物理儲存器,但卻不釋放該區域時,可呼叫
virtuallfree
函式來取消虛擬記憶體的提交
此時必須設定需要釋放的空間大小,並傳遞
mem_decommit
給fdwfreetype
引數。6、
改變保護屬性
我們可以通過
virtualprotect
函式來改變已經提交的物理儲存器的乙個或多個頁面的保護屬性。
bool virtualprotect(
pvoid pvaddress,
需要修改保護屬性的位址
size_t dwsize,
需要修改保護屬性的大小
dword flnewprotect,
新的保護屬性
pdword pfloldprotect);
舊的保護屬性
三、測試程式
#include
#include
#include
using
namespace
std;
void
virtualmemorystatus(pvoid ptr);
void
main()
/*檢視給定虛擬位址狀態函式*/
void
virtualmemorystatus(pvoid ptr)
case
mem_reserve:
case
mem_commit:
}
cout << "/t";
switch
(memorybasicinfo->allocationprotect)
case
page_readonly:
case
page_readwrite:
case
page_execute:
case
page_execute_read:
case
page_execute_readwrite:
}
cout << "/t";
switch
(memorybasicinfo->protect)
case
page_readonly:
case
page_readwrite:
case
page_execute:
case
page_execute_read:
case
page_execute_readwrite:
}
cout << "/t";
switch
(memorybasicinfo->type)
case
case
mem_private:
}
cout << endl;
}執行結果:
003a
0000
003a
00008192reserve rwprivate
003a
0000
003a
00004096commit
rwrprivate
003a
0000
003a
00004096commit
rwrwprivate
this is test the commit virtual memort !
003a
1000
003a
00004096reserve rwprivate
003a
0000
003a
00008192reserve rwprivate
003a
0000
00000000393216free
n
如何合理使用虛擬記憶體
觀點一 對於擁有大容量物理記憶體的使用者,可以完全禁用虛擬記憶體。要徹底了解這個問題,首先得明白什麼是虛擬記憶體,以及虛擬記憶體有什麼作用。在早期,因為記憶體 非常昂貴,因此一般電腦上都不會配置太多,那麼有時候如果作業系統和應用程式需要的記憶體數量超過了計算機中安裝的物理記憶體數量,作業系統就會暫時...
redis虛擬記憶體的使用
redis的虛擬記憶體與作業系統的虛擬記憶體不是一回事,但是思路和目的都是相同的。就是暫時把不經常訪問的資料從記憶體交換到磁碟中,從而騰出寶貴的記憶體空間用於其他需要訪問的資料。尤其是對於redis這樣的記憶體資料庫,記憶體總是不夠用的。除了可以將資料分割王到多個redis server外。另外能夠...
虛擬記憶體應用
虛擬記憶體的重要性體現在下面幾個方面 1 虛擬記憶體可以對映到硬碟,以達到擴充套件記憶體的作用,這樣系統在物理記憶體已經用滿的情況下,就不會因為沒有記憶體可用,而導致系統崩潰。2 虛擬記憶體是以程序空間為定址空間的,一般情況,程序使用者模式下的定址空間 是2g,為了避免記憶體的碎片,可以把2g程序空...