MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Как посмотреть когда переменная находится в файле подкачки а когда в оперативной памяти?"
Answer 925821
В Windows для этого существует функция QueryWorkingSetEx. "Working set" - это набор страниц виртуальной памяти, загруженных в данный момент в физическую память. Если заданный адрес в него не попадает, то в результате QueryWorkingSetEx для него значение флага Valid будет равно нулю, если попадает - единице.
Пример на С++:
#include <windows.h> #include <stdio.h> #include <psapi.h> bool IsInPhysicalMemory(PVOID address){ const UINT FLAG_VALID = 0x1; PSAPI_WORKING_SET_EX_INFORMATION info = {0}; info.VirtualAddress = address; BOOL bResult = QueryWorkingSetEx(GetCurrentProcess(),(PVOID)&info,sizeof(info)); if(bResult == FALSE) {printf("QueryWorkingSetEx failed: %d\n",(int)GetLastError());return false;} return ((info.VirtualAttributes.Flags & FLAG_VALID) == FLAG_VALID); } int x = 1; int main(int argc, char* argv[]) { //... bool bResult = IsInPhysicalMemory((PVOID)&x); if(bResult == false) printf("In pagefile\n"); else printf("In physical memory\n"); //... }
Пример на C# (требует включения unsafe-кода):
using System; using System.Text; using System.Runtime.InteropServices; namespace ConsoleApp1 { unsafe class Program { [DllImport("kernel32.dll")] static extern IntPtr GetCurrentProcess(); [DllImport("Psapi.dll")] static extern int QueryWorkingSetEx( IntPtr hProcess, [In, Out] ref PSAPI_WORKING_SET_EX_INFORMATION pv, uint cb); public struct PSAPI_WORKING_SET_EX_INFORMATION { public IntPtr VirtualAddress; public IntPtr VirtualAttributes; }; public static bool IsInPhysicalMemory(IntPtr address) { PSAPI_WORKING_SET_EX_INFORMATION info = new PSAPI_WORKING_SET_EX_INFORMATION(); info.VirtualAddress = address; int iResult = QueryWorkingSetEx(GetCurrentProcess(), ref info, (uint)Marshal.SizeOf(info)); if (iResult == 0) throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error()); return (((Int64)info.VirtualAttributes & 0x1) == 0x1); } static int y = 1; static void Main(string[] args) { //... fixed (int* p = &y) { if (IsInPhysicalMemory((IntPtr)p)) Console.WriteLine("In physical memory"); else Console.WriteLine("In pagefile"); } //... } } }
Можно ли задать адрес переменной,а потом по ходу программы смотреть находится ли эта переменная по заранее заданному адресу в оперативной памяти(на c# с помощью .Net). И соответственно если ее не будет в оперативной памяти, то она находится в файле подкачки. Так ли работает адрес у переменной, или он не меняется вне зависимости от того где находится?
Обычно да, адрес переменной в виртуальной памяти фиксирован и не меняется в ходе работы программы. (В C# переменные, которые хранятся в управляемой куче, имеют переменный адрес, но это связано с деятельностью сборщика мусора, а не с перемещением в файл подкачки.)
Адрес страницы в физической памяти, соответствующей данному адресу в виртуальной памяти, конечно меняется в ходе того как ОС перемещает страницы. Соответствие физического и виртуального адреса можно получить в windbg в режиме отладки ядра (см. vtop), но программно в usermode, насколько я знаю, нельзя.
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.