Страницы

Поиск по вопросам

четверг, 28 ноября 2019 г.

Представление кучи и стека

#память #стек


Как физически выглядят куча и стек в оперативной памяти?    


Ответы

Ответ 1



И стек и куча оба находятся физически в RAM (не рассматриваем архитектурные вывихи с использованием спец. процессоров/компов) Их размеры и расположение определяются осью При этом куча может быть фрагментирована (иногда довольно сильно). Обычно у осей бывают специальные процедуры для дефрагментации кучи. Стек обычно никогда не фрагментирован (наверное можно придумать реализации стека с фрагментацией, но это оксюморон). Стек как бы быстрее потому, что у него единственный параметр с которым работает - это указатель положения стека (обычно регистр) - поэтому все операции со стеком работают в разы быстрее чем с кучей. Операция извлечения/записи из стека это 1 телодвижение процессора POP/PUSH С кучей сложнее именно из-за его фрагментации и простая операция извлечения значения из него может вылиться в десятки (если не сотни) телодвижений процессора. Минусы стека в малости его размера (он всегда по сравнению с кучей на порядок меньше) - ну и в том, что доступ к нему только последовательный.

Ответ 2



Хоть и прошло много времени с тех пор как вы задали вопрос, хотелось бы ответить, ведь все равно данный вопрос "гуглится" и, я думаю, что многие ещё посетят эту страницу. Как вам уже ответили "физически" - это транзисторы и конденсаторы. Так что сам вопрос скорее всего был поставлен не совсем корректно. Наверное, вы имели в виду что-то вроде - "Где находится куча и стек, как они устроены". Также , наверное , вас интересует как в целом устроена память, полностью осветить этот вопрос у меня не выйдет, но я хочу вам показать, исчерпывающий на мой взгляд, материал и дать ссылки на них. Материалы на русском. Вам нужно разобраться, что такое виртуальное память и как она транслируется в физическую. Вот пример организации сегментной памяти. Суть в том, что адресное представление в "виртуальной памяти" отличается от физической. Но для процесса(программы) это не важно, т.к. распределением памяти(выделением/освобождением) для занимается не она. Этим занимаются различные механизмы ОС и MMU Для более глубинного понимания, вам нужно ознакомиться с понятием "виртуальная память", а также со способами её организации "Сегментная адресация памяти","Страничная память" Это кратко и немного по поводу представления виртуальной памяти в физическую. По поводу устройства памяти внутри процесса: Снова вкратце, процесс думает, что ему выделяется цельное пространство, в котором уже размещаются области - "код","стек", "куча". Стек заполняется и растет при вызове новых методов в свободную область в сторону УМЕНЬШЕНИЯ адресов. Куча растет наоборот в сторону УВЕЛИЧЕНИЯ адресов. За тем, чтобы памяти хватило снова-таки следит ОС. Что хранится в блоке CODE, а также о много другом вы можете узнать из рекоммендованных мной материалов в этой ответе. Рекоммендую читать в расположенном мной порядке, предложенные мной статьи к ознакомлению. Азы устройства памяти Известная статья "Что каждый программист должен знать о памяти" Организация виртуальной памяти. Таблицы страниц и прочее. Преобразование логического адреса в линейный. Устройство MMU Элемент списка Мне не совсем понятны "рейтинговые ответы" на ваш вопрос, поскольку люди в них ушли, на мой некомпетентный взгляд, в обсуждение других тем.

Ответ 3



Лучше сказать так. Типичными операциями при работе с памятью являются её выделение/освобождение и чтение/запись. Операции выделения и освобождения памяти работают в куче медленнее. Доступ к данным (чтение/запись) происходит практически с одинаковой скоростью. Практически - потому что в стеке типичным является доступ к значениям напрямую, а в куче - через указатель. Напрямую на самом деле тоже означает что-нибудь в духе ptr [esp+10h], т.е. чтобы получить данные, процессору нужно прибавить некоторое число к значению регистра esp и обратиться к памяти по этому адресу. Если (типичная ситуация) указатель на фрагмент памяти в куче лежит на стеке, то возникает два уровня косвенности - сначала надо получить значение указателя через "ptr [esp+10h]", а потом прочитать значение по этому адресу. Если же мы, например, заводим указатель на данные, лежащие в стеке, то разницы в скорости доступа не будет абсолютно никакой.

Комментариев нет:

Отправить комментарий