2017-04-05 48 views
0

我試圖獲得算法所消耗的內存,所以我創建了一組函數,它會在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 

的main()函數的工作原理調用所有的人都在此順序:

  1. rastrear_memoria()
  2. 功能該該算法的離子我測試
  3. detener_rastreo()

我該如何解決這個問題?那個警報信息是什麼意思?

回答

2

首先,將itimer設置爲每10μs振鈴一次是樂觀的,因爲十微秒確實是一個很小的時間間隔。先用500μs(或者甚至20毫秒,即20000μs)嘗試,而不是先用10μs。

停止10毫秒

您已經編寫了一段10 秒,不毫秒週期執行!

然後,您應該交換兩行和代碼:

signal(SIGALRM, medir_memoria); 
setitimer(ITIMER_REAL, &t,0); 

,使信號處理程序設置第一itimer環之前

我想你的第一個itimer環之前的信號處理程序安裝。請仔細閱讀signal(7)time(7)SIGALRM的默認處理是終止。

順便說一句,衡量一些函數所用時間的更好方法是clock_gettime(2)clock(3)。由於vdso(7)技巧,clock_gettime能夠在我的i5-4690S臺式計算機上以小於50納秒獲得一些時鐘。

試圖讓內存消耗

你可以考慮使用proc(5)例如打開,閱讀和關閉快速/proc/self/status/proc/self/statm等....

(我猜你是在Linux上)

順便說一句,你的測量會令你失望:這往往free(3)不釋放內存的內核(直通munmap(2) ...)的通知,而只是標註&管理該區域可重複使用未來malloc(3)。您可能會考慮mallinfo(3)malloc_info(3),但請注意,它不是異步信號安全的,因此無法從信號處理程序中調用。

(我傾向於認爲你的方法有很大的缺陷)