getrlimit (2) имеет следующее определение на страницах руководства:
RLIMIT_AS Максимальный размер виртуальной памяти процесса (адресного пространства) в байтах. Это ограничение влияет на вызовы brk (2), mmap (2) и mremap (2), которые завершаются ошибкой ENOMEM при превышении этого предела. Также автоматическое расширение стека завершится неудачно (и сгенерирует SIGSEGV, который убивает процесс, если через sigaltstack (2) не было сделано доступного альтернативного стека). Поскольку значение является длинным, на машинах с 32-битной длиной это ограничение не должно превышать 2 ГиБ, или этот ресурс не ограничен.
Что подразумевается под «автоматическим расширением стека» здесь? Стек в среде Linux / UNIX растет по мере необходимости? Если да, каков точный механизм?
ulimit -s
).Точный механизм приведен здесь, в Linux: при обработке ошибки страницы в анонимных сопоставлениях вы проверяете, является ли это «распределением, выполняемым с помощью функции« взрослый »», которое вы должны расширять как стек. Если запись области VM говорит, что вы должны, тогда вы настраиваете начальный адрес, чтобы расширить стек.
Когда происходит сбой страницы, в зависимости от адреса, он может быть обслужен (и сброшен сбой) посредством расширения стека. Такое поведение «возрастания количества ошибок» для виртуальной памяти может запрашиваться произвольными пользовательскими программами,
MAP_GROWSDOWN
флаг которых передаетсяmmap
системному вызову.Вы также можете возиться с этим механизмом в пользовательской программе:
Когда он предложит, вы найдете pid программы (через
ps
) и посмотрите,/proc/$THAT_PID/maps
как выросла исходная область.источник