Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

memory pool

31K
22 сентября 2007 года
jkmuf
6 / / 22.09.2007
Здравстуйте. Кто-нибудь писал программу управления памятью (memory pool),
не используя malloc() и free() (т.е не используя динамическую память)
Подскажите, пожалуйста, где можно это найти. Заранее огромное спасибо.
92
26 сентября 2007 года
Тень Пса
2.2K / / 19.10.2006
в гугле найти можно.... лень и нежелание не повод для того, чтобы идти на форум!!!

по запросу memory pool c++ первый результат гугла:
http://www.codeproject.com/cpp/MemoryPool.asp
31K
29 сентября 2007 года
jkmuf
6 / / 22.09.2007
Тень Пса!
Спасибо большое за твой ответ и твою ссылку.
Но мне это не подходит. Т.к код соответствующий этой ссылке обращается с операционной системе, для получения памяти. А мне это не подходит.
Я очень много искала в гугле прежде, чем обратилась не форум.
Но то что мне надо так и не нашла.
Всё что я находила обязательно обращается к функциям malloc() и free(), а для моего кода их нельзя использовать.
3
29 сентября 2007 года
Green
4.8K / / 20.01.2000
Почему нельзя использрвать? Что можно использовать?
92
30 сентября 2007 года
Тень Пса
2.2K / / 19.10.2006
ок, а new и delete можно? :)
13K
01 октября 2007 года
specter
113 / / 28.09.2007
Цитата: jkmuf
Тень Пса!
Всё что я находила обязательно обращается к функциям malloc() и free(), а для моего кода их нельзя использовать.


:eek: как можно написать memory pool без malloc и free?

31K
06 октября 2007 года
jkmuf
6 / / 22.09.2007
Можно выделить массив большого размера, а потом вместо malloc и free
обращаться к нему.
Я нашла подобный пример в книге по С Кегнигана и Ричи глава 8 (+глава 5).


Можно использовать new и delete, но чтобы внутри себя они не обращались с вышесказанным функциям.
3
06 октября 2007 года
Green
4.8K / / 20.01.2000
Цитата: jkmuf
Можно выделить массив большого размера, а потом вместо malloc и free
обращаться к нему.
Я нашла подобный пример в книге по С Кегнигана и Ричи глава 8 (+глава 5).


Создание большого массива на стеке приведет к значительносму снижению быстродействия программы, а в некоторых случиях и к её неработоспособности.

Цитата: jkmuf

Можно использовать new и delete, но чтобы внутри себя они не обращались с вышесказанным функциям.


В конечном счете все эти операторы и функции приводят к вызову API VirtualAlloc и т.п., без чего не обойтись.

350
07 октября 2007 года
cheburator
589 / / 01.06.2006
Green,
VirtualAlloc ничего общего с кучей (а под динамической памятью, я так думаю, надо понимать кучу) не имеет.

По поводу данной конкретной темы скажу: можно управлять пулом памяти (по сути, своей собственной кучей) с помощью VirtualAlloc, а внутри этой кучи распределение/освобождение реализовать придется руками.
Общий алгоритм предлагаю такой.
1. Работа с пулом (кучей).
Здесь есть два варианта: зарезервировать (не выделить!) сразу большое пространство, либо выделять понемногу (тогда пул может оказаться разбросанным по адресному пространству).
Первый вариант. Резервируем очень большую память (скажем, 1-2 Гб). При этом реального выделения памяти не происходит, но происходит резервирование адресов в адресном пространстве, в результате никто эти зарезервированные адреса ни выделить, ни зарезервировать не сможет. А реально выделять будем только по необходимости. Подробности см. VirtualAlloc.
Второй вариант. Выделяем некоторый кусок памяти, размерами не большой и не маленький (скажем, 8 Мб). Он кончается - выделяем еще один, и т. д. Но получится, что куча состоит из разбросанных кусков памяти, это немного усложняет задачу.
2. Собственно выделение памяти (рукописные malloc/free/new/delete).
Здесь рекомендую алгоритмы LFH (low-fragmentation heap). Принцип таков, что вся куча бьется на под-кучу 4-байтных элементов, подкучу 8-байтных элементов, 16-байтных элементов и т. д. (скажем, до 512-байтных элементов). Каждая подкуча выделяет элемент строго фиксированного, своего размера, что облегчает ведение списка занятой/свободной памяти, а в итоге - к быстрому выделению/освобождению памяти, и к тому же фрагментация тут низка. Когда приложение требует блок памяти N-го размера, ищем ближайшую подкучу, у которой размер элемента больше или равен N (скажем, для выделения 21 байт используем кучу 32-байтных элементов).
Остается решить задачу синхронизации, если разрабатываемое приложение многопотоковое, или для каждого потока реализовать свою кучу.

P. S. Полезно будет почитать про boost:: pool. Об этом надо искать где-то на http://www.boost.org. Можно также почитать MSDN по функциям, связанным с кучей (HeapAlloc, HeapCreate и т. д.)
3
07 октября 2007 года
Green
4.8K / / 20.01.2000
Цитата: cheburator
Green,
VirtualAlloc ничего общего с кучей (а под динамической памятью, я так думаю, надо понимать кучу) не имеет.


Я сказал "и т.п.", подразумевая и вызов HeapAlloc.

31K
09 ноября 2007 года
jkmuf
6 / / 22.09.2007
Спасибо за советы!
Cheburator! Видел ли ты где нибуть программу на С рефлизующую второй алгоритм! Заранее благодарна!
350
11 ноября 2007 года
cheburator
589 / / 01.06.2006
Нет, не видел (если ты про LFH). Просто идея очень проста, я думаю, реализовать не так уж трудно.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог