LINUX.ORG.RU
ФорумTalks

Любителям firefox: аллокатор из openbsd


0

0

Осуществлена попытка портирования аллокатора malloc из openbsd на linux с целью уменьшить потребление памяти (точнее, её фрагментацию) такими программами, как firefox.

Скачать подправленный исходник можно здесь: http://mr.himki.net/OpenBSD-malloc.c

Собирать так: gcc -shared -fPIC OpenBSD-malloc.c -o malloc.so, запускать так: LD_PRELOAD=/path/to/malloc.so firefox

Это первая версия портирования и работает нестабильно (а на некоторых компьютерах вообще не работает).

Приглашаются желающие протестировать и доделать.

★★

а вообще странно все это сделано,

мое ИМХО вопрос нужно разделить на два
1)решает ли проблемму?
практика показывает да, теория пока отстает

2)bug free ли реализация.

И в этом вопросе я думаю надо разделить
решение на два, если это возможно,
реализация OpenBSD и сам патч,

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

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

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

да описался,
s/ что об этой странице можно забыть и засовывать ее в своп?/
что об этой странице можно забыть или засовывать ее в своп?/g

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

Изменения простейшие, хотя по неопытности, конечно, я мог где-то умудриться ошибиться =)

Оригинальная версия из cvs была взята здесь: http://www.openbsd.org/cgi-bin/cvsweb/~checkout~/src/lib/libc/stdlib/malloc.c...

А тесты да, надо попробовать. В собственных простых тестах воспроизвести ошибку не удалось.

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

>Изменения простейшие, хотя по неопытности, конечно, я мог где-то умудриться ошибиться =)

хотелось бы что они выкладывались в виде патча,
тогда и ошибки легче найти.

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

>diff 1.c 2.c =) Основные изменения, кстати -- куча отладочных fprintf'ов;-)

вы же представляете свой код для review by community,
не надетесь же вы что они(ну по крайней мере я)
будут брать из cvs, запускать diff и т.д. и т.п.
не проще ли запустить diff -up самому и выложить на сайте результат?

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

Да весь тот код -- несколько строчек, на самом деле :) Ладно, раз всё так серьёзно, завтра сделаю. Спокойной ночи.

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

>Да весь тот код -- несколько строчек

вот и замечательно,
вы предлагаете изучить всю реализацию "malloc" в OpenBSD плюс неизвестно где расположенные ваши правки.

Хотя на самом деле нужно посмотреть всего несколько строчек.

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

Просто там мусор в виде отладочных fprintf...

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

+int issetugid(void)
+{
+if (__libc_enable_secure) return 1;
+if (getuid() != geteuid()) return 1;
+if (getgid() != getegid()) return 1;
+return 0;
+}

почему нельзя написать?
if (a || b || c)
return 1;


+
>+void say(char *s) {
>+while (*s)
>+ fputc(*s++, stderr);
>+fputc('\n',stderr);
>+return;
>+}

почему нельзя использовать
fputs вместо цикла, и зачем это вообще нужно?
почему не назвать ее wrtwarning и сделать static?

>+#define SIZE_MAX 0xffffffff

откуда эта чудесная константа?
а 64битные системы имеют такую же?
почему не взять calloc из BSD тоже или она оттуда?

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

>откуда эта чудесная константа?

Очевидно, больше этого указатель быть не может.

>а 64битные системы имеют такую же?

Наверняка нет.

>почему не взять calloc из BSD тоже или она оттуда?

Надо запускать OpenBSD и смотреть, в каких дебрях она определена. Да, calloc взят из cvs openbsd.

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

>почему не назвать ее wrtwarning и сделать static?

Просто ворнинги происходят именно в том месте, где теперь стоит say. Если вдруг что-то произойдёт в другом месте, то пусть по wrtwarning вылетает. Но в общем всё это несущественно.

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

Ой...

% ./tst-malloc
blin2 [] ~/save/build/malloc 06-06-19  5:48
% LD_PRELOAD=/home/andrei/prog/alloc/malloc.so ./tst-malloc
Error: realloc (p, 0) failed.
Error: realloc (p, 0) failed.

mr ★★
() автор топика

В нормальных дистрах это не нужно ;-)

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

>почему нельзя использовать fputs вместо цикла,

Напр., потому что fputs (_IO_fputs, точнее) сама вызывает несколько ф-ций.

fputc -- просто макрос и ф-ций не вызывает, поэтому с ним спокойнее.

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

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

Cy6erBr4in ★★★
()

практическую ценность теперь напишите :-)

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

>Напр., потому что fputs (_IO_fputs, точнее) сама вызывает несколько ф-ций.
спокойнее в каком смысле?

>fputc -- просто макрос и ф-ций не вызывает, поэтому с ним спокойнее.

т.е. совсем ничего не вызывает? и каким же чудесным образом он что-то выводит?

ЗЫ

для меня этот пост звучит как бред,
можете объяснить попродробнее?

ЗЫ ЗЫ


$ cd /usr/include/
$ grep fputc *.h
stdio.h:extern int fputc (int __c, FILE *__stream);
stdio.h:extern int fputc_unlocked (int __c, FILE *__stream);

макрос?

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

2mr:

> Вообще не понимаю причину спора. ...

Никто ни с чем и не спорит.

Предлагаю мигрировать в Development.

Я открываю там топик, в Development -- "Фрагментация памяти в FireFox (?) и как бороться". Кто тут остался -- ссзб.

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

Ну и закрой на четыре звезды, там оно правда лучше пойдёт.

P.S. Слежу с интересом. :)

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

> спокойнее в каком смысле?

что она сама не вызовет *alloc :)

> макрос?

гоню, конечно нет. вызывает write. А fputs вызывает много непонятного по дороге.

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

>странно... собрал... запустил как сказанно... смотрю в top... и что я вижу... памть берётся... но не отдаётся... что не так? Как можно проверить, используется ли этот алокатор а не стандартный? в консоли ошибок нет.

Для начала, в функцию malloc() вставь что-то типа:
fprintf(stderr,"%s called malloc()! ",__progname);

Всё должно стать понятно :)

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

>гоню, конечно нет. вызывает write. А fputs вызывает много непонятного по >дороге.

это есть где-нибудь в стандарте? по-моему просто неразумно использовать в таком случае использовать что-либо из stdio.

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

Ой, давайте не будем спорить по этой ерунде. Да, лучше просто сдеать fprintf(stderr,"message") и дело с концом.

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

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

>по-моему просто неразумно использовать в таком случае использовать что-либо из stdio.

конечно.

#include<unistd.h>

void say (char *s) { unsigned int l; if (!s) return; for (l = 0; s[l]; l++); if (l) write(2,s,l); return; }

> это есть где-нибудь в стандарте?

...libc/libio/fputc.c:

int fputc (c, fp) int c; _IO_FILE *fp; { int result; CHECK_FILE (fp, EOF); _IO_acquire_lock (fp); result = _IO_putc_unlocked (c, fp); _IO_release_lock (fp); return result; }

...libc/libio/libio.h:

#define _IO_putc_unlocked(_ch, _fp) \ (_IO_BE ((_fp)->_IO_write_ptr >= (_fp)->_IO_write_end, 0) \ ? __overflow (_fp, (unsigned char) (_ch)) \ : (unsigned char) (*(_fp)->_IO_write_ptr++ = (_ch)))

skip ... skip .. skip А overflow вызывает наконец write().

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