2014-09-02 5 views
1

Я запускаю следующий пример кода под ubuntu 13.04 64 бит, имеющий 16 ГБ памяти, установленный с помощью инструментария компилятора 14 компилятора.C++ команда stdlib.h() не работает после выделения памяти 8 ГБ

У меня возникла проблема с системой («сделайте что-нибудь бахи ..») не будет работать после моей заявки allocting at certein point. После того, как я столкнулся с проблемой в течение нескольких часов, я понял, что тот факт, что я выделяю память объемом 8 ГБ в определенном месте, не позволяет мне использовать команду system().

Излишне говорить, что для того, чтобы я выделил эту память, я могу использовать систему свободно.

Фрагмент кода:

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

int main() { 
char ** buffer = new char*[100]; 

system("logger TRYING..!"); 
for(int i= 1; i<=80; i++) 
{ 
    buffer[i] = new char[200*1000*1000]; 
} 

system("logger SUCCESS..!"); 

return 0; 
} 

Спасибо за помощь ..!

+2

Функция 'system' открывает новый процесс, который эффективно удваивает количество выделенной памяти, поскольку новый процесс создается как дубликат родительского процесса, выделенной памяти и всех. –

+0

80 * 200 * 1000 * 1000 = близко к 16 ГБ, а не 8. – IronMensan

ответ

2

system звонки fork, что будет по существу удваивает необходимую оперативную память из вашего процесса. Поскольку вы используете 8 ГБ и имеете только 16 ГБ, у вас их недостаточно, а fork терпит неудачу. Тем не менее, fork реализован на страницах с копией на запись, что означает, что если вы не изменяете память дочернего процесса, ОЗУ фактически не дублируется. В этом случае вы не будете писать в эту память, но ОС не знает этого, поэтому ошибка fork. Вы должны подтвердить это, проверив возвращаемое значение для system (-1, если fork не удалось).

Возможно, вы захотите включить память overcommit, чтобы вы могли «перекомпилировать память». Это должно позволить fork преуспеть. В вашем случае я бы, вероятно, включил его только временно.

# Enable overcommit 
echo 1 > /proc/sys/vm/overcommit_memory 

# Disable overcommit 
echo 0 > /proc/sys/vm/overcommit_memory