pool of buffers
От: niXman Ниоткуда https://github.com/niXman
Дата: 03.04.19 12:39
Оценка:
привет!

нужен сабж.

под сабжем подразумеваю:
1. буфера могут быть произвольного размера
2. аллоцирование буфера(если свободных в pool`е нет)
3. возврат буфера в pool
4. выдача свободного буфера из pool`а по минимально необходимому размеру.

кто что юзал?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: pool of buffers
От: andrey.desman  
Дата: 03.04.19 12:40
Оценка: +11 -1 :))) :)
Здравствуйте, niXman, Вы писали:

X>под сабжем подразумеваю:

X>1. буфера могут быть произвольного размера
X>2. аллоцирование буфера(если свободных в pool`е нет)
X>3. возврат буфера в pool
X>4. выдача свободного буфера из pool`а по минимально необходимому размеру.
X>кто что юзал?

malloc/new
Re: pool of buffers
От: ononim  
Дата: 03.04.19 13:11
Оценка: +1
ну то есть тебе нужен кастомый аллокатор, так и гугли
Как много веселых ребят, и все делают велосипед...
Re: pool of buffers
От: AleksandrN Россия  
Дата: 03.04.19 15:29
Оценка:
Здравствуйте, niXman, Вы писали:

X>2. аллоцирование буфера(если свободных в pool`е нет)


А в чём тогда смысл пула?
Re[2]: pool of buffers
От: niXman Ниоткуда https://github.com/niXman
Дата: 03.04.19 18:30
Оценка:
Здравствуйте, AleksandrN, Вы писали:

AN>А в чём тогда смысл пула?

пулы бывают не только фиксед-сайз.
если в пуле нет свободных буферов, или буфе слишком мал — аллоцируем новый и кладем в пул.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: pool of buffers
От: andrey.desman  
Дата: 03.04.19 18:47
Оценка:
Здравствуйте, niXman, Вы писали:

AN>>А в чём тогда смысл пула?

X>пулы бывают не только фиксед-сайз.
X>если в пуле нет свободных буферов, или буфе слишком мал — аллоцируем новый и кладем в пул.

Ты не поверишь, но malloc делает именно это.

Тебе зачем нужен отдельный аллокатор, который просто повторяет функционал malloc? Тут даже каких-то послаблений типа фиксированного размера нет, у тебя по требованиям обычный general purpose memory manager. Может, он однопоточный, или есть ограничение сверху?
Re[4]: pool of buffers
От: niXman Ниоткуда https://github.com/niXman
Дата: 03.04.19 19:35
Оценка:
Здравствуйте, andrey.desman, Вы писали:

AD>Тебе зачем нужен отдельный аллокатор, который просто повторяет функционал malloc? Тут даже каких-то послаблений типа фиксированного размера нет, у тебя по требованиям обычный general purpose memory manager. Может, он однопоточный, или есть ограничение сверху?


да так, от скуки =)есть необходимость уменьшить кол-во сисколов.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[5]: pool of buffers
От: andrey.desman  
Дата: 03.04.19 19:56
Оценка:
Здравствуйте, niXman, Вы писали:

X>да так, от скуки =)есть необходимость уменьшить кол-во сисколов.


Каких? brk/sbrk/mmap?
Re[6]: pool of buffers
От: niXman Ниоткуда https://github.com/niXman
Дата: 03.04.19 21:09
Оценка: -1
Здравствуйте, andrey.desman, Вы писали:

AD>Каких? brk/sbrk/mmap?

не создавай мне квесты. глянь реализацию malloc(), или воспользуйся каким-нить *trace
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[7]: pool of buffers
От: andrey.desman  
Дата: 03.04.19 21:16
Оценка:
Здравствуйте, niXman, Вы писали:

AD>>Каких? brk/sbrk/mmap?

X>не создавай мне квесты. глянь реализацию malloc(), или воспользуйся каким-нить *trace

Сам глянь. Точнее, ты же по идее уже глянул...
Я ж не знаю, может у тебя там буферы метровые и их мапать приходится.
Re[8]: pool of buffers
От: niXman Ниоткуда https://github.com/niXman
Дата: 03.04.19 21:18
Оценка:
Здравствуйте, andrey.desman, Вы писали:

AD>Сам глянь. Точнее, ты же по идее уже глянул...

лет шесть тому.

AD>Я ж не знаю, может у тебя там буферы метровые и их мапать приходится.

удачи.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[9]: pool of buffers
От: andrey.desman  
Дата: 03.04.19 21:25
Оценка: +1 :)
Здравствуйте, niXman, Вы писали:

AD>>Сам глянь. Точнее, ты же по идее уже глянул...

X>лет шесть тому.

Кому?

AD>>Я ж не знаю, может у тебя там буферы метровые и их мапать приходится.

X>удачи.

Спасибо!
Re[5]: pool of buffers
От: Zhendos  
Дата: 04.04.19 10:37
Оценка:
Здравствуйте, niXman, Вы писали:

X>Здравствуйте, andrey.desman, Вы писали:


AD>>Тебе зачем нужен отдельный аллокатор, который просто повторяет функционал malloc? Тут даже каких-то послаблений типа фиксированного размера нет, у тебя по требованиям обычный general purpose memory manager. Может, он однопоточный, или есть ограничение сверху?


X>да так, от скуки =)есть необходимость уменьшить кол-во сисколов.


Тогда почему бы просто не аллоцировать большой кусок с помощью "new",
заполнить его нулями и сделать delete, на это потребуется всего несколько системных
вызовов, а потом аллокатор просто будет переиспользовать этот кусок памяти,
не обращаясь к ОС.
Re[5]: pool of buffers
От: Mr.Delphist  
Дата: 04.04.19 11:14
Оценка:
Здравствуйте, niXman, Вы писали:

X>Здравствуйте, andrey.desman, Вы писали:


AD>>Тебе зачем нужен отдельный аллокатор, который просто повторяет функционал malloc? Тут даже каких-то послаблений типа фиксированного размера нет, у тебя по требованиям обычный general purpose memory manager. Может, он однопоточный, или есть ограничение сверху?


X>да так, от скуки =)есть необходимость уменьшить кол-во сисколов.


Так есть же кастомные аллокаторы, которые подобным и занимаются: один раз дёрбанят у ОС жирный кусок памяти, а затем ведут свою "чёрную кассу" кто кому что должен из памяти. Вплоть до пре-аллоцирования N пулов буферов размером от 1 до N байт (а всё что выше — берётся из отдельного large heap). Идея весьма старая, ещё в 90-х с этим сталкивался.
Re[6]: pool of buffers
От: Mr.Delphist  
Дата: 04.04.19 11:16
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>Тогда почему бы просто не аллоцировать большой кусок с помощью "new",

Z>заполнить его нулями и сделать delete, на это потребуется всего несколько системных
Z>вызовов, а потом аллокатор просто будет переиспользовать этот кусок памяти,
Z>не обращаясь к ОС.

А зачем его бить нулями? Лишняя работа плюс убийство кэша CPU (разве что через DMA это лить, но тут уже сам себе Ржевский).
Re[6]: pool of buffers
От: niXman Ниоткуда https://github.com/niXman
Дата: 04.04.19 11:24
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>Тогда почему бы просто не аллоцировать большой кусок с помощью "new",

Z>заполнить его нулями и сделать delete, на это потребуется всего несколько системных
Z>вызовов, а потом аллокатор просто будет переиспользовать этот кусок памяти,
Z>не обращаясь к ОС.

я думал об этом, но это как-то не очевидно, и чем-то напоминает хак...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[6]: pool of buffers
От: niXman Ниоткуда https://github.com/niXman
Дата: 04.04.19 11:25
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:

MD>Так есть же кастомные аллокаторы


так вот я об этом и спрашиваю.
где они есть? ничего толкового(кроме object pool) не нагуглилось.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[7]: pool of buffers
От: IID Россия  
Дата: 04.04.19 12:13
Оценка:
Здравствуйте, niXman, Вы писали:

X>так вот я об этом и спрашиваю.

X>где они есть? ничего толкового(кроме object pool) не нагуглилось.

jemalloc
наверняка размеры арен настраиваются при компиляции.
kalsarikännit
Re: pool of buffers
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 04.04.19 12:24
Оценка:
Здравствуйте, niXman, Вы писали:

X>кто что юзал?

На ум приходят только кастомные аллокаторы, может быть boost::pool_alloc, но они все работают по принципу отожрать много памяти, а потом распределять её со всеми минусами.
Sic luceat lux!
Re[6]: pool of buffers
От: andrey.desman  
Дата: 04.04.19 12:43
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>Тогда почему бы просто не аллоцировать большой кусок с помощью "new",

Z>заполнить его нулями и сделать delete, на это потребуется всего несколько системных
Z>вызовов, а потом аллокатор просто будет переиспользовать этот кусок памяти,
Z>не обращаясь к ОС.

Это от libc зависит. На каком-нибудь uClibc все, что выше 128К всегда будет выделяться mmap/munmap. glibc же будет этот порог увеличивать с каждым разом, так что там в принципе ничего особого делать и не надо.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.