Как ограничить объем памяти, доступной для моего кода C? - PullRequest
1 голос
/ 26 сентября 2010

Просто чтобы проверить, я запустил этот код

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

int main() {

    int **ar = (int**) malloc(100000000* sizeof(int*));

    int i;
    for(i = 0; i<10000000; i++) {
        ar[i] = (int*) malloc(1000 * 4);
        ar[i][123] = 456;
    }

    usleep(3000000); usleep(3000000);
    usleep(3000000); usleep(3000000);
    usleep(3000000); usleep(3000000);

    return 0;
}

График использования памяти выглядел следующим образом (нижний розовый график отслеживает память).

alt text

Хотя этой программе не хватило памяти, дальнейшие требования к памяти привели бы к сбою malloc, а затем к ошибке сегментации из-за строки ar[i][123] = 456;.

Я хочу установить ограничение на выделение памяти через мою программу, но также не хочу связывать мою программу статически.

Например, Есть ли способ заставить мою программу использовать не более половины памяти, доступной в системе (системе, в которой запускался бинарный файл), но не более?

Итак, если моя программа запускается на машине с 8 ГБ памяти, она может использовать не более 4 ГБ, но в случае, если программа работает на компьютере с 256 МБ, программе должно быть доступно только 128 МБ.

Кроме того, я хочу сделать это из моей программы, а не контролировать объем доступной памяти с помощью какой-либо внешней утилиты.

Ответы [ 3 ]

2 голосов
/ 27 сентября 2010

Обычно считается, что программа пытается определить объем физической памяти на машине и использовать определенную ее часть. Что если 10 программ считают, что имеют право использовать половину памяти машины?

Гораздо лучшим подходом к работе с огромными объемами данных будет работа с ними на диске и использование кеша файловой системы операционной системы для оптимального использования физической памяти машины таким образом, чтобы это справедливо для нескольких процессов. 1003 *

2 голосов
/ 09 февраля 2012

Я удивлен, что никто не упомянул ulimit, который является подходом для платформы UNIX.

Если вам нужно решение для программирования, оберните ваши вызовы malloc() и free() пользовательской функцией и отслеживайте объем выделенной памяти. Пользователь может задать параметр командной строки (или переменную среды, настройку файла конфигурации и т. Д.), Чтобы ИХ мог решить, какой объем ОЗУ разрешено использовать вашей программе.

0 голосов
/ 26 сентября 2010

Если вы работаете в Linux, вы можете при запуске проанализировать файл /proc/meminfo, чтобы узнать, сколько памяти имеет система:

$ cat /proc/meminfo
MemTotal:         505872 kB
MemFree:           70332 kB
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...