1. 程式人生 > >Windows虛擬記憶體的使用(四)

Windows虛擬記憶體的使用(四)

鎖定頁面和解鎖頁面

1 通過呼叫VirtualLock方法,可以將頁面鎖定在實體記憶體中,從而防止虛擬記憶體管理機制將頁面交換至頁面檔案,而引起不必要的硬碟和實體記憶體之間的低效頁面交換。

2 通過呼叫VirtualUnlock方法,可以解鎖頁面,允許系統對頁面進行交換操作

3 鎖定頁面時系統會根據當前可用實際RAM情況,以及程序工作集配額判定當前最大可鎖定的頁面的實際數量,超過此數量會引起一個錯誤。

4 呼叫SetProcessWorkingSetSize可以改變一個程序工作集大小的配額,從而可以鎖定更多的物理頁面

5 當系統實體記憶體資源緊張時,慎用VirtualLock

6 VirtualLock鎖定的記憶體一定要記得用VirtualUnlock解鎖,防止耗盡實體記憶體情況的發生。

程式碼如下:

/************************************************************************/
/* 
程式說明:VirtualLock和VirtualUnlock的使用。
日期    :2014/12/29
*/
/************************************************************************/

#include "stdafx.h"
#include <windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
	SIZE_T miniWorkSet,maxWorkSet;
	GetProcessWorkingSetSize(GetCurrentProcess(),&miniWorkSet,&maxWorkSet);
	//設定程序的工作集配額
	SetProcessWorkingSetSize(GetCurrentProcess(),4*1024*1024,1024*1024*1024);
	//保留並提交記憶體
	void* pRecv = VirtualAlloc(NULL,1024*1024,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);

	//鎖定記憶體
	VirtualLock(pRecv,1024*1024);
	float*pFArray = (float*)pRecv;
	for (int i=0;i<(1024*1024)/sizeof(float);i++)
	{
		pFArray[i] = 1.0f*rand();
	}
	//解鎖記憶體
	VirtualUnlock(pRecv,1024*1024);
	VirtualFree(pRecv,0,MEM_RELEASE);
	return 0;
}

頁面保護狀態更改

1 使用VirtualProtect可以更改一組或個別頁面的保護屬性,也可以用來更改整個保留區域的保護屬性

2 使用VIrtualProtectEx可以跨進程序更改別的程序中的頁面保護屬性,前提是有操作許可權

3 C/C++中的const修飾符只能限定語法層面的只讀特性,在編譯做機器碼後即失效,同時通過強制型別轉換或指標等操作可在程式碼中改寫常量記憶體,因此這個常量僅僅是個說明而已。

4 使用VirtualProtect設定的虛擬記憶體只讀屬性,直接被硬體支援,是機器指令級別的常量特徵,要想改寫只讀頁面,立即會引起一個異常,從而可以攔截任何試圖改寫常量的任何操作。

/************************************************************************/
/* 
程式說明:VirtualProtect的使用
日期    :2014/12/29
*/
/************************************************************************/

#include "stdafx.h"
#include <windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
	//保留並提交記憶體
	void* pRecv = VirtualAlloc(NULL,1024*1024,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
	//記憶體寫入操作
	float*pFArray = (float*)pRecv;
	for (int i=0;i<(1024*1024)/sizeof(float);i++)
	{
		pFArray[i] = 1.0f*rand();
	}
//	更改保護屬性為只讀
	DWORD dwOldProtect = 0;
	VirtualProtect(pRecv,1024*1024,PAGE_READONLY,&dwOldProtect);
	//讀取所有值進行求和
	float fSum = 0.0f;
	for(int i=0;i<(1024*1024)/sizeof(float);i++)
	{
		fSum += pFArray[i];
	}
	//試圖寫入第1個元素,這樣將引起異常
	pFArray[0] = 0.0f;
	//釋放記憶體
	VirtualFree(pRecv,0,MEM_RELEASE);
	return 0;
}


相關推薦

自制Java虛擬-對象、new、invokespecial

utf pool tar 字節 can run 可見 frame 屬性 自制Java虛擬機(四)-對象、new、invokespecial 一、對象的表示 剛開始學Java的時候,圖書館各種教程,書名往往都是“Java面向對象高級編程”,通常作者都會與C++做個比較,列出的

初始化Windows虛擬KVM的網卡IP

KVM windows 網卡配置 新創建的Windows虛擬機如果不能通過DHCP獲取IP,我們就需要登錄到虛擬機內手動配置,很麻煩。這個工作能自動化最好,為Windows虛擬機進行初始化通常有兩種思路:1. 通過cloudbase-init,這個是cloud-init的

深入拆解虛擬機器JVM是如何執行方法呼叫的?

過載與重寫 (1)Java程式裡,如果同一個類出現多個名字相同,並且引數型別相同的方法,那麼它無法通過編譯 (2)在正常情況下,如果我們想要在同一個類中定義名字相同的方法,那麼它們的引數型別必須不同。這些方法之間的關係,我們稱之為過載 (3)選取過載方法的三個階段:

Linux虛擬記憶體swap調優篇-swappiness引數

                     Linux虛擬記憶體(swap)調優篇                                            作者:尹正傑 版權宣告:原創作品,謝絕轉載!否則將追究法律責任。     swappiness的值的大小對如何使用swap分

Windows網路程式設計:建立UDP連線和收發訊息

UDP訊息的傳送和接收需要UDP連線,所以,上面的TCP連線已經不適用了,具體的區別主要有: 建立Socket時引數不同建立服務端時不需要listen和accept操作建立客戶端時不需要connect操作伺服器需要bind操作,客戶端不需要。 傳送和接收UDP訊息要用到sendt

Windows驅動學習-- 雙機除錯

1. 概述 跟除錯應用層程式不同,驅動不穩定,可能會導致藍屏,所以我們不能在本機除錯。一般的操作是在一個虛擬機器中載入驅動,然後通過串列埠對該虛擬機器的驅動進行除錯。 2. 虛擬機器配置 2.1 開啟除錯選項 以管理員身份執行cmd。 鍵入bcdedit命令

深入理解Java虛擬機器——JVM效能調優監控工具

Jinfo 檢視正在執行的Java應用程式的擴充套件引數 檢視jvm的引數 檢視java系統引數 Jstat jstat命令可以檢視堆記憶體各部分的使用量,以及載入類的數量。命

Windows執行緒執行緒同步與互斥問題

執行緒同步與互斥的測試函式如下所示: #include <stdio.h> #include <process.h> #include <Windows.h> #define THREAD_NUM 10 unsigned long g_nNum

如何增加Ubuntu的虛擬記憶體

今日編譯某軟體系統時,出現如下錯誤: virtual memory exhausted: Cannot allocate memory  為解決此問題,找到如下解決方案。 1、開啟終端,切換到root使用者,輸入:free -m檢視記憶體狀態 [[email pr

深入理解JAVA虛擬機器虛擬機器類載入機制

虛擬機器把描述類的資料從Class檔案載入到記憶體,並對資料進行校驗、轉換解析和初始化,最終形成可以被虛擬機器直接使用的Java型別,這就是虛擬機器的類載入機制。在Java語言裡面,型別的載入、連線和初始化過程都是在程式執行期間完成的。 1、類載入的時機 類從被載入到虛擬機

Java程式設計師從笨鳥到菜鳥之九十五深入java虛擬機器——java虛擬機器的垃圾回收機制

         Java語言從出現到現在,一直佔據程式語言前列,他很大的一個原因就是由於java應用程式所執行的平臺有關。我們大家都知道java應用程式執行在java虛擬機器上。這樣就大大減少了java應用程式和底層作業系統打交道的頻率。這也就為java程式的跨平臺提供了良好的基礎。在java虛擬機器中

Java虛擬機器:Class檔案結構及位元組碼指令

    接下來的兩個位元組為this_class項,它是一個對常量池的索引。在this_class位置的常量池入口必須為CONSTANT_Class_info表。該表由兩個部分組成——標籤和name_index。標籤部分是一個具有CONSTANT_Class值的常量,在name_index位置的常量池入口為一

android修改虛擬記憶體方法

如果有理有原始碼的話, 修改:out/target/product/xxx/system/build.prop檔案 dalvik.vm.heapstartsize=12m         --------------->應用啟動,立馬分屏12M記憶體 da

讀懂作業系統之虛擬記憶體

前言 由於個人對虛擬記憶體這塊特別感興趣,所以就直接暫且跳過其他,接下來將通過幾篇文章進行詳細講解,當然其他基礎內容後續在我進行相應整體學習後也會同步輸出文章,比如作業系統概念、程式連結、程序管理、頁面置換演算法、流水線、浮點指令、記憶體管理、磁碟管理等內容。不管周遭的環境如何,畢竟還很菜,堅持每天讓自己進步

Windows虛擬記憶體的使用

鎖定頁面和解鎖頁面 1 通過呼叫VirtualLock方法,可以將頁面鎖定在實體記憶體中,從而防止虛擬記憶體管理機制將頁面交換至頁面檔案,而引起不必要的硬碟和實體記憶體之間的低效頁面交換。 2 通過呼叫VirtualUnlock方法,可以解鎖頁面,允許系統對頁面進行交換操作

Windows核心基礎虛擬記憶體空間佈局

32位Windows作業系統支援32位定址,因此2的32次方就等於4GB,每個程式在執行時都會被對映進4GB空間的記憶體空間,這4GB空間不全是使用者可以使用的,其中0x7fffffff-0xffffffff是2GB的核心空間,這部分用來儲存核心的資料,使用者程式是無法直接訪問的。

深入理解java虛擬機器之自動記憶體管理機制

記憶體分配與回收策略 (一)記憶體分配策略     給誰分配?分配到哪?是記憶體分配策略必須解答的問題。     java物件是分配的物件,往大方向來說,是分配到堆中,更細一點說,根據物件不同的特點分配到新生代和老年代區域。如果啟動了本地執行緒分配緩衝,就按執行緒優先在TLAB上分配。     一、新

Windows虛擬記憶體的使用

 VirtualQuery的使用 VirtualQuery函式可以查詢本程序地址空間中記憶體區域的詳細情況(區域大小,區域內容等資訊) 函式原型:DWORD VirtualQuery(LPVOID lpAddress,PMEMORY_BASIC_INFORMATION

HTML/CSS 虛擬碼可能導致記憶體越界或者丟擲異常

答案為B, 因為while(page.taglst[i] == "<br>" && i < taglen)這個判斷,先執行page.taglst[i]

Windows記憶體詳解OD記憶體斷點初步分析

記憶體斷點原理:        記憶體斷點原理,通過將記憶體斷點所在記憶體頁的屬性修改為記憶體斷點屬性(non-access or non-writable),程式執行時,對目標記憶體頁中所有資料的訪問或寫,都會丟擲異常,OD通過截獲此異常,然後對比,儲存在某一記憶體的