2013-12-22 2 views
4

Я собираюсь преподавать вводный курс компьютерной науки в C, и я хотел бы продемонстрировать студентам, почему они должны проверить, вернул ли malloc() NULL. Мой план состоял в том, чтобы использовать ulimit, чтобы ограничить объем доступной памяти, чтобы я мог использовать разные коды кода с разными ограничениями. Наша предписанная среда - CentOS 6.5.Вызов malloc() для возврата NULL на CentOS

Мои первые попытки сделать это не удались, и оболочка показала «Killed». Это привело к тому, что я обнаружил убийцу Linux OOM. С тех пор я попытался выяснить магический набор заклинаний, которые приведут к результатам, которые я ищу. Видимо, мне нужно возиться с:

  • /etc/sysctl.conf
  • ulimit -m
  • ulimit -v
  • vm.overcommit_memory (который, видимо, должен быть установлен в 2, согласно статье Oracle)

это далеко либо Я получаю «Killed» или ошибку сегментации, ни один из которых не является ожидаемым результатом. Тот факт, что я получаю «Killed» с vm_overcommit_memory = 2, означает, что я определенно не понимаю, что происходит.

Если кто-то может найти способ искусственно и надежно создать ограниченную среду исполнения на CentOS, чтобы учащиеся научились обрабатывать типы ошибок OOM (и других?), Многие преподаватели курса будут вам благодарны.

+3

'аннулируются * mymalloc (size_t п) {возвращение рандов()% 3? malloc (n): NULL; } 'then' #define malloc mymalloc' –

+1

Вы пробовали лимит 'hard' в'/etc/security/limits.conf'? –

+0

Мне очень нравится подход «случайного отказа», но я вижу, как некоторые ученики говорят: «Конечно, вы можете имитировать неудачу, но что происходит на самом деле?» Я планирую сделать некоторые демонстрации на Arduino (где malloc() лучше провалился), но хотел бы иметь возможность демонстрации в оболочке Linux. –

ответ

1

Возможно [эффективно] отключить чрезмерное использование от ядра> = 2.5.30.

После Linux Kernel Memory:

// сохранить свою работу здесь и обратите внимание на текущее значение overcommit_ratio

# echo 2 > overcommit_memory 
# echo 1 > overcommit_ratio 

это устанавливает VM_OVERCOMMIT_MEMORY до 2 с указанием не overcommit мимо overcommit_ratio, который устанавливается в 1 (т.е. не overcommitting)

Null таНос демо

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc,char *argv[]) 
{ 
    void *page = 0; int index; 
    void *pages[256]; 
    index = 0; 
    while(1) 
    { 
    page = malloc(1073741824); //1GB 
    if(!page)break; 
    pages[index] = page; 
    ++index; 
    if(index >= 256)break; 
    } 
    if(index >= 256) 
    { 
    printf("allocated 256 pages\n"); 
    } 
    else 
    { 
    printf("memory failed at %d\n",index); 
    } 
    while(index > 0) 
    { 
    --index; 
    free(pages[index]); 
    } 
    return 0; 
} 

Выход

$ cat /proc/sys/vm/overcommit_memory 
0 
$ cat /proc/sys/vm/overcommit_ratio 
50 
$ ./code/stackoverflow/test-memory 
allocated 256 pages 
$ su 
# echo 2 > /proc/sys/vm/overcommit_memory 
# echo 1 > /proc/sys/vm/overcommit_ratio 
# exit 
exit 
$ cat /proc/sys/vm/overcommit_memory 
2 
$ cat /proc/sys/vm/overcommit_ratio 
1 
$ ./code/stackoverflow/test-memory 
memory failed at 0 

запомнить, чтобы восстановить overcommit_memory до 0 и overcommit_ratio как отмечено

+0

Ваше решение доставило мне большую часть рабочей установки (спасибо!), Но у меня есть два вопроса уточнения. После применения настройки vm я попытался использовать 'ulimit -b' и' ulimit -m', чтобы не повлиять. Но 'ulimit -v' сделал то, что я хотел (а именно« переключение »между рабочим и неудачным состояниями). Я не знаю, как объяснить это студентам (или для меня в этом отношении). Другой вопрос: как я вычислил (или идентифицировал), сколько памяти доступно для процесса для 'malloc()'? Спасибо за отличный ответ и за то, что он движется вперед! –

+0

'ulimit -m' ограничит только память' RAM' и не ограничивает ваше использование _swap space_. 'ulimit -v' ограничивает виртуальную память (включая _swap space_), доступную для процесса. Можно попробовать отрегулировать [изменение размера пространства подкачки] (http://www.oradba.ch/2012/05/resize-swap-space-on-linux/), чтобы подтвердить это понятие. Что касается количества памяти для процесс для выделения вы можете посмотреть на вывод 'ps v' и суммировать использование'% MEM' – amdixon

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