如何从进程内部确定CPU和内存消耗?

如何从进程内部确定CPU和内存消耗?

我曾经负责从运行中的应用程序中确定以下性能参数:

  • 可用虚拟内存总量
  • 当前使用的虚拟内存
  • 我的进程当前使用的虚拟内存
  • 可用内存总数
  • Ram目前使用
  • 我的进程目前使用的RAM
  • 目前使用的CPU百分比
  • 我的进程当前使用的CPU%

代码必须在Windows和Linux上运行。尽管这似乎是一项标准任务,但在手册(Win 32 API,GNU docs)中以及在Internet上找到必要的信息花了我几天的时间,因为关于这个主题有很多不完整/不正确/过时的信息要找出来。

为了避免其他人经历同样的麻烦,我认为收集所有零散的信息,再加上我在一个地方经过反复试验发现的信息,是个好主意。


慕桂英546537
浏览 931回答 3
3回答

侃侃无极

窗上面的一些值很容易从适当的Win 32 API中获得,我只是在这里列出它们的完整性。然而,另一些则需要从性能数据帮助库(PDH)中获得,这有点“不直观”,需要大量痛苦的尝试和错误才能开始工作。(至少花了我一段时间,也许我只是有点傻.)注意:为了清楚起见,以下代码省略了所有错误检查。检查返回码.!总虚拟内存:#include&nbsp;"windows.h"MEMORYSTATUSEX&nbsp;memInfo;memInfo.dwLength&nbsp;=&nbsp;sizeof(MEMORYSTATUSEX);GlobalMemoryStatusEx(&memInfo); DWORDLONG&nbsp;totalVirtualMem&nbsp;=&nbsp;memInfo.ullTotalPageFile;注意:这里的名字“TotalPageFile”有点误导。实际上,这个参数给出了“虚拟内存大小”,即交换文件加上已安装RAM的大小。当前使用的虚拟内存:与“总虚拟内存”中的代码相同,然后DWORDLONG&nbsp;virtualMemUsed&nbsp;=&nbsp;memInfo.ullTotalPageFile&nbsp;-&nbsp;memInfo.ullAvailPageFile;当前进程当前使用的虚拟内存:#include&nbsp;"windows.h"#include&nbsp;"psapi.h"PROCESS_MEMORY_COUNTERS_EX&nbsp;pmc;GetProcessMemoryInfo(GetCurrentProcess(),&nbsp; &pmc,&nbsp;sizeof(pmc));SIZE_T&nbsp;virtualMemUsedByMe&nbsp;=&nbsp;pmc.PrivateUsage;总物理内存(RAM):与“总虚拟内存”中的代码相同,然后DWORDLONG&nbsp;totalPhysMem&nbsp;=&nbsp;memInfo.ullTotalPhys;目前使用的物理内存:Same&nbsp;code&nbsp;as&nbsp;in&nbsp;"Total&nbsp;Virtual&nbsp;Memory"&nbsp;and&nbsp;thenDWORDLONG&nbsp;physMemUsed&nbsp;=&nbsp;memInfo.ullTotalPhys&nbsp;-&nbsp;memInfo.ullAvailPhys;当前进程当前使用的物理内存:与“当前进程当前使用的虚拟内存”中的代码相同,然后SIZE_T&nbsp;physMemUsedByMe&nbsp;=&nbsp;pmc.WorkingSetSize;目前使用的CPU:#include&nbsp;"TCHAR.h"#include&nbsp;"pdh.h"static&nbsp;PDH_HQUERY&nbsp;cpuQuery;static&nbsp;PDH_HCOUNTER&nbsp;cpuTotal;void&nbsp;init(){ &nbsp;&nbsp;&nbsp;&nbsp;PdhOpenQuery(NULL,&nbsp;NULL,&nbsp;&cpuQuery); &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;You&nbsp;can&nbsp;also&nbsp;use&nbsp;L"\\Processor(*)\\%&nbsp;Processor&nbsp;Time"&nbsp;and&nbsp;get&nbsp;individual&nbsp;CPU&nbsp;values&nbsp;with &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PdhGetFormattedCounterArray() &nbsp;&nbsp;&nbsp;&nbsp;PdhAddEnglishCounter(cpuQuery,&nbsp;L"\\Processor(_Total)\\%&nbsp;Processor&nbsp;Time",&nbsp;NULL,&nbsp;&cpuTotal); &nbsp;&nbsp;&nbsp;&nbsp;PdhCollectQueryData(cpuQuery);}double&nbsp;getCurrentValue(){ &nbsp;&nbsp;&nbsp;&nbsp;PDH_FMT_COUNTERVALUE&nbsp;counterVal; &nbsp;&nbsp;&nbsp;&nbsp;PdhCollectQueryData(cpuQuery); &nbsp;&nbsp;&nbsp;&nbsp;PdhGetFormattedCounterValue(cpuTotal,&nbsp;PDH_FMT_DOUBLE,&nbsp;NULL,&nbsp;&counterVal); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;counterVal.doubleValue;}当前进程当前使用的CPU:#include&nbsp;"windows.h"static&nbsp;ULARGE_INTEGER&nbsp;lastCPU,&nbsp;lastSysCPU,&nbsp;lastUserCPU;static&nbsp;int&nbsp;numProcessors;static &nbsp;HANDLE&nbsp;self;void&nbsp;init(){ &nbsp;&nbsp;&nbsp;&nbsp;SYSTEM_INFO&nbsp;sysInfo; &nbsp;&nbsp;&nbsp;&nbsp;FILETIME&nbsp;ftime,&nbsp;fsys,&nbsp;fuser; &nbsp;&nbsp;&nbsp;&nbsp;GetSystemInfo(&sysInfo); &nbsp;&nbsp;&nbsp;&nbsp;numProcessors&nbsp;=&nbsp;sysInfo.dwNumberOfProcessors; &nbsp;&nbsp;&nbsp;&nbsp;GetSystemTimeAsFileTime(&ftime); &nbsp;&nbsp;&nbsp;&nbsp;memcpy(&lastCPU,&nbsp;&ftime,&nbsp;sizeof(FILETIME)); &nbsp;&nbsp;&nbsp;&nbsp;self&nbsp;=&nbsp;GetCurrentProcess(); &nbsp;&nbsp;&nbsp;&nbsp;GetProcessTimes(self,&nbsp;&ftime,&nbsp;&ftime,&nbsp;&fsys,&nbsp;&fuser); &nbsp;&nbsp;&nbsp;&nbsp;memcpy(&lastSysCPU,&nbsp;&fsys,&nbsp;sizeof(FILETIME)); &nbsp;&nbsp;&nbsp;&nbsp;memcpy(&lastUserCPU,&nbsp;&fuser,&nbsp;sizeof(FILETIME));}double&nbsp;getCurrentValue(){ &nbsp;&nbsp;&nbsp;&nbsp;FILETIME&nbsp;ftime,&nbsp;fsys,&nbsp;fuser; &nbsp;&nbsp;&nbsp;&nbsp;ULARGE_INTEGER&nbsp;now,&nbsp;sys,&nbsp;user; &nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;percent; &nbsp;&nbsp;&nbsp;&nbsp;GetSystemTimeAsFileTime(&ftime); &nbsp;&nbsp;&nbsp;&nbsp;memcpy(&now,&nbsp;&ftime,&nbsp;sizeof(FILETIME)); &nbsp;&nbsp;&nbsp;&nbsp;GetProcessTimes(self,&nbsp;&ftime,&nbsp;&ftime,&nbsp;&fsys,&nbsp;&fuser); &nbsp;&nbsp;&nbsp;&nbsp;memcpy(&sys,&nbsp;&fsys,&nbsp;sizeof(FILETIME)); &nbsp;&nbsp;&nbsp;&nbsp;memcpy(&user,&nbsp;&fuser,&nbsp;sizeof(FILETIME)); &nbsp;&nbsp;&nbsp;&nbsp;percent&nbsp;=&nbsp;(sys.QuadPart&nbsp;-&nbsp;lastSysCPU.QuadPart)&nbsp;+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(user.QuadPart&nbsp;-&nbsp;lastUserCPU.QuadPart); &nbsp;&nbsp;&nbsp;&nbsp;percent&nbsp;/=&nbsp;(now.QuadPart&nbsp;-&nbsp;lastCPU.QuadPart); &nbsp;&nbsp;&nbsp;&nbsp;percent&nbsp;/=&nbsp;numProcessors; &nbsp;&nbsp;&nbsp;&nbsp;lastCPU&nbsp;=&nbsp;now; &nbsp;&nbsp;&nbsp;&nbsp;lastUserCPU&nbsp;=&nbsp;user; &nbsp;&nbsp;&nbsp;&nbsp;lastSysCPU&nbsp;=&nbsp;sys; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;percent&nbsp;*&nbsp;100;}linux在linux上,一开始似乎很明显的选择是使用POSIX API,如getrusage()等。我花了一些时间试着让它发挥作用,但却没有得到有意义的价值。当我最终检查内核源代码时,我发现这些API显然还没有在Linux2.6内核中完全实现!最后,我通过合并读取伪文件系统获得了所有的值。/proc和内核调用。总虚拟内存:#include&nbsp;"sys/types.h"#include&nbsp;"sys/sysinfo.h"struct&nbsp;sysinfo&nbsp;memInfo;sysinfo&nbsp;(&memInfo);long&nbsp;long&nbsp;totalVirtualMem&nbsp; =&nbsp;memInfo.totalram;//Add&nbsp;other&nbsp;values&nbsp;in&nbsp;next&nbsp;statement&nbsp;to&nbsp;avoid&nbsp;int&nbsp;overflow&nbsp;on&nbsp;right&nbsp;hand&nbsp; side...totalVirtualMem&nbsp;+=&nbsp;memInfo.totalswap;totalVirtualMem&nbsp;*=&nbsp;memInfo.mem_unit;当前使用的虚拟内存:与“总虚拟内存”中的代码相同,然后long&nbsp;long&nbsp;virtualMemUsed&nbsp;=&nbsp;memInfo.totalram&nbsp;-&nbsp;memInfo.freeram;//Add&nbsp;other&nbsp;values&nbsp;in&nbsp;next&nbsp;statement&nbsp;to&nbsp;avoid&nbsp; int&nbsp;overflow&nbsp;on&nbsp;right&nbsp;hand&nbsp;side...virtualMemUsed&nbsp;+=&nbsp;memInfo.totalswap&nbsp;-&nbsp;memInfo.freeswap;virtualMemUsed&nbsp;*=&nbsp;memInfo.mem_unit;当前进程当前使用的虚拟内存:#include&nbsp;"stdlib.h"#include&nbsp;"stdio.h"#include&nbsp;"string.h"int&nbsp;parseLine(char*&nbsp;line){ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;This&nbsp;assumes&nbsp;that&nbsp;a&nbsp;digit&nbsp;will&nbsp;be&nbsp;found&nbsp;and&nbsp;the&nbsp;line&nbsp;ends&nbsp;in&nbsp;"&nbsp;Kb". &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i&nbsp;=&nbsp;strlen(line); &nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;char*&nbsp;p&nbsp;=&nbsp;line; &nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(*p&nbsp;<'0'&nbsp;||&nbsp;*p&nbsp;>&nbsp;'9')&nbsp;p++; &nbsp;&nbsp;&nbsp;&nbsp;line[i-3]&nbsp;=&nbsp;'\0'; &nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;atoi(p); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;i;}int&nbsp;getValue(){&nbsp;//Note:&nbsp;this&nbsp;value&nbsp;is&nbsp;in&nbsp;KB! &nbsp;&nbsp;&nbsp;&nbsp;FILE*&nbsp;file&nbsp;=&nbsp;fopen("/proc/self/status",&nbsp;"r"); &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;result&nbsp;=&nbsp;-1; &nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;line[128]; &nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(fgets(line,&nbsp;128,&nbsp;file)&nbsp;!=&nbsp;NULL){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(strncmp(line,&nbsp;"VmSize:",&nbsp;7)&nbsp;==&nbsp;0){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;parseLine(line); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;fclose(file); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;result;}总物理内存(RAM):与“总虚拟内存”中的代码相同,然后long&nbsp;long&nbsp;totalPhysMem&nbsp;=&nbsp;memInfo.totalram;//Multiply&nbsp;in&nbsp;next&nbsp;statement&nbsp;to&nbsp;avoid&nbsp;int&nbsp;overflow&nbsp;on&nbsp;right&nbsp;hand &nbsp;side...totalPhysMem&nbsp;*=&nbsp;memInfo.mem_unit;目前使用的物理内存:与“总虚拟内存”中的代码相同,然后long&nbsp;long&nbsp;physMemUsed&nbsp;=&nbsp;memInfo.totalram&nbsp;-&nbsp;memInfo.freeram;//Multiply&nbsp;in&nbsp;next&nbsp;statement&nbsp;to&nbsp;avoid&nbsp;int&nbsp;overflow&nbsp; on&nbsp;right&nbsp;hand&nbsp;side...physMemUsed&nbsp;*=&nbsp;memInfo.mem_unit;当前进程当前使用的物理内存:在“当前进程当前使用的虚拟内存”中更改getValue()如下:int&nbsp;getValue(){&nbsp;//Note:&nbsp;this&nbsp;value&nbsp;is&nbsp;in&nbsp;KB! &nbsp;&nbsp;&nbsp;&nbsp;FILE*&nbsp;file&nbsp;=&nbsp;fopen("/proc/self/status",&nbsp;"r"); &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;result&nbsp;=&nbsp;-1; &nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;line[128]; &nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(fgets(line,&nbsp;128,&nbsp;file)&nbsp;!=&nbsp;NULL){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(strncmp(line,&nbsp;"VmRSS:",&nbsp;6)&nbsp;==&nbsp;0){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;parseLine(line); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;fclose(file); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;result;}目前使用的CPU:#include&nbsp;"stdlib.h"#include&nbsp;"stdio.h"#include&nbsp;"string.h"static&nbsp;unsigned&nbsp;long&nbsp;long&nbsp;lastTotalUser,&nbsp;lastTotalUserLow,&nbsp; lastTotalSys,&nbsp;lastTotalIdle;void&nbsp;init(){ &nbsp;&nbsp;&nbsp;&nbsp;FILE*&nbsp;file&nbsp;=&nbsp;fopen("/proc/stat",&nbsp;"r"); &nbsp;&nbsp;&nbsp;&nbsp;fscanf(file,&nbsp;"cpu&nbsp;%llu&nbsp;%llu&nbsp;%llu&nbsp;%llu",&nbsp;&lastTotalUser,&nbsp;&lastTotalUserLow, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lastTotalSys,&nbsp;&lastTotalIdle); &nbsp;&nbsp;&nbsp;&nbsp;fclose(file);}double&nbsp;getCurrentValue(){ &nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;percent; &nbsp;&nbsp;&nbsp;&nbsp;FILE*&nbsp;file; &nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;long&nbsp;long&nbsp;totalUser,&nbsp;totalUserLow,&nbsp;totalSys,&nbsp;totalIdle,&nbsp;total; &nbsp;&nbsp;&nbsp;&nbsp;file&nbsp;=&nbsp;fopen("/proc/stat",&nbsp;"r"); &nbsp;&nbsp;&nbsp;&nbsp;fscanf(file,&nbsp;"cpu&nbsp;%llu&nbsp;%llu&nbsp;%llu&nbsp;%llu",&nbsp;&totalUser,&nbsp;&totalUserLow, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&totalSys,&nbsp;&totalIdle); &nbsp;&nbsp;&nbsp;&nbsp;fclose(file); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(totalUser&nbsp;<&nbsp;lastTotalUser&nbsp;||&nbsp;totalUserLow&nbsp;<&nbsp;lastTotalUserLow&nbsp;|| &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;totalSys&nbsp;<&nbsp;lastTotalSys&nbsp;||&nbsp;totalIdle&nbsp;<&nbsp;lastTotalIdle){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Overflow&nbsp;detection.&nbsp;Just&nbsp;skip&nbsp;this&nbsp;value. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;percent&nbsp;=&nbsp;-1.0; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;else{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total&nbsp;=&nbsp;(totalUser&nbsp;-&nbsp;lastTotalUser)&nbsp;+&nbsp;(totalUserLow&nbsp;-&nbsp;lastTotalUserLow)&nbsp;+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(totalSys&nbsp;-&nbsp;lastTotalSys); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;percent&nbsp;=&nbsp;total; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total&nbsp;+=&nbsp;(totalIdle&nbsp;-&nbsp;lastTotalIdle); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;percent&nbsp;/=&nbsp;total; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;percent&nbsp;*=&nbsp;100; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;lastTotalUser&nbsp;=&nbsp;totalUser; &nbsp;&nbsp;&nbsp;&nbsp;lastTotalUserLow&nbsp;=&nbsp;totalUserLow; &nbsp;&nbsp;&nbsp;&nbsp;lastTotalSys&nbsp;=&nbsp;totalSys; &nbsp;&nbsp;&nbsp;&nbsp;lastTotalIdle&nbsp;=&nbsp;totalIdle; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;percent;}当前进程当前使用的CPU:#include&nbsp;"stdlib.h"#include&nbsp;"stdio.h"#include&nbsp;"string.h"#include&nbsp;"sys/times.h"#include&nbsp;"sys/vtimes.h"static&nbsp;clock_t&nbsp;lastCPU, &nbsp;lastSysCPU,&nbsp;lastUserCPU;static&nbsp;int&nbsp;numProcessors;void&nbsp;init(){ &nbsp;&nbsp;&nbsp;&nbsp;FILE*&nbsp;file; &nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;tms&nbsp;timeSample; &nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;line[128]; &nbsp;&nbsp;&nbsp;&nbsp;lastCPU&nbsp;=&nbsp;times(&timeSample); &nbsp;&nbsp;&nbsp;&nbsp;lastSysCPU&nbsp;=&nbsp;timeSample.tms_stime; &nbsp;&nbsp;&nbsp;&nbsp;lastUserCPU&nbsp;=&nbsp;timeSample.tms_utime; &nbsp;&nbsp;&nbsp;&nbsp;file&nbsp;=&nbsp;fopen("/proc/cpuinfo",&nbsp;"r"); &nbsp;&nbsp;&nbsp;&nbsp;numProcessors&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;while(fgets(line,&nbsp;128,&nbsp;file)&nbsp;!=&nbsp;NULL){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(strncmp(line,&nbsp;"processor",&nbsp;9)&nbsp;==&nbsp;0)&nbsp;numProcessors++; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;fclose(file);}double&nbsp;getCurrentValue(){ &nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;tms&nbsp;timeSample; &nbsp;&nbsp;&nbsp;&nbsp;clock_t&nbsp;now; &nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;percent; &nbsp;&nbsp;&nbsp;&nbsp;now&nbsp;=&nbsp;times(&timeSample); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(now&nbsp;<=&nbsp;lastCPU&nbsp;||&nbsp;timeSample.tms_stime&nbsp;<&nbsp;lastSysCPU&nbsp;|| &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeSample.tms_utime&nbsp;<&nbsp;lastUserCPU){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Overflow&nbsp;detection.&nbsp;Just&nbsp;skip&nbsp;this&nbsp;value. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;percent&nbsp;=&nbsp;-1.0; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;else{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;percent&nbsp;=&nbsp;(timeSample.tms_stime&nbsp;-&nbsp;lastSysCPU)&nbsp;+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(timeSample.tms_utime&nbsp;-&nbsp;lastUserCPU); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;percent&nbsp;/=&nbsp;(now&nbsp;-&nbsp;lastCPU); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;percent&nbsp;/=&nbsp;numProcessors; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;percent&nbsp;*=&nbsp;100; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;lastCPU&nbsp;=&nbsp;now; &nbsp;&nbsp;&nbsp;&nbsp;lastSysCPU&nbsp;=&nbsp;timeSample.tms_stime; &nbsp;&nbsp;&nbsp;&nbsp;lastUserCPU&nbsp;=&nbsp;timeSample.tms_utime; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;percent;}Todo:其他平台我假设,除了读取/proc伪文件系统的部分之外,一些Linux代码也适用于unix。也许在unix上,这些部件可以由getrusage()还有类似的功能?如果有Unix技术的人可以编辑这个答案并填写详细信息?!
打开App,查看更多内容
随时随地看视频慕课网APP