2017-01-30 2 views
0

Мой учебник говорит, что следующее:Как операционная система определяет объем памяти, выделяемый в качестве стека во время компиляции?

После того, как операционная система решает создать новый процесс, он выделяет пространство для всех элементов образа процесса; поэтому операционная система должна знать, сколько места необходимо для частного адреса пользователя пространство (программы и данные) и стек пользователя.

Как я понимаю, стек содержит функции и локальные переменные. И так как большая часть ввода в функции и данные, полученные в результате любых связанных вычислений, не могут быть известны во время компиляции, ОС должна выделять статический объем памяти для работы в стеке.

Учитывая это, как ОС определяет во время компиляции достаточный объем памяти, требуемый компонентами стека? Учитывая драматическую изменчивость программ, я не представляю, как ОС достигает этой задачи. Казалось бы, если бы кто-то пытался выделить фиксированный объем памяти в качестве стека во время компиляции, он бы регулярно приводил к слишком большой или слишком небольшой памяти. Тем не менее, я полагаю, что существует эффективный механизм для решения этой проблемы (выделить соответствующий объем памяти как стек); в противном случае переполнение стека будет распространенным явлением.

Я был бы очень признателен, если бы кто-то мог пора потратить время, чтобы прояснить эту концепцию.

+0

* Компилятор определяет размер и компоновку стека с использованием довольно сложных алгоритмов оптимизации. * Http://stackoverflow.com/questions/21021223/how-does-the-gcc-determine-stack-size-the-function-based -on-c-will-use –

ответ

0

Я думаю, вы никогда не слышали о stack overflow.

Короткий ответ: он не может определить во время компиляции. Потому что, если бы можно было рассчитать сумму stack memory, необходимую для compile-time, не было бы такой вещи, как stack overflow, поскольку компилятор просто дал ошибку, указав, что сумма stack memory превышает предел.

Рассмотрим простую функцию:

int foo() 
{ 
    return foo(); 
} 

функция будет компилировать успешно. Но приведет к переполнению стека .

+0

* Размер стека вызовов зависит от многих факторов, включая язык программирования, архитектуру машины, многопоточность и количество доступной памяти. * Это прояснило мое понимание. Благодарю. –

1

Размер стека обычно определяется компоновщиком. Большинство компоновщиков имеют опции для установки размера стека. Затем стек создается загрузчиком программ вместе с остальной частью адресного пространства программы, когда он читает инструкции из исполняемого файла.

+0

Спасибо за ответ. Мне удалось выяснить это из моих исследований, но ваш ответ полезен, тем не менее. –

Смежные вопросы