gpt4 book ai didi

c - 如何在运行时使用 POSIX clock() 函数监视 CPU 利用率?

转载 作者:太空狗 更新时间:2023-10-29 15:25:02 24 4
gpt4 key购买 nike

是否有任何可靠的方法可以让程序在运行时测量其 CPU 利用率?

我可能必须使用 POSIX clock()来自 time.h 的函数.这个想法是首先使用几毫秒来设置空闲 CPU 负载(步骤 A),然后是满 CPU 负载(步骤 B),然后启动程序并不断调用 clock()。因此,我可以计算 CPU 利用率相对于计算的步骤 A 和步骤 B 来监视 CPU 利用率的百分比。我假设忽略所有其他后台进程。

但是,我不确定如何只使用 C89 和 POSIX 正确地实现这些步骤 A 和步骤 B,比如 idle() 和 full_load() 函数?

最佳答案

当您说“full_load”时,您只需要一个 CPU 或负载下的虚拟核心,一个简单的紧密循环就可以解决问题。当然,它不会使用芯片上的所有晶体管(即,我们不是在谈论“满载”的老化测试),但它会在它从 CPU 获得的预定时间片中使用,使用所有可用的时钟周期,没有系统调用,这些系统调用会放弃对内核的控制,并可能导致执行线程被重新安排以供稍后使用。您也可以使用带有信号处理程序的警报来退出循环。这样一来,您就可以让循环运行大约一秒的执行时间(警报不是完全准确的时间......它们很接近,但不会下降到时钟周期)。

此外,对于“空闲”负载部分,您可以做同样的事情,但使用 sigsuspend() 而不是紧密循环,这将等待警报响起。

因此您的代码可能如下所示:

#include <signal.h>
#include <unistd.h>
#include <time.h>
#include <stdio.h>

static sig_atomic_t alarm_flag = 1;

void alarm_handler(int arg)
{
alarm_flag = 0;
}

clock_t idle()
{
//setup the alarm flag
alarm_flag = 1;

//setup the signal masks
sigset_t old_signal_set;
sigset_t new_signal_set;

sigemptyset(&old_signal_set);
sigemptyset(&new_signal_set);

//block the alarm signal
sigaddset(&new_signal_set, SIGALRM);
sigprocmask(SIG_BLOCK, &new_signal_set, &old_signal_set);

//setup the alarm
alarm(1);

clock_t time_before = clock();

//sit idle while we wait for the alarm to go off
while(alarm_flag)
sigsuspend(&old_signal_set);

clock_t time_after = clock();

//restore the old signal mask
sigprocmask(SIG_SETMASK, &old_signal_set, NULL);

return time_after - time_before;
}

clock_t full_load()
{
//set the alarm signal
alarm_flag = 1;

//set the 1-second alarm
alarm(1);

clock_t time_before = clock();

//loop until the alarm goes off
while(alarm_flag);

clock_t time_after = clock();

return time_after - time_before;
}

int main()
{
//setup the signal handler for the alarm
sigset(SIGALRM, alarm_handler);

//call the functions
clock_t idle_time = idle();
clock_t load_time = full_load();

//... do whatever else you need to-do with this info
printf("Idle Time: %d\n", (int)idle_time);
printf("Load Time: %d\n", (int)load_time);

return 0;
}

请记住,根据 POSIX 标准,clock_t 值的时基应该是每秒 100 万个时钟,因此您应该看到“full_load”返回的数字“这接近于该数字,因为我们将“满载”大约一秒钟。空载应该很小(当然)。这是我在 Mac Pro 上生成的数字:

Idle Time: 31
Load Time: 1000099

因此,就知道您可能会看到从 clock() 返回了多少个时钟周期而言,这似乎与您正在寻找的内容有些一致。我当然会多次运行此程序并取平均值以获得更好的方差指标。

关于c - 如何在运行时使用 POSIX clock() 函数监视 CPU 利用率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5950559/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com