LINUX.ORG.RU

Управление памятью (хочу застолбить кусочек)


0

0

Собственно хочется сделать так: Нужно расметить массив очень большого количества маленьких объектов, но сделать это не сразу а постепенно и так чтобы объекты можно было размещать по сосдним адресам.

Если более детально та в идеале нужен непрерывный массив объектов, но вот создавать его всего сразу нехочется, так как априори неизвестро какие его члены на самом деле потребуются, поэтому хочется создавать объекты по мере необходимости, но тут нужна гарантия того что для конкретного объекта Х если он находится в середине массива была бы гарантия того что по соседним адресам можно создавать объекты. Иными словами на начальном этапе программы хочется не просто заграбастать кусок памяти под массив mallocом а застолбить диапазом адресов от 0xXXXXXXXX 0xYYYYYYYY так чтобы стандартные выделители памяти в этом диапазоне адресов объекты не создавали без явного на то указания и что главное чтобы реальная память из системы бралась только для фактически созданных объектов. Ну типа если в массиве нет ни одного объекта так и ни одного реального байта памяти проге не выделено. В отличие от malloc мне нужно выделения диапазона адресов в виртуальном адресном пространстве процесса а не памяти для процесса. Выделения памяти будет проводится при создании объектов, но хочется так чтобы при этом еще и их адреса в виртуальном адресном пространстве процесса можно было контролировать.

Теперь вопрос: помимо как в терии на практике такое забацать моно или нет?

anonymous

>В отличие от malloc мне нужно выделения диапазона адресов в виртуальном адресном пространстве процесса а не памяти для процесса. Выделения памяти будет проводится при создании объектов, но хочется так чтобы при этом еще и их адреса в виртуальном адресном пространстве процесса можно было контролировать.

malloc (в юниксах) резервирует диаипазон адресов в адресном пространстве процесса. реальное выделение физической страницы происходит при первом обращении по адресу принадлежащему этой странице (minor pagefault).

aydef
()

Чего только люди не придумают, лишь бы правильным компактифицирующим двухуровневым GC не пользоваться.

anonymous
()

Я бы не особо парился, а выделил всю память сразу. Или вообще массив
фиксированного размера использовал.

> и что главное чтобы реальная память из системы бралась только для фактически
> созданных объектов. Ну типа если в массиве нет ни одного объекта так и ни
> одного реального байта памяти проге не выделено.

В нормальных ОС все прооисходит именно так без каких-либо усилий со стороны
программиста.

> Выделения памяти будет проводится при создании объектов, но хочется так
> чтобы при этом еще и их адреса в виртуальном адресном пространстве процесса
> можно было контролировать.

To je głupstwo. Современные (и даже не очень современные) ОС все равно делают
ASLR (Adress Space Layout Randomisaion). Так что по любому адреса, возвращаемые
brk() и mmap() будут случайными.

Dselect ★★★
()
Ответ на: комментарий от Dselect

А все понял... после выходных в top смотрел не на тот столбик, calloc действительно подходит идеально...

anonymous
()
Ответ на: комментарий от anonymous

Это первая генерация идёт через компактифицирующий stop & copy (и тогда связанные объекты сами окажутся рядом в памяти), а вторая генерация - mark and sweep. Можно и ещё одну промежуточную генерацию с компактификацией добавить, если это так важно.

anonymous
()

man mmap

проще говоря - создай что то типа кеша - slab - только с описанными тобой свойствами - для нужных тебе объектов. mmap-ом реально дергай память - malloc() не надо для таких вещей юзать.

alphex_kaanoken ★★★
()
Ответ на: комментарий от Dselect

>To je głupstwo. Современные (и даже не очень современные) ОС все равно делают ASLR (Adress Space Layout Randomisaion). Так что по любому адреса, возвращаемые brk() и mmap() будут случайными.

про brk - не верю. Особенно на 32-битной системе.

anonymous
()
Ответ на: комментарий от anonymous

> про brk - не верю. Особенно на 32-битной системе.

arch/x86/kernel/process_32.c, в конце посмотри

mv ★★★★★
()
Ответ на: комментарий от anonymous

>чем mmap лучше malloc?

malloc выделяет память в помощью sbrk() и высвобождение не гарантирует отдачу адресного пространства ядру ...

alphex_kaanoken ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.