Unix - защитить себя от чрезмерного потребления памяти, сбивающего ПК? - PullRequest
2 голосов
/ 28 октября 2011

Очень похожий вопрос был задан для .net среды Windows:

Как вы защитите себя от чрезмерного потребления памяти, сбивающего ПК?

Этот вопрос задается для среды Unix с использованием C или C ++. В качестве примера рассмотрим опасный маленький блок ниже:

#include <vector>
int main() {
  int n;
  std::vector<double> A(n);
}

Если вам повезет, код выдаст ошибку диапазона. Если вам не повезло (в моем случае значение a в памяти было 283740392), код быстро использует всю доступную оперативную память и вызовет массовую перегрузку на диск, что приводит к быстрому размыванию ОС до виртуальной остановки, после чего ее можно убить. Конечно, этот процесс всегда можно завершить, но восстановление может занять несколько минут, так как все остальные запущенные процессы должны быть загружены обратно в память. Это , а не вопрос, ответ на который подразумевает нехватку ОЗУ, можно было бы легко запустить процесс, который затопит любую доступную машину.

Ответы [ 4 ]

5 голосов
/ 28 октября 2011

Как предлагается в комментарии, либо ulimit -v <size> перед запуском программы, либо setrlimit программно в ней.

1 голос
/ 28 октября 2011

Вы ищете вызов setrlimit . Ранее.

1 голос
/ 28 октября 2011

В Linux есть нечто, называемое 'убийцей OOM' . Он убивает процессы на основе использования памяти и истории использования процессора.

0 голосов
/ 28 октября 2011

Возможно, лучшим, но более сложным ответом (чем ulimit) будет пользовательский распределитель, который ограничивает максимальный размер любого данного выделения (100 МБ или около того), но не ограничивает общий объем памяти, разрешенный для использоваться ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...