PSAPI在Windows2000和windows XP中都提供,它包含的函数能够使得获取进程或设备驱动的信息更加容易。在MSDN中可以查找到PSAPI的详细信息。这里以占用内存为例。
1. 进程占用内存结构是:

typedef struct _PROCESS_MEMORY_COUNTERS ...{
DWORD cb;
DWORD PageFaultCount;
SIZE_T PeakWorkingSetSize;
SIZE_T WorkingSetSize;
SIZE_T QuotaPeakPagedPoolUsage;
SIZE_T QuotaPagedPoolUsage;
SIZE_T QuotaPeakNonPagedPoolUsage;
SIZE_T QuotaNonPagedPoolUsage;
SIZE_T PagefileUsage;
SIZE_T PeakPagefileUsage;
} PROCESS_MEMORY_COUNTERS;
typedef PROCESS_MEMORY_COUNTERS *PPROCESS_MEMORY_COUNTERS;2. 打印内存占用的函数可以写为

bool PrintMemoryInfo( int stage/**//*DWORD processID*/ )
...{
PROCESS_MEMORY_COUNTERS pmc;
FILE* fp = fopen("MemoryUse.log", "at+");
switch(stage)
...{
case 0: fprintf(fp, " before working : ");
break;
case 1: fprintf(fp, " after initialed : ");
break;
case 2: fprintf(fp, " during running : ");
break;
case 10: fprintf(fp, " after finishing : ");
break;
}
if ( GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc)) )
...{
fprintf(fp, " PageFaultCount: %d ", pmc.PageFaultCount );
fprintf(fp, " PeakWorkingSetSize: %d M ", pmc.PeakWorkingSetSize/1024/1024 );
fprintf(fp, " WorkingSetSize: %d M ", pmc.WorkingSetSize/1024/1024 );
fprintf(fp, " QuotaPeakPagedPoolUsage: %d ", pmc.QuotaPeakPagedPoolUsage);
fprintf(fp, " QuotaPagedPoolUsage: %d ", pmc.QuotaPagedPoolUsage );
fprintf(fp, " QuotaPeakNonPagedPoolUsage: %d ", pmc.QuotaPeakNonPagedPoolUsage );
fprintf(fp, " QuotaNonPagedPoolUsage: %d ", pmc.QuotaNonPagedPoolUsage );
fprintf(fp, " PagefileUsage: %d M ", pmc.PagefileUsage/1024/1024 );
fprintf(fp, " PeakPagefileUsage: %d M ", pmc.PeakPagefileUsage/1024/1024 );
}
fclose(fp);
return true;
}
本文介绍如何使用Windows的PSAPI来获取进程内存信息,并通过示例代码展示了如何记录不同阶段的内存使用情况。

1647

被折叠的 条评论
为什么被折叠?



