同じ質問がたくさんありましたが、それでも私は素晴らしい答えを見つけることができません. コアごとの使用量を示すこの特定の投稿のコードを見てきましたが、それは不正確で、Instrument が 1 つのコアが全負荷状態にあると通知した場合でも、常に 14% 程度でスタックします (素数テスト!)。
また、実際にコードを取得したこの質問も読みました。
sysctl
私は、これらの種類のものの鍵と思われるについてほとんど知識がありません。誰かが私にそれを達成する方法を説明してもらえますか?コード例はさらに高く評価されます. ありがとう!
これは私の現在のコードです。別のスレッドで実行されましたが、問題になる可能性があることに気付きました。誰か確認できますか? (私は NSThread と NSNotificationCenter を使用して、使用状況の情報をメイン スレッドに送信します。)
- (void)updateCPUUsage
{
NSMutableArray* arrayOfCPUUsage = [NSMutableArray array];
while ( 1 )
{
processor_info_array_t _cpuInfo, _prevCPUInfo = nil;
mach_msg_type_number_t _numCPUInfo, _numPrevCPUInfo = 0;
unsigned _numCPUs;
NSLock *_cpuUsageLock;
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];
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) {
Float32 _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];
}
[arrayOfCPUUsage addObject:@(_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 = nil;
_numCPUInfo = 0U;
}
[[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:@"CPUUsageUpdate" object:[arrayOfCPUUsage copy]]];
[arrayOfCPUUsage removeAllObjects];
usleep(1000);
}
}