Как управляется, реализуется, распределяется память кучи и стека [дублировать]

StackOverflow https://stackoverflow.com/questions/1213265

Вопрос

Возможные дубликаты:
Как осуществляется управление памятью кучи и стека, ее реализация и распределение?
Стек, статика и куча в C++

В C / C++ мы можем хранить переменные, функции, функции-члены, экземпляры класса либо в стеке, либо в куче.

Как каждый из них реализован?Как это управляется (высокий уровень)?gcc предварительно выделяет часть памяти, которая будет использоваться для стека и кучи, а затем выделяет ее по запросу?Поступает ли исходная память из оперативной памяти?

Может ли функция быть размещена в куче вместо стека?

             --Clarification--

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

Это было полезно?

Решение

Я думаю, что на ваш вопрос можно легко написать хотя бы несколько глав для книги по операционным системам.Я предлагаю вам почитать Таненбаума:Современные операционные системы.

Основное различие кучи и стека в том, что одно относится к элементу процесса, другое - к элементу потока.Изначально при запуске программы она получает некоторую минимальную кучу и некоторый сегмент стека.Куча увеличивается, стек статичен (для каждого потока).Если вы напишете рекурсивную функцию, которая не завершается (бесконечная рекурсия), вы получите переполнение стека ;) Любой вызов функции содержит фрейм стека в сегменте стека, когда функция завершает работу, стек разматывается, и фрейм свободен для использования следующей функцией.Стек - это непрерывная линейная структура.В Linux вы можете настроить размер сегмента стека для процесса с помощью переменной окружения.В Windows (по крайней мере, с MS Visual C ++) вы можете передать флаг компоновщика с размером сегмента стека.Переполнение стека также может возникать при выделении во время компиляции некоторого большого массива:

char test[1000000];

Куча - это совсем другая история.При запуске процесса размер кучи является некоторым значением по умолчанию и может варьироваться от ОС к ОС или конфигурации, используемой в этой ОС (напримерв Windows по умолчанию это 2 МБ, насколько я помню).Далее, если вам нужно больше кучи, выделите больше места для переменных и т.д.оно будет расти.Если программа не освобождает память кучи, она исчерпывает ее (или пространство кучи).Существуют различные структуры данных для реализации кучи, некоторые из них являются производными от двоичного дерева, некоторые нет, напримерКуча Фибоначчи (скопление деревьев).Вы можете прочитать некоторые статьи и т.д.о том, как написать распределитель памяти.Эти структуры данных должны быть оптимизированы для поиска узла кучи, когда необходимо отменить выделение выделенного фрагмента, или для добавления (поиска свободного фрагмента), когда требуется новое пространство кучи.

Каждый процесс в 32-разрядной ОС имеет 4 ГБ виртуального адресного пространства.Как вы можете себе представить, не может быть столько оперативной памяти, в которую поместились бы все процессы с их 4 ГБ виртуального адресного пространства.Память операционной системы организована в виде страниц, которые заменяются на HD, когда они больше не нужны или срок их действия истек.Вот тут-то и вступает в игру подкачка по страницам.Все сопоставлено со страницами:процесс со стеком или растущей кучей.Благодаря структуре кучи, которая растет динамически, она может быть размещена на нескольких страницах.Вот почему доступ к куче может быть очень дорогим, потому что, если страницы нет в памяти, происходит сбой страницы, и ОС приходится загружать страницу с диска (а это может быть на порядок медленнее).Фрейм стека выполняемого потока находится в кэше процессора, который намного быстрее оперативной памяти.

Возможны различные типы кучи, могут быть кучи, которые выполняются очень быстро для небольших объектов, или кучи, которые очень эффективны в многопоточных средах.Александреску описывает в "Современном дизайне C ++", как разработать распределитель небольших объектов и кучу, которая управляет небольшими объектами.Эта реализация доступна в его библиотеке Loki C++.Некоторые встроенные системы предлагают физически разные области памяти, поверх которых могут быть реализованы различные типы кучи.Написать собственный распределитель (менеджер кучи и т.д.) - тяжелая работа, если вы хотите превзойти компилятор.

С уважением,
Ованес

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top