使用 sysctl() 的每个进程的 iOS cpu 使用情况?
Posted
技术标签:
【中文标题】使用 sysctl() 的每个进程的 iOS cpu 使用情况?【英文标题】:iOS cpu usage for each process using sysctl()? 【发布时间】:2012-10-05 01:27:40 【问题描述】:有没有办法使用 sysctl() 获取每个进程的 cpu 使用率?
我正在尝试寻找一种方法来检测特定应用程序的启动。似乎没有办法获取前台运行的应用程序信息。所以我想如果我可以监控该特定应用程序的 cpu 使用情况,我可以监控 cpu 使用情况的变化并大致假设应用程序何时启动。这可能吗?
我不打算将此应用发布到苹果应用商店。
这只是一项研究。因此,如果有任何方法可以做到这一点,我很高兴知道。
【问题讨论】:
我发布了一个答案。这对你有帮助吗? 【参考方案1】:执行以下过程 1. 导入以下文件
#include <sys/sysctl.h>
#include <sys/types.h>
#include <mach/mach.h>
#include <mach/processor_info.h>
#include <mach/mach_host.h>
2。添加 ivars
processor_info_array_t cpuInfo, prevCpuInfo;
mach_msg_type_number_t numCpuInfo, numPrevCpuInfo;
unsigned numCPUs;
NSTimer *updateTimer;
NSLock *CPUUsageLock;
3.IN .m 文件
-(void)voidDidLoad
int mib[2U] = CTL_HW, HW_NCPU ;
size_t sizeOfNumCPUs = sizeof(numCPUs);
int status = sysctl(mib, 2U, &numCPUs, &sizeOfNumCPUs, NULL, 0U);
if(status)
numCPUs = 1;
CPUUsageLock = [[NSLock alloc] init];
updateTimer = [[NSTimer scheduledTimerWithTimeInterval:3
target:self
selector:@selector(updateInfo:)
userInfo:nil
repeats:YES] retain];
- (void)updateInfo:(NSTimer *)timer
natural_t numCPUsU = 0U;
kern_return_t err = host_processor_info(mach_host_self(), PROCESSOR_CPU_LOAD_INFO, &numCPUsU, &cpuInfo, &numCpuInfo);
if(err == KERN_SUCCESS)
[CPUUsageLock lock];
for(unsigned i = 0U; i < numCPUs; ++i)
float inUse, total;
if(prevCpuInfo)
inUse = (
(cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_USER] - prevCpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_USER])
+ (cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_SYSTEM] - prevCpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_SYSTEM])
+ (cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_NICE] - prevCpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_NICE])
);
total = inUse + (cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_IDLE] - prevCpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_IDLE]);
else
inUse = cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_USER] + cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_SYSTEM] + cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_NICE];
total = inUse + cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_IDLE];
NSLog(@"Core: %u Usage: %f",i,inUse / total);
[CPUUsageLock unlock];
if(prevCpuInfo)
size_t prevCpuInfoSize = sizeof(integer_t) * numPrevCpuInfo;
vm_deallocate(mach_task_self(), (vm_address_t)prevCpuInfo, prevCpuInfoSize);
prevCpuInfo = cpuInfo;
numPrevCpuInfo = numCpuInfo;
cpuInfo = NULL;
numCpuInfo = 0U;
else
NSLog(@"Error!");
[NSApp terminate:nil];
【讨论】:
您好 Ankit,非常感谢您的回答。但我仍然无法找到通过进程 ID 获取 cpu 使用率的方法。如果您有示例代码 sn-p 这将非常有帮助。谢谢! 您好,非常感谢您的回答。但是,此代码是否记录每个进程的 cpu 使用情况?我想通过将 PID 传递给函数来了解“Youtube”应用程序或“相机”应用程序的 CPU 使用情况。如果您能给我一个线索,我们将不胜感激。 感谢您的回答。如何获得总空闲 CPU 时间? (不是每个进程)。以上是关于使用 sysctl() 的每个进程的 iOS cpu 使用情况?的主要内容,如果未能解决你的问题,请参考以下文章