|
|
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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/38331b5383b0.html, оценка из 5, голосов 10
|