Как использовать mmap для выделения памяти в куче? - PullRequest
11 голосов
/ 24 января 2011

Просто поставленный вопрос, как я могу использовать mmap() для выделения памяти в куче? Это мой единственный вариант, потому что malloc() не является реентерабельной функцией.

Ответы [ 2 ]

23 голосов
/ 24 января 2011

Зачем вам нужен вход?Единственный раз, когда это необходимо, - это вызов функции из обработчика сигнала;в противном случае безопасность потоков так же хороша.И malloc, и mmap являются поточно-ориентированными.Ни один из них не является безопасным для асинхронного сигнала в POSIX.На практике mmap, вероятно, работает нормально из обработчика сигнала, но сама идея выделения памяти из обработчика сигнала - очень плохая идея.

Если вы хотите использовать mmap для выделения анонимной памяти,Вы можете использовать (не на 100% портативный, но определенно лучший):

p = mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);

Портативная, но уродливая версия:

int fd = open("/dev/zero", O_RDWR);
p = mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
close(fd);

Обратите внимание, что MAP_FAILED, а не NULLкод для сбоя.

9 голосов
/ 24 января 2011

Создание простого распределителя плит


Хотя выделение памяти в обработчике сигналов 1 кажется чем-то лучшим, чего следует избегать, это, безусловно, можно сделать.

Нет, вы не можете напрямую использовать malloc (). Если вы хотите, чтобы он был в куче, то mmap тоже не будет работать.

Мое предложение заключается в том, что вы создаете специализированный распределитель плит на основе malloc.

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

Проблема решена!


1. А если вы этого не делаете, то, похоже, у вас встроенная система или вы можете просто использовать malloc ().

...