- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
是否有任何可靠的方法可以让程序在运行时测量其 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/
是否有详细说明从一个 POSIX 版本更改为另一个版本的文档?我正在寻找一些东西,在表格 View 中,详细说明从 2004 年到 2008 年的变化 最佳答案 有点。这是Rationale ,每卷一
根据POSIX FAQ ,该标准已于 2013 年由 IEEE 修订和批准。 与 2008 年的先前标准相比有何变化? 最佳答案 根据 online edition 中的摘要, POSIX.1-2
我正在开发一个简单的并行应用程序,我想在其中使用单个进程来维护有关一系列工作进程的状态信息。设置一个 POSIX 消息队列似乎相对容易,其中所有工蜂都可以向状态维护者发送定期更新。我的问题? POSI
计划使用 posix 信号量来同步 2 个进程。不太确定使用哪个 - 命名或未命名。 各自的优缺点是什么?我如何决定使用哪个?在哪些情况下,一种优于另一种? 谢谢。 最佳答案 如果这两个进程不相关,则
嵌套参数替换在 Zsh 中有效: $ param=abc # nested remove prefix ${...#a} and remove suffix ${...%c} => $ printf
更新:整个问题出在一条错误线上,这是我的 C++ 代码中的语法错误。 在 Linux 上我发现 #define _NSIG 64 在 asm-generic/signal.h ,
我在网上遇到了两个 POSIX 文档。 http://pubs.opengroup.org/onlinepubs/009695399/ (IEEE 标准 1003.1,2004 年版) Abstrac
我正在开发一个简单的软件来检查我是否能够使用我研究过的 POSIX 定时器和信号进行编程。 我正在尝试做一个简单的程序来启动计时器并在一定的纳秒内发出信号 下面的程序运行得不好,所以我写了一些关于我的
如果我有一个通过 shell 运行的应用程序,是否有 POSIX 文档说 --help需要支持吗?我会这么认为,因为这似乎是最流行的终端应用程序(GNU 工具等)中的标准做法。 我很好奇我是否可以使用
自适应 AUTOSAR 基于什么 POSIX PSE51? 在学习自适应 AUTOSAR 时,我发现“自适应 AUTOSAR 基于 POSIX PSE51”。 但是,我不明白什么是 POSIX PSE
GNU bash manual说到shell参数有以下一段话: The command builtin does not prevent builtins that take assignment s
我应该在我的嵌入式 Linux 环境中使用 System V 消息队列还是 Posix 消息队列?项目中常用什么? 最佳答案 两者都有相同的基本工具——信号量、共享内存和消息队列。它们为这些工具提供了
用 tsearch 填充了 POSIX 二叉树后,如何清理整棵树? GCC 提供了 tdestroy 作为扩展,但是如果你想使用 POSIX-only 函数,你该怎么做呢? 我当前的实现使用 twal
来自 C++ 应用程序。为 AIX、HP-UX、Linux、OSX 和 Solaris 编译是否有一种简单的方法来确定应用程序是否可用。在系统启动后 5 分钟内运行? 在 Windows 上我可以这样
System V IPC 和 POSIX IPC 之间有什么区别? 为什么我们有两个标准? 如何决定使用哪些 IPC 函数? 最佳答案 两者都有相同的基本工具——信号量、共享内存和消息队列。它们提供的
根据this ,POSIX 库不包含 getopt.h。但是,我在 unistd.h 中找到了这个: #ifdef __USE_POSIX2 /* Get definitions and proto
我正在尝试使用 POSIX 共享内存和 POSIX 信号量构建客户端服务器应用程序。我是否必须将信号量放在共享内存段内,或者信号量是否可以只是全局变量?我希望遵守 POSIX 约定。 最佳答案 不,信
尝试读取 Rust fn 中任意用户的主目录,并使用 posix::pwd crate。 不幸的是,我找不到任何使用 FFI 的好例子,并且一直在处理关于指针和类型可变性的各种类型错误。 我的(非编译
我阅读了一个信号的手册页使用 man 7 signal我看到两种类型的信号。所以,我有一个问题, Linux 中的POSIX 可靠信号 和POSIX 实时信号 有什么区别? 最佳答案 如今,将这些表述
据我所知,ucontext 提供了比 setjmp 更好的东西。但它已被弃用,现在已从 POSIX 规范中删除。那么它为什么会出现,又为什么会被移除? 最佳答案 makecontext的签名来自 uc
我是一名优秀的程序员,十分优秀!