LINUX.ORG.RU

Bon Echo Alpha 2 - на пути к Firefox 2.0


0

0

Вышел в свет второй альфа релиз Firefox. Работа в этом релизе была сфокусирована на испытании и тестировании работы ядра с новым функционалом. Релиз доступен для платформ Linux, Windows, Mac OS X.

>>> Подробности



Проверено: ivlad ()

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

>Скажем так - память, выделенная приложению, практически никогда не уменьшается. Если в какой-то момент приложение схавало под свои нужды 200 Мб, то выделенная ему память меньше за данный сеанс уже не станет, сколько бы приложение ни делало free. Просто эти участки памяти будут помечаться как пустые, а при следующей попытке выделения памяти именно эти куски приложению и будут выдаваться. Я, правда, не знаю, что станет, если приложения таким сакаром выжрут всю доступную системе память. glibc таки начнёт урезать выделенную им память или просто приступит к убиению наиболее прожорливых?

Вы любезный видимо как говорят на лоре жабабыдлокодер? Очень точно описано поведение java. Тут товарисч привел программешку - вам в пику. Возьмите 'pmap -d' в зубья и просвещайтесь до опупеоза.

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

>Нажимайте ENTER и смотрите, сколько ест программа. Тем же top'ом :)

Топом не смотрите, а смотрите 'pmap -d' в данном случае writable/private.

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

> даже пресловутый IE в седьмой версии стал больше похож на браузер

в очередной раз убеждаюсь что йоперщики, фарщики и зебатщики - латентные и натуральные вантузятники

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

Кстати, вы не инициализировали элементы массива (в этом случае top показывает только ~300K), это надо сделать так:
  for(i=0;i<16*1024;i++)
  {
    M[i*1024]='c';
  }
  for(i=0;i<1024;i++)
  {
    M1[i*1024]='c';
  }

Я повторяю анонимусам: вы ошибаетесь. Да, эта программа будет освобождать память. 
Но только потому, что выделяется огромный массив: >128K, в этом случае glibc malloc использует mmap.
Если вы попробуете выделять память большим количеством маленьких кусков, то ничего не получится.
А именно так и происходит в firefox.

Пример дать или сами напишите?

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

Да. К сожалению, именно так и получается... :(

#include <stdio.h>
#include <stdlib.h>

int main(int argc,char* argv[])
{
  typedef char* pchar;
  
  pchar M[1024];
  char InBuf[128];
  unsigned int i,j;

  printf("Application just started; ENTER to continue\n");
  gets(InBuf);
  for (i=0;i<1024;i++) {
    M[i]=(char *)malloc(16*1024*sizeof(char));
    for (j=0;j<16;j++) M[i][j*1024]='c';
  }
  printf("Allocated 16 MBytes; ENTER to continue\n");
  gets(InBuf);
  for (i=0;i<1023;i++) free(M[i]);
  printf("15 MBytes freed; ENTER to continue\n");
  gets(InBuf);
  free(M[1023]);
  printf("1 MByte freed; ENTER to exit\n");
  gets(InBuf);
}

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

Кстати, в данном конкретном случае кусков по 16K поможет MALLOC_MMAP_THRESHOLD_=4096 ./test

Но для firefox это не подойдёт, так как там очень маленькими кусками память выделяется (~20 байт).

В предке glibc malloc, dlmalloc, есть возможность использовать только mmap (gcc -DHAVEMORECORE=0).
Но эта возможность, к сожалению, не подкреплена правильными для mmap алгоритмами размещения кусков.

В общем, надо переносить из OpenBSD mmap'нутую реализацию malloc (или писать свою).

Кстати, ни у кого из вас нет знакомых программистов/студентов-программистов,
которые могли бы сделать такую работу?

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

Конечно, аллокатор из OpenBSD libc 3.8/3.9 это не панацея, но всё же значительно превосходит аллокатор glibc по части фрагментации памяти.

Люди! Ищите людей!

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

Может, опять тему в талкс создать? :) Создавать до полного просветления, ещё и ещё, пока все не проголосуют!

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

А смысл? Этим всё равно. Лемминги ничего подобного не замечают, они привыкли приложения перезапускать по многу раз на день. И потом, у них просто: если компьютер тормозит - то обычно винда виновата, так что все шишки всё равно полетят в MS :)

Если уж пинать, то авторов glibc.

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

> Что-то не заметно, чтобы этот g_slice освобождал память :(

А сейчас, видимо, никто этим не заморачивается. Память дешёвая, чего её освобождать? :)

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

Да вот, я подумал может какие другие способы есть. Нашёлся же madvise. Нет, сегодня это не пройдёт.

Одного только не могу понять, к чему относятся слова на том гнумовском сайте:

Note that the following discussions have been obsoleted by the development of the new g_slice API in GLib, which uses ideas from the slab allocator (MatthiasClasen)

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

Получается, что g_slice это просто извращённая обёртка над обычным malloc.

Итак, надо ковырять всё-таки OpenBSD malloc...

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

Возможно, у него также как-то улучшен алгоритм размещения кусков дополнительно к glibc malloc... По исходнику сложно что-то понять. В любом случае, нам он вряд ли поможет.

Эх, где бы найти человека с достаточной квалификацией и свободным временем...

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

> Может, опять тему в талкс создать? :) Создавать до полного просветления, ещё и ещё, пока все не проголосуют!

А кто не проголосует, тому отключим свет и газ (c)

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

А что, firefox на с++ писан, что ли, раз такая проблема с памятью? Похоже, не аллокатор нужно писать, а сборщик мусора/уплотнитель памяти.

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

> что, firefox на с++ писан,

Да.

> Похоже, не аллокатор нужно писать, а сборщик мусора/уплотнитель памяти.

Под windows 2000 проблемы нет, код firefox тот-же самый, но: под wine firefox-win32 не отдает память, так же как и родной ==> проблема в libc.

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

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

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

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

Для этого нужна лишняя прослойка в виде smart-pointers (или как там оно называется), т.е. существенное переписывание всего кода firefox.

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

Да это понятно, что надо писать правильно...

Тут даже не smart-pointers, а что-то типа master-pointers. Интересно, может правда проще переписать реализацию allocator'а, чем править кривой код?

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

Проще. На OpenBSD память ядру возвращается в ожидаемых кол-вах, аллокатор там не использует sbrk(), создает много куч mmap()ом. При free() делается munmap() / mremap().

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