C 这是什么;“警报”;误差平均值?

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

我试图获取算法消耗的内存,因此我创建了一组函数,这些函数将在10毫秒内停止执行,以便使用getrusage()函数读取内存。其想法是设置一个计时器,该计时器将向处理程序medir_memoria()接收的进程发出警报信号

但是,程序在中间停止了这个消息:

[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()函数按以下顺序调用所有函数:

  • rastrear_memoria()
  • 我正在测试的算法的功能
  • detener_rastreo()

  • 我怎样才能解决这个问题?该报警消息的含义是什么?

    首先,将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上)

    顺便说一句,您的测量结果会让您失望:请注意,通常不会向内核释放内存(通过…),而只是简单地标记和管理该区域,以便将来可以重用。您可能会考虑或注意到它不是异步信号安全,因此不能从信号处理程序内部调用。 (我倾向于认为你的方法存在严重缺陷)