Jak sprawdzić, czy malloc () overcommits pamięć

głosy
0

W moim programie C, w oparciu o dane użytkownika, pamięć zostanie przeznaczonych dla danej symulacji. Początkowym problemem jest to, że mam do czynienia użytkownik może poprosić o ogromnej liczby alokacji ale malloc () nigdy nie powiedzie się, dopóki nie zabraknie pamięci wówczas awarii programu.

Badałem logika to i teraz ma sens dla mnie, patrz [ 1 ] [ 2 ]. Możliwe obejście podane tutaj „ SIGKILL podczas przydzielania pamięci w C ++ ” sugeruje, aby ustawić overcommit_memorysię w /proc/sys/vm/overcommit_memoryzakresie od 0 do 2.

Ten problem rozwiązano z jednej strony. Ale ponieważ używam -fsanitize=addressmam błąd z dezynfekujący.

Czy istnieje lepsze rozwiązanie tego?

Utwórz 27/09/2016 o 08:28
użytkownik
W innych językach...                            


1 odpowiedzi

głosy
0

Chyba szczęk AddressSanitizer się niepowodzeniem, ponieważ nie jest legit przeciek. Więc moja odpowiedź ignoruje że:

alternatywy:

  1. Wyłącz overcommitu zachowanie, jak już zorientowali się: że będzie wpływać na inne procesy i wymaga korzeń.
  2. uruchomić cię aplikacja w obrazie Döcker z oom zabójcy niepełnosprawnych: że nie ma wpływu na inne procesy, ale wymaga korzeń zainstalować dokowane (to mój ulubiony rozwiązanie chociaż).
  3. Napisać po malloc: może trwać długo Alloc ogromny kawał pamięci i twój proces może nadal giną z powodu innego uruchomionego procesu, ale nie wymaga korzeń.
  4. używać ulimit -v aby ograniczyć ilość pamięci w zależności od urządzenia: To również nie wymaga korzeń ale twój proces może zostać zabity tak.

Kod dla trzeciego alternatywnego (dla Linux):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <setjmp.h>

jmp_buf resume_malloc;

void handle_malloc_error(int sig)
{
   longjmp(resume_malloc, sig);
}

void *memalloc(size_t sz) {
   void *p = 0;
   int sig = setjmp(resume_malloc);
   if ( sig == 0 ) {
      p = malloc(sz);
      signal(SIGSEGV, &handle_malloc_error);
      memset(p, 0, sz);
   } else {
      p = 0;
   }
   signal(SIGSEGV, SIG_DFL);
   return p;
}

int main(int argc, char *argv[])
{
   size_t sz = 160L * 1024 * 1024 * 1024L;
   void *p;
   for (int i=0; i < 100; i++) {
      printf("size: %lu\n", sz);
      p = memalloc(sz);
      if ( p == 0 ) {
         printf("out of memory\n");
         break;
      }
      sz *= 2;
   }
}
Odpowiedział 28/09/2016 o 13:38
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more