LINUX.ORG.RU

Какие есть варианты менеджеров памяти с минимальной дефрагментацией?

 , ,


0

2

Какие есть варианты менеджеров памяти с минимальной дефрагментацией? Либо как либы для С++ или Qt, либо как параметры настройки системы Ubuntu. Замедление работы выделения и роспуска не принципиальны, у меня в программе наибольшие затраты идут на дисковые операции, а за счет дефрагментации памяти, в том числе кэша операционки, существенно падает доступность памяти для кэширования диска.

Минимальная дефрагментация это чтобы всё было максимально плохо, тебе qt уже мало для этого?

#define менеджер памяти.

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

Я не понимаю, то ли я непонятно задал вопрос

Ты спросил какую-то дичь. Возможно, ты хотел сказать «фрагментация» вместо «дефрагментация», но даже в этом случае получается дичь.

tailgunner ★★★★★
()

Пятница в воскресенье? Выдыхай, бобёр, выдыхай.

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

то ли народу на выходных поглумиться больше не над чем.

зачем над чем-то еще, когда есть это?

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

Ты спросил какую-то дичь. Возможно, ты хотел сказать «фрагментация» вместо «дефрагментация», но даже в этом случае получается дичь.

Допускаю, что слово фрагментация я могу неправильно использовать. Но на счет фразы «менеджер памяти», вот ссылка на википедию, что это такое: https://ru.wikipedia.org/wiki/Менеджер_памяти И дальше, я делаю программу, в которой заметил, что очередным препятствием повышения производительности это дефрагментированная память. Вместо встроенного переделал на свой простенький, и там такая же картина.

Возьмите для примера сделайте программку, которая сначала выделит несколько гигов памяти блоками по килобайт (и забивайте ее скажем -1), а потом распустит. По «системному монитору» можно увидеть, что где то половина от распущенной памяти осталась за программой. Но это не беда, если дальнейшие выделения будут блоками такого же размера. А если они разные и их каждый раз много, то неиспользуемая но зарезервированная память будет расти, пока не наступит полный конец.

victor79
() автор топика

у меня в программе наибольшие затраты идут на дисковые операции

ну так и оптимизируй дисковые операции, че ты полез (походу) свой аллокатор писать?

в том числе кэша операционки

определи, плз, еще и это понятие

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

Но на счет фразы «менеджер памяти», вот ссылка на википедию, что это такое: https://ru.wikipedia.org/wiki/Менеджер_памяти

Ты скорее говоришь об аллокаторе.

Но это не беда, если дальнейшие выделения будут блоками такого же размера. А если они разные и их каждый раз много, то неиспользуемая но зарезервированная память будет расти, пока не наступит полный конец.

Все современные аллокаторы сопротивляются фрагментации, но любой из них можно вогнать в нее. Смотри на паттерны выделения памяти в своей программе. Заменить аллокатор можно, но нет гарантий, что это поможет.

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

паттерны выделения памяти

нет у меня «паттернов» (предполагаю что подразумевается «закономерностей») выделения памяти. Программа по сбору мат статистики, нужен доступ до случайных данных, и все данные в памяти не помещаются. Решение есть свое, но не идеальное. Хочу посмотреть как это решают другие.

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

нет у меня «паттернов» (предполагаю что подразумевается «закономерностей») выделения памяти.

Если их нет - значит, тебе невозможно помочь.

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

дефрагментация - это вообще как связано с менеджером памяти?
или ты про операции realloc?

xmikex ★★★★
()

возможно ты не понимаешь что такое RAM https://en.wikipedia.org/wiki/RAM это буквально Random-access memory

в такой памяти абсолютно не важна фрагментация, у тебя любой участок памяти доступен одинаково быстро

извращения на уровне ассемблера чтоб писать линейно с адреса по адрес будут работать только «без ОС»...и это бред какойто

бредовая тема на самом деле

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

У тебя в любом случае есть некоторые шаблоны выделения (просто ты о них не знаешь). Не бывает абсолютно uniform распределения в реальной жизни.

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

Ты совершенно прав в том, что операции выделения и освобождения памяти - крайне затратные и да, они ведут к фрагментации.
Но ты абсолютно неправ в выборе пути решения проблемы. Надо не изобретать аллокаторы, а перестать говнокодить и оптимизировать работу с памятью. Выделять реже и крупными блоками. В идеале - выделять при запуске и освобождать при завершении.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от victor79

Паттерны есть в любой программе кроме искусственных примеров с вызовами malloc(rand()). Изучай задачу лучше.

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

Я понимаю, что ты сейчас сидишь в кресле перед камином, куришь сигару, потягиваешь виски. Посмеиваешься над нами, не понимающими в разработке под консоли ровным счётом ничего. Не планируешь говорить ничего конкретного, просто бросаешь отрывистые замечания «Wrong :)»

Продолжай в том же духе. :)

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

Ну а как я тебе докажу что на «памяти то не завезли» люди не «делают mmap и не заморачиваются»? Я знаю 2 игровых проекта у которых свои аллокаторы: оба используют SmallBlockAllocator, у одного BestFit для медиум блока и страничный аллокатор на 500+кб.

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

Ну а как я тебе докажу что на «памяти то не завезли» люди не «делают mmap и не заморачиваются»?

А откуда в разговоре вообще появились «памяти не завезли » и консоли? В хедпосте - обычная убунта, дальше - «сбор мат. статистики» (ХЗ что это, но явно не игра на консоли).

tailgunner ★★★★★
()
Ответ на: комментарий от i-rinat

Не делают, ведь тогда очередная бессмысленная без линукса утилита не заработает на виндавсе.

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

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

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

у тебя любой участок памяти доступен одинаково быстро

Хрен там. Кеши и readahead сильно уменьшают время доступа если в данные ходить линейно.

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

Hardware prefetch делается самим процессором.

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

Это уже отдельный код.

Достаточно сделать обёртку, в которой спрятать платформо-зависимый код. Или воспользоваться готовой обёрткой, например, из Boost.

i-rinat ★★★★★
()
Ответ на: комментарий от tailgunner

Я конечно могу ошибаться, или назвать неправильно, но мне помнится, что было нечто типа подгрузки в кэш данных в процессе чтения.

Возможно я что-то путаю с префетчем или подгрузкой из флеша в некоторых МК.

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

возможно ты не понимаешь что такое RAM https://en.wikipedia.org/wiki/RAM это буквально Random-access memory

К фрагментации памяти ведет постоянное ее выделение и высвобождение кусками разными размерами, и в результате на 10Гб выделенной памяти система затрачивает 11Гб или больше. В моем случае система/Qt почему-то 10Гб полезной памяти зафрагментировала на 20Гб за несколько часов работы программы, а дальше закончилась оперативка и все стало бесконечно долго. Заменив вызовы на свой самопальный простенький «аллокатор» я решил эту проблему, и сверх выделения у меня сейчас расходуется не более 10% оперативки как фрагментированные. Суть что в нем я использую разные пулы под разные размеры выделения и плюс немного для хранения инфы о выделенном куске памяти. Предполагаю, что это в Qt «аллокатор» такой кривой, а не системы Ubuntu.

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

По-моему это тупо мемори лик. Или там по странице на каждые полтора байта аллокаций?

Чтобы бороться с фрагментацией, выделяют и оперируют бОльшими блоками в юзерском коде. А ядро так-то будет заниматься дефрагментаций, если ты дефрагментирующий менеджер включишь и настроишь, и не будет у тебя ничего утекать никуда. Но проблему надо искать в первую очередь у себя.

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

По-моему это тупо мемори лик.

Тогда бы эта проблема осталась бы при замене на свой аллокатор. У меня все четко, столько то объектов выделено, столько то распущено, суммарный объем посчитан.

victor79
() автор топика
Ответ на: комментарий от RazrFalcon

В Qt нет своего аллокатора.

Согласен, эта проблема malloc от gcc. Это выделение не от системы, т.к. система выделяет блоками кратными степени двойки, (это предположение, которое можно увидеть из выполнения команды sudo slabtop)

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

slabtop

Это данные по внутриядерному аллокатору. К пользовательским программам он как-то побоку. Там sbrk и mmap.

i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от victor79

что я прочитал, мои глаза

как 10гб могут превраться в 20гб

в оперативной памяти нет файловой системы, если простейшие адреса(пусть даже которые зеркалятся ОС это пол магабайта потребляет)

у тебя банальная утечка памяти, ни QT ни убунта ни оперативная памяти тут не причем

ты вбил себе в голову полный бред и сам себя в нем убеждаешь

то что ты описал «как думаешь» такое физически невозможно

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

Не «адреса», а страницы по 4килобайта или больше.

anonymous
()

Исхожу из того, что у тебя выполняется статистическая обработка большого массива данных. Сколько исходных данных (в процентах) от объема оперативки на рабочей станции? Сколько результирующих данных? И для полноты, сколько памяти требуется алгоритмам для обработки (тут стоит указать какую-нибудь оценку сверху на основе N некоторого количества входных данных)?

Тебе правильно посоветовали mmap. Еще добавлю, что стоит лучше спроектировать формат хранения данных на диске. Для того, что бы максимально упростить доступ к данным посредством mmap. Даже если исходные данные уже представлены в каком-то формате, есть резон конвертировать их отдельно, перед обработкой.

Нужно больше подробностей.

PS «дефрагментация» == «де-фрагментация» == «избавление от фрагментации» == «избавление от негативного явления, вызыванного дроблением памяти на мелкие участки, приводящего к затруднению при выделение больших непрерывных областей памяти» (в случае RAM)

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от anonymous

дичь какая-то

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

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