C 这是什么;“警报”;误差平均值?
我试图获取算法消耗的内存,因此我创建了一组函数,这些函数将在10毫秒内停止执行,以便使用getrusage()函数读取内存。其想法是设置一个计时器,该计时器将向处理程序medir_memoria()接收的进程发出警报信号C 这是什么;“警报”;误差平均值?,c,memory,timer,signals,getrusage,C,Memory,Timer,Signals,Getrusage,我试图获取算法消耗的内存,因此我创建了一组函数,这些函数将在10毫秒内停止执行,以便使用getrusage()函数读取内存。其想法是设置一个计时器,该计时器将向处理程序medir_memoria()接收的进程发出警报信号 但是,程序在中间停止了这个消息: [1] 3267 alarm ./memory_test 读取存储器的代码为: #include "../include/rastreador_memoria.h" #if defined(__linux__) || defin
但是,程序在中间停止了这个消息:
[1] 3267 alarm ./memory_test
读取存储器的代码为:
#include "../include/rastreador_memoria.h"
#if defined(__linux__) || defined(__APPLE__) || (defined(__unix__) && !defined(_WIN32))
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <signal.h>
#include <sys/resource.h>
static long max_data_size;
static long max_stack_size;
void medir_memoria (int sig)
{
struct rusage info_memoria;
if (getrusage(RUSAGE_SELF, &info_memoria) < 0)
{
perror("Not reading memory");
}
max_data_size = (info_memoria.ru_idrss > max_data_size) ? info_memoria.ru_idrss : max_data_size;
max_stack_size = (info_memoria.ru_isrss > max_stack_size) ? info_memoria.ru_isrss : max_stack_size;
signal(SIGALRM, medir_memoria);
}
void rastrear_memoria ()
{
struct itimerval t;
t.it_interval.tv_sec = 0;
t.it_interval.tv_usec = 10;
t.it_value.tv_sec = 0;
t.it_value.tv_usec = 10;
max_data_size = 0;
max_stack_size = 0;
setitimer(ITIMER_REAL, &t,0);
signal(SIGALRM, medir_memoria);
}
void detener_rastreo ()
{
signal(SIGALRM, SIG_DFL);
printf("Data: %ld\nStack: %ld\n", max_data_size, max_stack_size);
}
#else
#endif
#include“./include/rastreador_memoria.h”
#如果已定义(uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
#包括
#包括
#包括
#包括
#包括
静态长最大数据大小;
静态长最大堆栈大小;
无效医疗记忆(内部信号)
{
结构图像信息存储器;
if(获取图像(图像自身和信息记忆)<0)
{
perror(“不读取内存”);
}
max_data_size=(info_memoria.ru_idrss>max_data_size)?info_memoria.ru_idrss:max_data_size;
max_stack_size=(info_memoria.ru_isrss>max_stack_size)?info_memoria.ru_isrss:max_stack_size;
信号(信号、介质存储器);
}
无效rastrear_备忘录()
{
结构itimerval t;
t、 it_interval.tv_sec=0;
t、 it_interval.tv_usec=10;
t、 it_value.tv_sec=0;
t、 it_value.tv_usec=10;
最大数据大小=0;
最大堆栈大小=0;
setitimer(ITIMER_REAL,&t,0);
信号(信号、介质存储器);
}
void detener_rastreo()
{
信号(SIGALRM、SIG_DFL);
printf(“数据:%ld\n堆栈:%ld\n”,最大数据大小,最大堆栈大小);
}
#否则
#恩迪夫
main()函数按以下顺序调用所有函数:
我怎样才能解决这个问题?该报警消息的含义是什么?首先,将itimer设置为每10µs响一次是乐观的,因为10微秒实际上是一个很小的时间间隔。尝试使用500µs(或者甚至20毫秒,即20000µs),而不是先使用10µs 在10毫秒内停止执行 您已经编码了10微秒,而不是毫秒 然后,您应该交换两行代码:
signal(SIGALRM, medir_memoria);
setitimer(ITIMER_REAL, &t,0);
因此,在第一个itimer响之前设置一个信号处理程序
我想你的第一个itimer在信号处理器安装之前响了。仔细阅读,仔细阅读。SIGALRM
的默认处理是终止
顺便说一句,测量某个函数所用时间的更好方法是or。多亏了这些技巧,clock\u gettime
能够在我的i5-4690S台式计算机上以不到50纳秒的时间获得一些时钟
试图消耗内存
<>您可以考虑使用例如打开、读取和关闭快速<代码> /PRO/SUB/STATION/COD>或<代码> /PRO/SUB/STATM等…
(我猜你是在Linux上)
顺便说一句,您的测量结果会让您失望:请注意,通常不会向内核释放内存(通过…),而只是简单地标记和管理该区域,以便将来可以重用。您可能会考虑或注意到它不是异步信号安全,因此不能从信号处理程序内部调用。
(我倾向于认为您的方法存在严重缺陷)首先,将itimer设置为每10微秒响一次是乐观的,因为10微秒实际上是一个很小的时间间隔。尝试使用500µs(或者甚至20毫秒,即20000µs),而不是先使用10µs 在10毫秒内停止执行 您已经编码了10微秒,而不是毫秒 然后,您应该交换两行代码:
signal(SIGALRM, medir_memoria);
setitimer(ITIMER_REAL, &t,0);
因此,在第一个itimer响之前设置一个信号处理程序
我想你的第一个itimer在信号处理器安装之前响了。仔细阅读,仔细阅读。SIGALRM
的默认处理是终止
顺便说一句,测量某个函数所用时间的更好方法是or。多亏了这些技巧,clock\u gettime
能够在我的i5-4690S台式计算机上以不到50纳秒的时间获得一些时钟
试图消耗内存
<>您可以考虑使用例如打开、读取和关闭快速<代码> /PRO/SUB/STATION/COD>或<代码> /PRO/SUB/STATM等…
(我猜你是在Linux上)
顺便说一句,您的测量结果会让您失望:请注意,通常不会向内核释放内存(通过…),而只是简单地标记和管理该区域,以便将来可以重用。您可能会考虑或注意到它不是异步信号安全,因此不能从信号处理程序内部调用。
(我倾向于认为你的方法存在严重缺陷)