Является ли стековая память непрерывной?

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

Ответ 1

Стек для данного потока часто смежна в виртуальной памяти (в Linux и аналогичных системах и в пользовательском режиме в Windows). Ядро Windows (в Windows Vista и выше) и z/OS разрешить несанкционированные стеки в виртуальной памяти, а GCC 4.6 также позволит это. Компилятору вообще не нужно перемещать стек, даже для систем, которые имеют несмежные виртуальные адреса для стека; они просто меняются, когда выделяются новые части. Операционная система может переназначать физические страницы на виртуальные, чтобы стек не был смежным в физической памяти, хотя, даже если он находится в виртуальной памяти.

Ответ 2

Нет требований к тому, чтобы стек был смежным в языке ОС или аппаратном обеспечении.

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

Теперь многие реализации используют непрерывную память, потому что это просто. Это также то, как концепция стека обучается студентам CS (расширяется куча кучи стека). Но для этого нет никаких требований. Я считаю, что MS даже экспериментировала с размещением кадров стека в случайных местах в куче, чтобы предотвратить атаки, используемые умышленные методы разбивки стека.

Единственным требованием стека является то, что фреймы связаны. Таким образом, позволяет стеку нажимать/открывать кадры по мере ввода/удаления областей.

Но это все ортогонально исходному вопросу.

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

Как обычно выполняется стек.

Если это был вопрос. Затем вы получите более подробный и точный ответ сообщества.

Ответ 3

У вас есть адресное пространство для вашей памяти, пусть оно работает от 1 до 100. Вы выделяете свой стек с 1 вверх и вы распределяете свою кучу от 100 вниз. Хорошо до сих пор?

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

Куча, с другой стороны, не так хорошо себя ведет, скажем, что мы зарезервировали память от 70 до 100 для кучи. Мы можем выделить там блок из 4 байтов, и он может идти от 70 до 74, тогда мы выделяем еще 4 байта, и теперь у нас есть память, выделенная от 70 до 78. Но эта память может быть освобождена в любой точке программы. Таким образом, вы можете освободить 4 байта, которые вы выделили в начале, тем самым создав отверстие.

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

Я надеюсь дать разумный обзор по этому вопросу, но, вероятно, есть лучшие авторы, чем я, что вам, вероятно, понравится читать гораздо больше. Поэтому ищите тексты в виртуальной памяти, это может быть хорошей отправной точкой для понимания того, чего вы хотите. Существует несколько книг, которые будут описывать его в большей или меньшей степени. Несколько из тех, что я знаю о: Структурированной компьютерной организации, tanenbaum; Концепция операционной системы, Silberschatz. Я почти уверен, что Кнут обсуждает это в своих книгах с алгоритмами. Если вы чувствуете себя авантюрно, вы можете попробовать прочитать x86 его реализацию на руководствах intel.