Боюсь, что нет, сам бы хотел почитать. Если у меня и есть на уме какие-то алгоритмы, то разве что придуманные мной самим. А как работает openbsd аллокатор, я не изучил, на него кажись доков нету и комментариев в коде совсем мало :(
Тогда нужно тестирование аллокатора. Поскольку основное подозрение теперь падает не на сам аллокатор, а на gtk, прежде всего glib, то надо выводить версии glib/gtk.
Я проверил на втором своём компьютере, и кажется, теперь всё понятно.
Там стоят glib 2.8.3 и glib 2.9.6-1, причём .so последней были установленны в /usr/local/lib/. И в конфиге shell'а у меня стоял export LD_LIBRARY_PATH=/usr/local/lib. (Теперь понятно, почему и на этом компьютере были ворнинги). Я запомнил сеанс firefox, в котором всегда воспроизводятся ворнинги -- так вот, после комментирования той самой строчки и перезапуска shell (т.е. когда libglib-2.0.so берётся из обычного каталога, т.е. версии 2.8.3) воспроизвести ворнинги не удаётся! Я повторил это (комментирование и раскомментирование) несколько раз и надёжно в этом убедился.
Итак, сомнений в моём случае теперь нет -- ворнинги вызываются ошибочной glib.
glib2-2.10.3, libgtk+2-2.8.18 (ALT Sisyphus 01.04.2006)-- есть warnings, mozilla не работает, программы, использующие только glibc -- работают там же. Там же: kdelibs-3.5.3 -- ничего из КДЕ не работает.
У zov работало без warnings с gtk+-1.2.10 + glib-1.2.10, gtk+2-2.4.14 + glib2-2.4.8 (ALT Master 2.4),
kde работал в slackware 10.2 без warnings вообще.
Возможно, openbsd-malloc можно использовать для ловли ошибок в программах.
Утверждалось, что использование аллокатора OpenBSD позволило поймать ошибки в XFree86/X.org, ссылку на вскидку не приведу.
>Тогда нужно тестирование аллокатора. Поскольку основное подозрение теперь падает не на сам аллокатор, а на gtk, прежде всего glib, то надо выводить версии glib/gtk.
В последних glib появилась есть такая хрень по эффектиквной работе с памятью GSlice. Может, какие-то конфликты в этой части?
Даже не понятно, как она используется в других функциях glib. Кстати, у меня при запуске k3b (!) падает с такой ошибкой (с обычным аллокатором, конечно):
>>Тогда нужно тестирование аллокатора. Поскольку основное подозрение теперь падает не на сам аллокатор, а на gtk, прежде всего glib, то надо выводить версии glib/gtk.
>В последних glib появилась есть такая хрень по эффектиквной работе с памятью GSlice. Может, какие-то конфликты в этой части?
>Я когда смотрел gslice, вообще не понял, что это вообще такое. Надстройка над обычным malloc какая-то. Что именно она делает -- непонятно.
Могу дать только примерное направление, где искать. Я вскользь поинтересовался этим gslice, когда вышел обзор Gnome 2.14 (вот этот обзор. См. заголовок GSlice). Знаю, что этот механизм они применили и в части отображения шрифтов, так как получили якобы значительное ускоерние при выделении одинаковых по размеру участков памяти (что это значит, я пока не осознаю). Насколько я понимаю, это не совсем обвязка вокруг malloc. Там есть переменная окружения G_SLICE, котрую если установить в always-malloc, то gslice становится обвязкой к malloc, а если не установлена, то он работает не с malloc, а самостоятельно. Но все это проверять надо -- я за слова не отвечаю. Просто что-то где-то видел. :)
ФФ он и под виндой памяти кушает немеряно и не отдает. Ваша версия о плохом аллокаторе памяти glibc и(или) ошибке связанной с glib как совмещается с одинаковыми проблемами памяти на двух платформах ?
А, т.е. оно используется только для маленьких переменных. Когда я смотрел, у меня получалось, что оно работает как обычный malloc (результат освобождения, напр., зависел от MALLOC_MMAP_THRESHOLD_), но я смотрел для больших аллокаций...
В любом случае, этот gslice просто не имеет права быть привязанным к конкретному аллокатору, glibc malloc. Значит, надо проверить его и если окажется, что это он виноват, то слать bugreport разработчикам glib.
Просто может быть, что в новых версиях glib что-то другое неправильно работает, хотя именно на gslice основное подозрение...
Под какой именно вендой? У них у всех библиотеки разные. zov говорил, что под windows 2003 server память firefox отдаёт хорошо. Я проверял на windows-xp-sp2, там firefox память отдаёт, но не очень хорошо.
Дня три погонял систему с export LD_PRELOAD=malloc.so в основном профиле. Серьёзных проблем не заметил: только периодические pagefree_pages: pointer to wrong да ещё какой-то сбой kdeinit при загрузке KDE, но вроде все остальные программы работают.
>Да, возможно, что это не из-за ошибки в glib, надо попробовать!
только есть маленькая такая проблема:
x86-openbsd1:~$ man memalign
man: no entry for memalign in the manual.
x86-openbsd1:~$ man posix_memalign
man: no entry for posix_memalign in the manual.
x86-openbsd1:~$ uname -a
OpenBSD ... 3.8 GENERIC#138 i386
Сейчас это windows 2003 server. Я не знаю, что было у других, но у меня он одно время больше полугига спокойно отжирал и не отдавал. В основном проблены начинаются когда открываешь новой окно, в то время, когда в старом уже открыто много вкладок. Так же ФФ себя вел и под ХР.
Сейчас я немного поменял его поведение через confi.trim_on_minimize, но все равно память не отдает.
Стоп. Под *BSD KDE 3.5.* и свежие glib2, gtk2 есть? Тогда проще посмотреть на патчи, которые в OpenBSD применяются при сборке KDE/glib/gtk из портов. Недостающие в OpenBSD ф-ции в патчах реализованы скорее всего.
>Стоп. Под *BSD KDE 3.5.* и свежие glib2, gtk2 есть? Тогда проще посмотреть на патчи, которые в OpenBSD применяются при сборке KDE/glib/gtk из портов. Недостающие в OpenBSD ф-ции в патчах реализованы скорее всего.
Это хуже, потому что тогда придется пачить все эти библиотеки. Лучше уж добивать glibc недостающим, ИМХО.
Так ведь не ломается -- может он и при попадании free в середину куска правильно освобождает? Хотя вообще не спорю, этот posix_memalign чисто затравочный, надо писать настоящий.
>Так ведь не ломается -- может он и при попадании free в середину куска >правильно освобождает?
скорее объяснение состоит в том, что в случае glibc posix_malloc адресс был совршенно левый и реализация смогла это отследить, а вот в варианте когда уже собственный malloc используется,
проверка на дурака не работает, и как при этом ломаются внутринние структуры
один черт знает.
ЗЫ
может вынести обсуждение в список рассылки OpenBSD,
возможно уже есть готовая реализация? google правда ее не находит.
По моему опыту, основные механизмы разрушения кучи -- когда с массивом на 1 лопухнулись, и перетерся заголовок следующего свободного чанка в пуле.
Можно попробовать распределять на 16 байт больше, и отдавать со смещеним в 8 байт, чтобы концы подстраховать (соответственно, free освобождает адрес-8). Если падения прекратятся, то все ясно...
>огда проще посмотреть на патчи, которые в OpenBSD применяются при сборке >KDE/glib/gtk из портов.
какие-то накладывают, но это не имеет отношение к posix_memalign,
configure glib проверяет есть ли эта функция, и если дана собирается
одна часть кода, если нет другая(она использует valloc в случае *BSD).
>может вынести обсуждение в список рассылки OpenBSD,
возможно уже есть готовая реализация? google правда ее не находит.
Уже писали одному из разработчиков, по имени Otto Moerbeek:
>>Dear Mr. Moerbeek,
>>
>> I wonder if I could ask you a question about the OpenBSD memory allocator.
>> It is not a secret that OpenBSD allocator is good for such programs as
>> firefox.
>> Unfortunately my main work system is Linux.
>> Is there a version of this allocator for Linux OS? (or may be you know about
>> other similar allocators existing on this OS?)
>>
>> Thank you in advance.
There's no version for Linux. Also, we very much depend on the
randomization features in the mmap(2) system call.
-Otto
Так вроде с той posix_memalign с firefox нет никаких ворнингов и сам firefox на вид работает нормально. А если ты имеешь ввиду то, что kde 3.5 не работает, то это не понятно почему. В общем, ещё надо потестировать...
>Уже писали одному из разработчиков, по имени Otto Moerbeek:
возможно возникло недопонимание, я не имел ввиду портирование,
моя враза относилась к posix_memalign,
я имел ввиду реализация posix_memalign для OpenBSD,
судя по всему в cvs ее нет.