2015-11-25 2 views
0

Я учусь о malloc функции C. Я знаю, как запросить память сГде возвращается память malloc?

p = malloc(number_of_bytes); 

и освободить его позже, когда он не используется с

free(p); 

Но я хочу знать, что-то немного более теоретически, чем это: я знаю, что с виртуальной памятью есть три возможности:

  1. Виртуальный адрес не может иметь никакого ph ysical хранения назначен (в файл подкачки или в физической памяти)

  2. виртуальный адрес может иметь физическую память на файл подкачки

  3. виртуальный адрес может иметь физическую память на физической памяти

Итак, мой вопрос:

Где malloc Возвращенная память (я имею в виду, это на файле подкачки, на физической памяти (возможно, куча?))?

+0

Тег C++ не подходит –

+2

Вот несколько хороших чтений о внутренней реализации 'malloc': [link] (http://stackoverflow.com/q/3479330/335858). – dasblinkenlight

ответ

3

Это конкретная реализация. В Linux с GNU libc или musl-libc, malloc часто вызывает mmap(2)system call, чтобы получить больше виртуальной памяти от ядра. free обычно маркировка зоны памяти для повторного использования будущих вызовов malloc, но иногда (для больших зон памяти) высвобождает память с munmap

Использования strace и изучить соответствующий исходный код ... (Обычно malloc реализуются в некоторой бесплатной стандартной программной библиотеке C на Linux). Я считаю, что musl-libc имеет хорошо читаемый реализацию malloc

Подробнее о processes, virtual address spaces, virtual memory и Advanced Linux Programming.

Смотрите также proc(5) и думать о выходе cat /proc/$$/maps и cat /proc/self/maps

На Linux специально, читайте также о Linux memory overcommit. Это особенность, которую мне не нравится, и что я отключен ...

Знайте, что ASLR. Вы можете отключить его (например, иметь воспроизводимые точки наблюдения под GDB).

Для отладки malloc вопросов, связанных (в частности memory leaks) используют valgrind (и, с недавних GCC составителей, их -fsanitize=debugging options).

+0

Кроме того, Linux использует отложенное распределение страниц, поэтому свежее «пространство памяти malloc» может не поддерживаться физической памятью или местом подкачки, пока программа не начнет записывать в выделенную память. До тех пор он может просто занимать адресное пространство в таблице страниц со страницами, отмеченными как «копировать при записи». –

0

Обычно он будет выделен в виртуальной памяти, если таковой имеется. Итак, давайте предположим, что у него есть одно, а аппаратное обеспечение памяти состоит из жесткого диска и ОЗУ. Если в физической памяти (ОЗУ) нет свободного места, оно будет выделено в файле подкачки на жестком диске.

Куча - это память для объектов и выделена сама по себе.Просто чтобы прояснить здесь концепции кучи, представьте себе встроенное приложение без операционной системы и без виртуальной памяти, если это объект, он будет выделен в области кучи в физической памяти (ОЗУ), если это не так, выделенных вне области кучи, но все же в физической памяти (ОЗУ).

5

находится на файле подписи, на физической памяти?

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

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

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