Страницы

Поиск по вопросам

суббота, 30 ноября 2019 г.

Malloc большого количества данных в си

#c++ #linux #c


У меня скорее вопрос чем проблема. Malloc не выводит ошибки если я пытаюсь выделить
8gb памяти, но на ноутбуке ее всего 6gb. 
Как такое возможно (в линуксе) ?
    


Ответы

Ответ 1



Во-первых, максимальный размер доступной для выделения памяти не имеет никакого отношения к размеру установленного в вашем компьютере ОЗУ. Размер ограничен лишь размером адресного пространства процесса. Почитайте о том, как работают платформы с виртуальной памятью. Во-вторых, в конфигурации по умолчанию ОС типа Linux допускают т.наз. "overcommit", т.е. спокойно позволяют пользователю распределять регионы адресного пространства процесса даже если физических ресурсов машины (ОЗУ и размера swap области) недостаточно для хранения такого объема данных. Физическая "материализация" выделенной памяти происходит постранично, не в момент выполнения malloc, а намного позже - тогда, когда вы начнете заполнять эту память своими данными. Вот именно при заполнении очередной страницы данными вы в определенный момент можете наткнуться на нехватку физических ресурсов для "материализации" этой страницы и ваша программа "упадет". Сам же malloc ничего фактически не делает, кроме пометки региона адресного пространства как занятого. Таким образом тот факт, что malloc вам что-то позволил выделить, еще ничего не значит. malloc почти ничего не делает. Для того, чтобы убедиться, что ваше выделение памяти действительно "удалось", вам надо еще записать в весь выделенный блок памяти какие-то данные.

Ответ 2



Происходит, так называемый overcommit. Эта настройка регулируется файлом /proc/sys/vm/overcommit_memory. Значение 0 (по умолчанию) включает некую эвристику, значение 1 всегда разрешает перевыделение памяти, значение 2 отключает такое поведение. В последнем случае проверка доступности памяти происходит после достижения CommitLimit при каждом вызове mmap(2). Примечание: malloc(3) в свой реализации использует mmap(2) при необходимости расширения памяти процесса. Подробнее см. страницу руководства proc(5). Вы можете даже провести эксперимент. Отключите overcommit и попытайтесь запустить вашу тестовую программу. # echo 2 > /proc/sys/vm/overcommit_memory

Комментариев нет:

Отправить комментарий