Подтвердить что ты не робот

Стеки программ и кучи, как они работают?

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

  • Является ли стек частью какой-либо страницы в основной памяти?
  • Что происходит, когда программа перемещается в состояние ожидания? Где находятся указатель стека, счетчик программ и другая информация?
  • Почему стек растет и куча растет?
  • Может ли кеш L1, L2 содержать только один кусок непрерывной памяти или может иметь часть стека и кучи?

Можете ли вы порекомендовать любую хорошую книгу, которая охватывает эти вещи?

4b9b3361

Ответ 1

  • Да - стек обычно хранится в "низких" адресах памяти и заполняется вверх до его верхнего предела. Куча обычно хранится в "верхнем" адресном пространстве и растет до стека.

  • O/S сохраняет "контекст" для каждого запущенного процесса. Операция сохранения и восстановления состояния процесса называется "контекстным переключателем".

  • Просто конвенция AFAIK. Стек не действительно "растет", он получил фиксированное выделение.

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

Я бы предложил Computer Architecture: Количественный подход как хорошую ссылку на базовое оборудование и любую книгу об операционных системах о том, как аппаратное обеспечение "удалось".

Ответ 2

Это мое понимание этих вопросов:

  • Является ли стек частью какой-либо страницы в основной памяти?

    Да, стек обычно также сохраняется в адресном пространстве процесса.

  • Что происходит, когда программа перемещается в состояние ожидания, где находится указатель стека, счетчик программ и другая информация?

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

  • Почему стек растет и куча растет?

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

  • Может ли кеш L1, L2 содержать только один фрагмент смежной памяти или может иметь часть стека и кучи?

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

Ответ 3

3. Почему стек растет и куча растет?

Обратите внимание, что на некоторых системах (например, в некоторых системах HP) стек растет вместо down. И на других системах (например, IBM/390) вообще нет реального аппаратного стека, а пула страниц, которые динамически выделяются из памяти пользовательского пространства.

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

Ответ 4

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

Обычно процесс делит память, данную на две части. Одна из них - куча, а вторая - стек. Нижняя часть стека обозначается указателем стека r13 на руке и esp на x86. Когда вы создаете переменную в стеке, указатель стека перемещается, чтобы обеспечить дополнительное пространство. Это выполняется командой ассемблера PUSH. Аналогично, когда переменная выходит за пределы области действия, она удаляется из стека.

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

Другая часть памяти может использоваться для кучи. Затем это доступно для распределения с использованием malloc или new. Каждый поток должен иметь свой собственный стек, но может совместно использовать кучу с другими потоками в процессе.

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

Кэш не имеет ничего общего ни с стеком, ни с кучей. Он управляется процессором и обеспечивает способ обеспечения того, чтобы данные, необходимые для ЦП, были под рукой, так что ему не нужно ждать, пока автобус его извлечет. Это полностью зависит от процессора, чтобы гарантировать, что то, что находится в основной памяти, совпадает с тем, что хранится в кеше. Единственный момент, когда нужно действительно беспокоиться о кеше, - это использовать DMA. Одному придется вручную очистить или синхронизировать кеш, чтобы гарантировать, что ЦП не доверяет кешу и фактически извлекает данные из основной памяти.

Ответ 5

Вы должны проверить мой профессор слайды из моего класса архитектуры. Часть 6. Действительно помогла мне понять, все, что вы попросили, и другие ответили, и БОЛЬШЕ, если вы хотите получить более глубокие знания.