2010-11-20 4 views
2

Можно создать дубликат:
How is heap and stack memories managed, implemented, allocated?Как обычно используется куча?

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

Предположим, что мы пишем программу на C (или, возможно, C++) и где-то в глубине своего кода вызывается вызов malloc() (или оператор new вызывается, в случае C++). Теперь, каково местоположение выделенной памяти? Компилятор (компоновщик?) Добавляет сегмент данных, который используется в качестве кучи? Как определяется размер этого сегмента? Что произойдет, если мы попытаемся выделить кусок памяти, который больше, чем весь «сегмент кучи»? Будет ли расширяться куча? Если да, то как?

ответ

2

OS выделяет страницы, которые он возвращает в malloc/free, которые затем разбивают эти страницы на блоки запрашиваемого размера, из памяти. ОС может выделять любые страницы в адресном пространстве пользователя, которые еще не запрошены. Нет кучного сегмента. Выделенная память находится в любом месте, которое определяет ОС.

+0

Хорошо, как же работает защита? Когда мы распределяем память динамически, только наш процесс может получить к ней доступ, если другие попытаются выполнить операцию чтения/записи там, произойдет ошибка. Являются ли страницы отмеченными как принадлежащие к определенному процессу? – 2010-11-20 10:04:39

+0

@grigory, no. страницы отмечены как действительные или нет в таблицах страниц (бит P или V на x86). У PTE также есть бит R/W. Набор «активных» таблиц страниц «переключается» на коммутаторе контекста процесса в соответствии с активностью нового активного процесса. Каждый процесс имеет свой собственный каталог страниц (== набор таблиц страниц, каждый из которых содержит набор страниц + атрибутов) –

+3

@Grigory: Страницы для моего процесса не существуют для других процессов - они виртуальны. ОС сопоставляет виртуальные страницы с реальными страницами. Вам действительно нужно проверить виртуальную память. – Puppy

0

Старый unix-реализации использовали механизм sbrk() - запрос системы для перемещения последней границы раздела данных. Когда выделена память, библиотека tuntime вызывает систему для перемещения границы данных и использования новой памяти.

Новые операционные системы используют виртуальную память, поэтому malloc запрашивает новые свободные страницы VM из системы, когда это необходимо.

Автономные приложения (которые работают на голой аппаратуре, микроконтроллерах и т. Д.) Имеют всю выделенную память. Библиотека знает обо всей памяти, потому что скрипт компоновщика определяет символы для динамической области. E. g. что-то вроде freemembot и freememtop, для наименьшего и наивысшего свободного места в области памяти.

+0

Я думаю, вы имеете в виду 'sbrk', а не' strpbrk', который является функцией разбора строк. :-) –

+0

@R ..: Да, вы правы, это 'sbrk()'. Ответ исправлен. :) – Vovanium

0

Существует описание внутренней работы dlmalloc (реализация malloc(), используемая для glibc, uClibc и многих других мест) here.

Unix-подобные операционные системы имеют две основные интерфейсы для запроса/высвобождения памяти:

  • BRK() расширяется/сжимается сегмент данных.
  • mmap()/munmap() запрос/выпуск дополнительных отображений памяти.

API Windows на самом деле является malloc()/free(), как функция HeapAlloc()/HeapFree().

+0

«malloc» Glibc расходится совсем немного от 'dlmalloc'. –

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