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通過截獲此異常,然後對比,儲存在某一記憶體的