Может ли jemalloc изменить выделение из разделяемой памяти? Функция FreeBSD dallocx()
подразумевает, что вы можете предоставить указатель на использование для выделения, но я не вижу очевидного способа сказать jemalloc
ограничить все распределения из этой памяти (а также не устанавливать размер и т.д.).
Функция
dallocx()
заставляет память, на которую ссылаетсяptr
, быть доступной для будущих распределений.
Если нет, каков уровень усилий для такой функции? Я изо всех сил пытаюсь найти схему готового размещения, которая может выделяться из раздела разделяемой памяти, который я предоставил.
Аналогично, может ли jemalloc
быть настроен на выделение из заблокированной области памяти для предотвращения обмена?
Не стесняйтесь указывать мне соответствующие разделы кода, которые требуют изменения и предоставляют любые идеи или предложения.
Идея, которую я изучаю, - это то, что вы можете создавать arenas/heaps для выделения в потоковой среде, поскольку jemalloc
делает для минимизации конкуренции, концепция кажется масштабируемой для распределения областей общей памяти в многопроцессорной среде, то есть я создайте N областей разделяемой памяти с помощью mmap()
, и я хочу использовать возможности jemalloc
(или любой схемы распределения) для максимально эффективного распределения с минимальным конфликтом потоков из одной из этих разделяемых областей, то есть если потоки/процессы не имеют доступа к тем же общим областям и аренам, вероятность конкуренции минимальна, а скорость операции malloc
увеличивается.
Это отличается от глобального распределения пула с помощью malloc()
API, поскольку обычно для этого требуется глобальная блокировка, эффективно сериализирующая пространство пользователя. Я бы хотел этого избежать.
edit 2:
В идеале api:
// init the alloc context to two shmem pools
ctx1 = alloc_init(shm_region1_ptr);
ctx2 = alloc_init(shm_region2_ptr);
(... bunch of code determines pool 2 should be used, based on some method
of pool selection which can minimize possibility of lock contention
with other processes allocating shmem buffers)
// allocate from pool2
ptr = malloc(ctx2, size)