Безопасно ли использовать mmap и malloc для выделения памяти в одной программе? - PullRequest
1 голос
/ 04 октября 2019

До сих пор я понимал следующее:

  1. malloc внутренне использует sbrk и brk для выделения памяти путем увеличения верхней части кучи.
  2. mmap выделить память в виде страниц.

Теперь, скажем, текущая вершина sbrk/malloc равна 0x001000. И я использую mmap, чтобы выделить страницу размером 4 КБ, которая выделяется на 0x0020000. Позже, если бы я использовал malloc несколько раз и из-за этого он должен был увеличить sbrk top. Так что, если вершина достигнет 0x002000?

Итак, было бы замечательно, если бы кто-то смог прояснить следующее.

  1. Возможно ли описанный выше сценарий?
  2. Если нет, то укажите, пожалуйста, на недостаток в моем пониманииmalloc и mmap.
  3. Если да, то я предполагаю, что использовать его таким образом небезопасно. Итак, есть ли другой способ безопасно использовать оба?

Спасибо.

1 Ответ

1 голос
/ 11 октября 2019
  1. malloc сегодня обычно не реализуется таким образом ... malloc использовал sbrk(2) в старых реализациях, когда расширение сегмента данных было единственным способом запросить у системы больше виртуальной памяти. Более новые системы используют mmap(2), если доступно, поскольку они обеспечивают большую гибкость, когда виртуальное пространство достаточно велико (каждый блок mmap ed управляется как новый сегмент данных для процесса, запрашивающего его). sbrk(2) расширяет и сжимает сегмент данных, как стек ... поэтому вы должны быть осторожны, используя sbrk(2) на случай, если вы собираетесь использовать его в сочетании с sbrk реализацией malloc. То, как работает malloc, обычно не позволяет вам возвращать любую память, полученную с помощью sbrk(2), если вы смешиваете вызовы ... так что вы можете использовать ее только для безопасного увеличения сегмента данных.

  2. sbrk(2) также выделяет память в страницах. С тех пор как появилась виртуальная страничная виртуальная память, почти все выделение ОС выполняется в единицах страниц. Более новые системы имеют даже более одного размера страницы (например, 4 КБ и 2 МБ), поэтому вы можете воспользоваться этим, в зависимости от приложения.

  3. Поскольку 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).

...