"Куча" блока Windows и стек?

ОС: Windows 7 32bit

Таким образом в подобном C++ у каждого есть "куча" и стек. Но я запускал на некотором блоке, учащемся в последнее время, и не видел ничего вида, только стека, но он просто похож на чистую память. Так действительно ли "куча" и реализация стека специфично для C++ и других языков? Или Вы все еще становитесь выделенными "куча" и стек в блоке? При запуске исполняемого файла, что окна делают с точки зрения выделения памяти для процесса? И как процесс знает, насколько большой размер стека должен быть?

Каково движение

Править: Возможно, кто-то мог поставщик ссылка на то, как "куча" и стековая память обрабатываются для процесса ЦП/ОС

8
задан Daniel 11 March 2010 в 03:46
поделиться

2 ответа

Стек в основном обслуживается ЦП (команды PUSH / POP / CALL / RET); куча - это исключительно функция библиотеки времени выполнения / ОС. Поэтому доступ к стеку при сборке естественен. Для доступа к куче вы просто вызываете соответствующие API из кода сборки (HeapAlloc / HeapFree или из какой-либо другой библиотеки). В отличие от стека, в языке ассемблера нет низкоуровневых примитивов для управления памятью кучи.

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

9
ответ дан 5 December 2019 в 08:23
поделиться

Большая часть моих знаний не относится к Windows, так что несите меня:

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

В 32-битной архитектуре регистры EBP и ESP отслеживают текущий кадр стека. EBP - это базовый указатель - он указывает на верхний адрес текущего кадра стека. ESP - это указатель стека, который указывает на младший адрес текущего кадра стека.

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

Стек управляется комбинацией: инструкций, вызывающих функции, и явных модификаций EBP и ESP. Все, что ниже ESP, считается освобожденным; поэтому, чтобы освободить память, вы можете просто добавить в ESP.

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

11
ответ дан 5 December 2019 в 08:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: