malloc сегодня обычно не реализуется таким образом ... malloc использовал sbrk(2)
в старых реализациях, когда расширение сегмента данных было единственным способом запросить у системы больше виртуальной памяти. Более новые системы используют mmap(2)
, если доступно, поскольку они обеспечивают большую гибкость, когда виртуальное пространство достаточно велико (каждый блок mmap
ed управляется как новый сегмент данных для процесса, запрашивающего его). sbrk(2)
расширяет и сжимает сегмент данных, как стек ... поэтому вы должны быть осторожны, используя sbrk(2)
на случай, если вы собираетесь использовать его в сочетании с sbrk
реализацией malloc. То, как работает malloc, обычно не позволяет вам возвращать любую память, полученную с помощью sbrk(2)
, если вы смешиваете вызовы ... так что вы можете использовать ее только для безопасного увеличения сегмента данных.
sbrk(2)
также выделяет память в страницах. С тех пор как появилась виртуальная страничная виртуальная память, почти все выделение ОС выполняется в единицах страниц. Более новые системы имеют даже более одного размера страницы (например, 4 КБ и 2 МБ), поэтому вы можете воспользоваться этим, в зависимости от приложения.
Поскольку 64-битные системы получают все больше и больше использования,нет проблем с выделением достаточно большого адресного пространства, чтобы оба механизма могли жить вместе. Это является преимуществом для реализации malloc с несколькими кучами, так как память выделяется и освобождается независимо, и никогда не в LIFO-порядке.
Malloc использует разные подходы для выделения памяти, но реализации обычно пытаютсяне вмешиваться в использование пользователя sbrk(2)
. Вы должны быть осторожны, то есть, если вы смешиваете malloc(3)
звонки с sbrk(2)
в системе sbrk(2)
malloc. затем вы рискуете sbrk(2)
проникнуть в скорректированный по malloc сегмент данных и сломать внутренние структуры данных malloc. Вам лучше не использовать sbrk(2)
самостоятельно, если вы используете sbrk(2)
реализацию malloc.
Наконец, чтобы ответить на ваш вопрос, mmap(2)
выделяет память так же, как malloc(3)
, поэтому malloc неи не должен знать о выделенной памяти, которую вы использовали для собственного использования с mmap(2)
.