LINUX.ORG.RU

Фрагментация памяти...


0

0

Есть некая программа, которая использует почти всю память на машине и довольно часто (сотни раз в секунду) выделяет и удаляет блоки памяти около 10K. Возможно ли появление фрагментации памяти в таком случае и к чему это может привести в случае беспрерывной работы?

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

при использовании С/С++ можешь получить NULL от malloc или exception от new

anonymous
()

Фрагментация будет ужасной. Приведёт к тому, что программа будет "течь". Яркий пример - Firefox.

Стоит подумать о применении специализированного аллокатора.

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

> Фрагментация будет ужасной. Приведёт к тому, что программа будет "течь"

Это высказывание на чем основано?

aton
()

> и к чему это может привести в случае беспрерывной работы

протрётся дырка в DIMM`е :)

PS а последить за работой программы слабо ? сделать пару-тройку серьёзных прогонов, поиграть с параметрами malloc, глянуть его исходник..

MKuznetsov ★★★★★
()

Если "около 10к" - то ничего плохого, скорее всего, не будет. Плохо будет, если оно совсем-совсем маленькие блоки выделяет (меньше страницы, в этом случае вроде как сдвигается brk-граница, да рабоатет это медленно)

Или, наоборот, много и больших (например, если программе нужно одновременно 20 кусков по 70 мегабайт, и она их постоянно реаллоцирует (скажем, это mmap-окна в огромный файл типа индекса БД) - то шанс, что в какой-то момент последовательного свободного блока достаточного размера не окажется весьма велик, даже пр том, что незанятой (виртуальной) памяти еще дофига.

На вторые грабли наступал лично. Побороть получилось переходом на 64 бита, где проблемы фрагментации виртуальной памяти пока что, вроде как, неактуальны.

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

Последить за работой программы нельзя потому что она ещё пишется, а в инете статьи на тему фрагментации памяти устаревшие только нашёл, потому и спрашивал. Архитектура будет 64битной так что как я понял особых проблем не будет..

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

> Есть некая программа, которая использует почти всю память на машине и довольно часто (сотни раз в секунду) выделяет и удаляет блоки памяти около 10K.

Под это описание подходит ааафигенное количество программ. Будет ли фрагментация, зависит от того, как изменяется в динамике размер блоков. Если не изменяется - то фрагментации быть не должно. Если нарастает - фрагментация будет.

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

> 10K это приблизительный средний размер..

Тогда трудно сказать. Если хотя бы средний размер не меняется - ситуация должноа стабилизироваться на каком-то этапе.

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

> Плохо будет, если оно совсем-совсем маленькие блоки выделяет (меньше страницы, в этом случае вроде как сдвигается brk-граница, да рабоатет это медленно)

как раз маленькие выделения/освобождения будут самыми хорошими -- потому что имплементация malloc может их хорошо оптимизировать

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

>Попробуй, в чём проблема?

1) Нет времени.

2) Я не страдаю от проблемы утечек памяти в Firefox.

3) Будет крайне непродуктивно. Если бы это было близко к тому, чем я занимаюсь сейчас, то пожалуйста. А так куча времени уйдёт на выяснение всяких мелочей.

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

Яподключил какуюто хрень ипа malloc.so и фаервокс теперь не течет

furyz
()

Linux и NT-kernel используют специальные аллокаторы для маленьких объектов фиксированного размера. Дырки от освобожденной памяти не "расползаются" по всей арене, а ограничнены в одном или нескольких блоках большего размера. Если ядерная память и фрагментируется, то очень медленно.

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

Впервые слышу, чтобы ЯДРО занималось аллоцированием памяти, всегда думал, что есть сискол brk(), который просто увеличивает максимальный разрешённый адрес в пространстве процесса. Ядро вообще парралельно, что как процесс распоряжается этой памятью. Самим "выделением" занимаются пользовательские функции.

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

Дядя, я про выделение памяти на свои нужды. Это образец, как надо сделать в своей юзер-ленд программе.

Dr_ZLO
()

> Возможно ли появление фрагментации памяти в таком случае и к чему это может привести в случае беспрерывной работы?

При такой схеме, думаю, возможно это http://www.opennet.ru/openforum/vsluhforumID9/6198.html

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