Почему существует ограничение на размер стека?

Возможный дубликат:
Что и где это стек и куча

Моя установка Ubuntu имеет ограничение на размер стека по умолчанию в 8 МБ. Но мне любопытно, почему нам нужно ограничивать размер стека пользовательской программы. Эта же программа может использовать все свое адресное пространство размером 4 ГБ (для 32-разрядной программы) через malloc / mmap и т. Д. Итак, зачем нам ограничение на размер стека? Почему стек не может расти, пока почти не встретится с кучей?


person aufather    schedule 11.07.2011    source источник
comment
Я прочитал 4 лучших ответа в этой теме. Дает много полезной информации. Но основное внимание уделяется различению стека от кучи. Несколько раз упоминалось, что у стека обычно есть ограничение, определяемое в начале потока. У меня вопрос, почему это так? Куча может увеличиваться во время выполнения. И стек, и куча являются частью ОЗУ и виртуальной памяти процесса. Тогда почему размер стека ограничен?   -  person aufather    schedule 12.07.2011


Ответы (1)


Фактически стек действительно растет все больше и больше. Он не должен начинаться очень большим, поскольку в общем случае он не должен быть очень большим. Очень большой размер приводит к расточительному использованию памяти.

Я не на 100% уверен в том, как стек реализован в Linux, но в Windows для стека зарезервировано большое количество места. Это количество может быть установлено в параметрах компилятора (вам может потребоваться больший стек для глубоко рекурсивных программ). Во время выполнения стек может динамически расширяться с помощью системы защитных страниц. В конце стека находится защитная страница, которая при нажатии расширяет стек на дополнительную страницу и продвигает защитную страницу вперед на одну.

Исследование стека - еще одна интересная и связанная с этим концепция. Итак, ваш вопрос: «Почему стек не может расти, пока почти не встретится с кучей?» Стек действительно увеличивается, но поскольку большую часть времени наличие огромного стека, вероятно, является нежелательным побочным эффектом ошибки, зарезервированный размер не будет огромным (хотя это можно установить).

Эта статья очень интересна и актуальна для вашего вопрос.

person Mike Kwan    schedule 11.07.2011
comment
MPS Wiki: C-Stack помещена в архив. - person David Cary; 11.10.2019