Sprawdzanie zużycia pamięci + pagefile.sys

dział ogólny

Sprawdzanie zużycia pamięci + pagefile.sys

Nowy postprzez Jacek26jw » czwartek, 17 lipca 2008, 12:33

Witam, jak sprawdzić ilość zużytej pamięci przez własny program?
Coś podobnego do porady: Sprawdzanie zużycia pamięci przez procesy uruchomione w systemie
http://cyfbar.republika.pl/api3.html#api5
Tylko, że chcę sprawdzić całą pamięć, łącznie z użyciem pliku pagefile. Jak to zrobić?
Avatar użytkownika
Jacek26jw
Bladawiec
Bladawiec
 
Posty: 4
Dołączył(a): czwartek, 17 lipca 2008, 12:24
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: Sprawdzanie zużycia pamięci + pagefile.sys

Nowy postprzez Cyfrowy Baron » czwartek, 17 lipca 2008, 13:27

Co do zużycia pamięci przez program to wystarczyło przerobić nieco tamten program.

Masz tutaj przykład sprawdzania zużycia pamięci przez program, oprócz tego sprawdzana jest całkowita liczna pamięci oraz pozostała pamięć, a wszystko jest wyświetlane na TLabel - LabMem1, przykład dla pamięci RAM:
Kod: Zaznacz cały

float mem1 = 0, mem2 = 0, mem3 = 0;
  ShortString m = " MB";
  typedef BOOL (_stdcall *PGetProcessMemoryInfo)(HANDLE, void*, DWORD);

  PGetProcessMemoryInfo Memproc;
  HMODULE hMod;
  PROCESS_MEMORY_COUNTERS ProcMem;

  memset(&ProcMem, 0, sizeof(ProcMem));
  ProcMem.cb = sizeof(ProcMem);

  hMod = ::LoadLibrary("psapi.dll");

  if(!hMod) return;
  Memproc = (PGetProcessMemoryInfo)::GetProcAddress(hMod, "GetProcessMemoryInfo");
  if(!Memproc) return;
  if((*Memproc)(GetCurrentProcess(), &ProcMem, sizeof(ProcMem))) // kluczem jest GetCurrentProcess() - dotyczy procesu programu
   mem1 = ProcMem.WorkingSetSize / 1024.0 / 1001.5;
  FreeLibrary(hMod);


  TMemoryStatus *MS = new TMemoryStatus;
  MS->dwLength = sizeof(MEMORYSTATUS); // tego można nie stosować.
  GlobalMemoryStatus(MS);
  if(MS->dwTotalPhys >= 1048048048)
  {
   mem2 = MS->dwAvailPhys / 1024.0 / 1000.0;
   mem3 = MS->dwTotalPhys / 1024.0 / 1000.0 / 1000.0;
   m = " GB";
  }
  else
  {
   mem2 = MS->dwAvailPhys / 1024.0 / 1000.0;
   mem3 = MS->dwTotalPhys / 1024.0 / 1000.0;
   m = " MB";
  }
  delete MS;


  LabMem1->Caption = "(" + FloatToStrF(mem1, ffNumber, 7, 2) + " MB) " +
               FloatToStrF(mem2, ffNumber, 7, 0) + " MB/" +
               FloatToStrF(mem3, ffNumber, 7, 0) + m;
;


a tak wogóle to ► patrz serwis: Cyfrowy Baron dział: API | Sprawdzanie ile pamięci zużywa nasz program.

Co do drugiego pytania, to będę się musiał nad tym zastanowić, gdyż jeszcze nigdy tego nie sprawdzałem.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4730
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Sprawdzanie zużycia pamięci + pagefile.sys

Nowy postprzez Cyfrowy Baron » piątek, 18 lipca 2008, 10:46

:(( Strasznie mi głupio, gdyż przeoczyłem coś tak oczywistego! :oops:

Nie potrzebujesz żadnej nowej funkcji, gdyż ta którą podałem w serwisie ► patrz serwis: Cyfrowy Baron w poradzie: dział: API | Sprawdzanie ile pamięci zużywa nasz program. (44)
podaje wszystkie niezbędne informacje o zużyciu pamięci.



Kluczem jest struktura PROCESS_MEMORY_COUNTERS która przechowuje informacje:

    .PageFaultCount - liczba błędów strony
    .PageFileUsage - użycie pamięci wirtualnej, pliku wymiany
    .PeakPageFileUsage - maksymalna przestrzeń zarezerwowana w pliku wymiany
    .PeakWorkingSetSize - szczytowe użycie pamięci RAM
    .QuotaNonPagedPoolUsage - niestronicowana pula pamięci
    .QuotaPagedPoolUsage - stronicowana pula pamięci
    .QuotaPeakNonPagedPoolUsage - szczytowa niestronicowana pula pamięci
    .QuotaPeakPagedPoolUsage - szczytowa stronicowana pula pamięci
    .WorkingSetSize - użycie pamięci RAM



Kod: Zaznacz cały
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   typedef BOOL (_stdcall *PGetProcessMemoryInfo)(HANDLE, void*, DWORD);

   PGetProcessMemoryInfo Memproc;
   HMODULE hMod;
   PROCESS_MEMORY_COUNTERS ProcMem;

   memset(&ProcMem, 0, sizeof(ProcMem));
   ProcMem.cb = sizeof(ProcMem);

   hMod = ::LoadLibrary("psapi.dll");

  if(!hMod) return;
  Memproc = (PGetProcessMemoryInfo)::GetProcAddress(hMod, "GetProcessMemoryInfo");
  if(!Memproc) return;
  if((*Memproc)(GetCurrentProcess(), &ProcMem, sizeof(ProcMem)))
  {
     Label1->Caption = "Użycie pamięci: " +
             IntToStr(ProcMem.WorkingSetSize / 1024) + " KB RAM";
     Label2->Caption = "Rozmiar pamieci wirtualnej: " +
             IntToStr(ProcMem.PagefileUsage / 1024) + " KB";
   }

   FreeLibrary(hMod);
}
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4730
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Sprawdzanie zużycia pamięci + pagefile.sys

Nowy postprzez Jacek26jw » wtorek, 22 lipca 2008, 12:23

Dzięki, działa tak jak chciałem.
Tylko zastanawia mnie jeden fakt, że program od razu używa pliku pagefile (np. 5MB ram / 3 MB page).
Ale rozumiem, że Windows tak sobie robi: część wrzuca do ram a część do pagefile? Do tej pory myślałem, że pagefile jest używane tylko wtedy gdy brakuje pamięci.
Avatar użytkownika
Jacek26jw
Bladawiec
Bladawiec
 
Posty: 4
Dołączył(a): czwartek, 17 lipca 2008, 12:24
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: Sprawdzanie zużycia pamięci + pagefile.sys

Nowy postprzez Cyfrowy Baron » wtorek, 22 lipca 2008, 14:02

Niezupełnie.
Windows XP już na samym starcie wczytuje częściowo programy do pamięci wirtualnej (pagefile) jest to mechanizm przyspieszający uruchamianie aplikacji, ale nie tylko, w momencie uruchomienia programu do pamięci wirtualnej są wczytywane wszystkie biblioteki jakich ten program może potrzebować, nawet jeżeli z nich nie korzysta.

Jeśli komputerowi brakuje pamięci RAM i natychmiast potrzebuje jej więcej, system Windows używa dysku twardego do symulowania pamięci RAM. Jest to tzw. pamięć wirtualna, często zwana plikiem stronicowania. Przypomina on plik wymiany (swapfile) z systemu UNIX. Domyślny rozmiar pliku stronicowania pamięci wirtualnej (pagefile.sys) tworzonego podczas instalacji jest 1,5 raza większy niż ilość pamięci RAM komputera.
[...]
Można optymalizować wykorzystanie pamięci komputera. Jeśli komputer jest używany głównie jako stacja robocza, a nie serwer, można przydzielić więcej pamięci do obsługi programów. Programy będą działać szybciej, a pamięć podręczna systemu będzie mieć rozmiar domyślny określony w systemie Windows XP. Można także zarezerwować więcej pamięci komputera, aby mieć do dyspozycji większą ilość pamięci podręcznej systemu, jeśli komputer jest używany głównie jako serwer lub jeśli używane są programy wymagające większej pamięci podręcznej.


Ja mam np. 2 GB pamięci RAM, więc wogóle wyłączyłem plik wymiany, nie ma u mnie pagefile.sys, ale mimo to system tworzy sobie w obszarze pamięci RAM pamięć wirtualną i w chwili uruchomienia programu wczytuje część do pamięci RAM, a część do pamięci wirtualne.
Brak pliku wymiany ma tą zaletę, że programy uruchamiają się szybciej i szybciej działają, gdyż odczyt i zapis z/do pamięć RAM jest szybszy niż z dysku.
Testy u mnie wykazały że dane są odczytywane z dysku z prędkością 72 MB/s a z pamięci RAM 1800 MB/s więc RAM jest 25 razy szybszy.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4730
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana


Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 5 gości

cron