перенос функций в c - sbrk для tcmalloc

Я пытаюсь портировать tcmalloc на uclibc. В Tcmalloc есть определение функции sbrk, которая, в свою очередь, вызывает __sbrk из libc. Uclibc, с другой стороны, не имеет функции __sbrk, но имеет sbrk.

Любые идеи о том, как я могу вызвать uclibc sbrk из tcmalloc sbrk?


person l.thee.a    schedule 15.12.2011    source источник


Ответы (1)


sbrk — это (старый) системный вызов, но большинство распределителей памяти создаются на основе mmap. См. также этот вопрос

Вы должны использовать системный вызов, а не эмулировать его. И я бы предпочел использовать mmap, а не sbrk

Выполнение системного вызова (обычно mmap) — единственный способ получить больше памяти из ядра Linux. .

С точки зрения приложения (или библиотеки) системный вызов является атомарным (это в основном это одна машинная инструкция, такая как SYSCALL, SYSENTER, int 0x80 и т. д.).

person Basile Starynkevitch    schedule 15.12.2011
comment
sbrk может быть более полезным, чем mmap, так как последний может не расти на месте. - person Maxim Egorushkin; 15.12.2011
comment
mmap дает вам независимые сегменты памяти. Я не уверен, что понимаю, когда нужно расти на месте. А еще есть MAP_GROWSDOWN и, возможно, MAP_NORESERVE. См. также stackoverflow.com/a/8504358/841108. - person Basile Starynkevitch; 15.12.2011
comment
Вы, вероятно, не хотите вызывать mmap() для каждого бита памяти, который хотите выделить. Обычно небольшие запросы к памяти обрабатываются через sbrk(), а большие — через mmap(). - person glglgl; 15.12.2011
comment
@BasileStarynkevitch: да, вы можете использовать любые флаги с mmap. sbrk базовый адрес отображения памяти, с другой стороны, позиционируется таким образом, что он может значительно увеличиться, прежде чем столкнуться с любым другим отображением. - person Maxim Egorushkin; 15.12.2011