Главная страница


ru.linux

 
 - RU.LINUX ---------------------------------------------------------------------
 From : Kirill Frolov                        2:5030/827.2   06 Dec 2003  15:43:14
 To : Valentin Nechayev
 Subject : Re: дефрагментация ex3 -- номер #2
 -------------------------------------------------------------------------------- 
 
 
 On Fri, 05 Dec 03 12:29:33 +0300, Valentin Nechayev wrote:
 
  KF>>    Память выжрата мелкими кусками, или блоки на диске (тоже память...)
  KF>> теми же самыми кусками -- принципиальной разницы нет.
  VN> Собственно фрагментацию-то ты не показал. А съесть какое-то количество
  VN> памяти мелкими кусками - нормальная рабочая ситуация.
 
     Фрагмент -- это ли не мелкий кусок? 
 
  KF>>    Я её из книжки передрал. В линухе эта программа не работает как
  KF>> надо. Догадываюсь, что линух имеет malloc() сильно отличный чем описан у
  KF>> того-же Кнута (там фрагментируется "на ура").
  VN> Я не знаю, что ты откуда передирал и кто чего испортил, но в таком виде она
  VN> просто ничего не будет показывать - в ней логические ошибки.
 
    Ошибки есть везде!  
 
  VN> Показывало бы, например, вот такое:
  VN> здесь выделяем память кусками по байту. Hадо перед запуском установить
 
    По байту ты выжрешь память на управляющие структуры malloc().
 Так не честно. А вот смотри, что:
 
 #include <stdlib.h>
 #include <stdio.h>
 
 long limit = 0;
 long incr = 50;
 
 long mrand(long max)
 {
   return (long)((double)max*rand()/RAND_MAX);
 }
 
 int main (int argc, char *argv[])
 {
 long alloc=0, total=0, piece=1;
 
 if (argc<=1)
 fprintf(stderr, 
     "usage: %s <limit (bytes)> [piece_increment (bytes)]\n", 
   argv[0]
 ), exit(0);
 
 do {
 if (argc>1)
 if (sscanf(argv[1], "%ld", &limit)!=1) 
   break;
 if (argc>2)
 if (sscanf(argv[2], "%ld", &incr)!=1)
   break;
 
 do {
 void *x, *y; long size;
 
 do {
 
 #if 1
 if (x=malloc((size=piece+incr-incr, size)), x==0) break;
 total+=size;
 size=piece; y=malloc(size); if (y==0) break;
 piece+=incr;
 
 #else
 if (x=malloc((size=1+mrand(incr), size)), x==0) break;
 total+=size;
 if (y=malloc((size=mrand(incr)+incr, size)), y==0) break;
 #endif
 
 } while(0);
 if ((x==0) || (y==0)) {
     fprintf(stderr, "can't allocate %ld bytes\n", size); break;
 }
 
 total+=size;
 alloc+=size;
 free(x);
 } while (total<=limit);
 
 printf("limit=%ld, piece=%ld, incr=%ld\n", limit, piece, incr);
 printf("total=%ld, allocated=%ld\n", total, alloc);
 exit (0);
 
 } while(0);
 fputs("invalid argument\n", stderr), exit(1);
 return 1;
 }
    Ставить ulimit -v 65536 и запускать ./aout 2000000000 100.
 Примерно, где-то 32Мб выделяется, а половина теряется неизвестно куда.
 Вот тебе и фрагментация. И что интересно: это работает в linux
 (libc 2.2.5), и в pacific-c досовом (там malloc как раз на уровне
 80-х годов прошлого века). А в Watcom-C 11-й версии не работает,
 в смысле ничего не фрагментируется. И с rand() нигде не фрагментируется
 толком тоже, а в книжке ещё более страшная ошибка: там rand() может 0
 давать -- malloc() тоже NULL и программа останавливается будто памяти
 нет...  (может авторы это за фрагментацию и приняли?)
 
  VN> По тому, что я слышал про glibc malloc, он такое отрабатывает хорошо.
 
    Оказывается, плохо. Только не надо говорить, что дескать в реальных
 задачах не встречается...  Меряться фрагментацией -- тоже реальная
 задача.
 
  VN> страницу на такой блок с неиспользованием хвоста страницы, и эффективность
  VN> использования будет около 50%.
 
    Во-во. Куча фрегментов, около 50%, и никак они не объединяются в один
 бОльший. Разумеется, при условии, что их размер меньше 4096 байт.
 
 --- [ZX]
  * Origin: в жизни смысла нет (2:5030/827.2)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Re: дефрагментация ex3 -- номер #2   Kirill Frolov   06 Dec 2003 15:43:14 
Архивное /ru.linux/38331b5383b0.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional