2015-06-30 2 views
-1

Я написал код для памяти calloc до тех пор, пока не будет доступным.Различия Calloc между MS Windows и Linux?

#include <stdlib.h> 
#include <iostream> 

using namespace std; 

int main() 
{ 
    int *p; 
    int count = 0; 
    while(1) 
    { 
     int inc=1024*1024*sizeof(char); 
     p=(int*) calloc(1,inc); 
     count++; 
     if(!p) 
     { 
      cout << "managed to allocate " << (count * 1024 * 1024)/1000000000.0 << " gb\n"; 
      return 1; 
     } 
    } 
} 

Выполнение выше код на Windows, в Visual Studio, я получаю следующее:

managed to allocate 1.9881 gb 
Press any key to continue . . . 

Однако, когда я принесу его к моей системе Linux и компиляции и запуска со следующим:

g++ mem.cpp 
./a.out 

Процесс немного забивается os.

Кажется, что calloc не возвращает null, даже если выделенная память не существует?

Если это так, то как я могу изменить свой существующий код, чтобы добиться такого же эффекта в Linux, как и в Windows?

+1

Почему вы используете 'calloc()' с C++ вообще, вместо использования функций [Dynamic memory management] (http://en.cppreference.com/w/cpp/memory) стандартной библиотеки? –

+1

В C++ я бы рекомендовал использовать 'new' вместо' calloc', а затем попытался обработать ['bad_alloc'] (http://en.cppreference.com/w/cpp/memory/new/bad_alloc) – CoryKramer

+0

@CoryKramer No , не 'новый' пожалуйста. Обратите внимание на то, что я связывал, пожалуйста. –

ответ

1

Это происходит потому, что Linux «переопределяет» память. Процессы в Linux могут выделять больше памяти, чем физически доступно. Физическая память выделяется только тогда, когда память фактически используется.

Когда у Linux заканчивается доступная физическая память, он начинает уничтожать процессы до освобождения памяти.

Вы можете отключить эту систему поведения в ширину с:

sudo sysctl -w vm.overcommit_memory=2 

Это будет убедиться, что все выделяется физическая память на самом деле есть. Это может быть не очень хорошая идея. Многие программы полагаются на это поведение и выделяют много неиспользуемой памяти.

Также не рекомендуется потреблять всю доступную память. Ваша программа может быть не той, которая не может выделить память или ту, которая убита убийцей OOM. Вы затрагиваете все процессы в вашей системе.

+0

Пробовал это. Теперь ** каждая ** команда, которую я вводить, говорит: "-bash: fork: не может выделить память" – user3002649

+0

Вы были предупреждены.Ваша система, вероятно, уже выделила больше памяти, чем физически доступная и больше не будет выделять. –

+0

Yup, обработка памяти Linux, как известно, плохо. Для них это проблема курица и яйца: их нестандартное поведение реагирует на плохо реализованные программы (которые требуют больше памяти, чем им нужно), и теперь программы учитывают это плохое решение. Таким образом, это фиксируется стремлением к обратной совместимости. Это также одна из причин того, что Linux нуждается в таких хаках, как LXC: само ядро ​​не может надлежащим образом защитить процессы от разных пользователей. Вы можете OOM-убить кого-то процесс elses. – MSalters

Смежные вопросы