2009-07-31 9 views
2

Возможные Дубликаты:
How is heap and stack memories mananged, implemented, allocated?
Stack,Static and Heap in C++Как mananged кучи и стека памяти, реализованный, выделенные

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

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

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

   --Clarification-- 

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

+3

Точная копия закрытого вопроса: http://stackoverflow.com/questions/1212797/how-is-heap-and-stack-memories-mananged-implemented-allocated-closed – Pete

+2

Пожалуйста, не повторяйте, когда люди закрывают ваш вопрос как дубликат (и я голосовал, чтобы повторно открыть ваш другой вопрос, но я собираюсь голосовать, чтобы закрыть этот вопрос как дубликат). – Zifre

+0

@pete взгляните на комментарии точного дубликата. thx – 2009-07-31 15:43:33

ответ

10

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

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

char test[1000000]; 

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

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

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

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

+0

Было бы неплохо, если бы это могло быть перенесено на другой, практически идентичный вопрос ultraman, http://stackoverflow.com/questions/1212797/how-is-heap-and-stack-memories-mananged-implemented-allocated ... – SamB

 Смежные вопросы

  • Нет связанных вопросов^_^