Не понимаю. Есть прога, активно резервирующая и коммитающая память с помощью mmap. Нужно заранее определить, не вызывая mmap, что памяти маловато. Но как?! Вызов sysconf(_SC_AVPHYS_PAGES), похоже, никакого отношения к mmap не имеет. Вот моя программулина. Когда она падает, sysconf утвержает, что доступно 104055 страниц. Тем не менее, reserve зарезервировать память не может... #include <sys/mman.h> #include <assert.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> const size_t PAGE_SIZE = 0x1000; const size_t RESERVE_AMOUNT = 64*1024*1024; const size_t COMMIT_AMOUNT = 256*1024; typedef struct Region { size_t uncommited; void *reserved_base; void *uncommited_base; } Region; void cat(const char *filename) { char buf[1024]; FILE *f; size_t rd; printf("----- %s -----\n", filename); f = fopen(filename, "rb"); assert(f != NULL); while((rd = fread(buf, 1, sizeof(buf), f)) > 0) write(1, buf, rd); fclose(f); } void Exit(int code) { cat("/proc/self/maps"); cat("/proc/meminfo"); exit(code); } void *Malloc(size_t size) { void *mem = malloc(size); if(mem == NULL) { perror("malloc"); Exit(1); } return mem; } void *reserve(size_t size) { void *mem; assert(size % PAGE_SIZE == 0); printf("Reserving %d KB (%ld pages free)... ", size / 1024, sysconf(_SC_AVPHYS_PAGES)); fflush(stdout); mem = mmap(NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_NORESERVE | MAP_ANONYMOUS, -1, 0); assert(mem != NULL); if(mem != MAP_FAILED) printf("OK, base address is %p\n", mem); else printf("FAILED\n"); fflush(stdout); return mem; } int commit(void *adr, size_t size) { void *a; assert(size % PAGE_SIZE == 0); printf("Commiting %d KB at %p (%ld pages free)... ", size / 1024, adr, sysconf(_SC_AVPHYS_PAGES)); fflush(stdout); a = mmap (adr, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS, -1, 0); assert ((a == MAP_FAILED) || (a == adr)); if(a != MAP_FAILED) printf("OK\n"); else printf("FAILED\n"); return a != MAP_FAILED; } int main() { Region *map = NULL; int pass_count = 0; for(;;) { printf("----- Pass %d -----\n", pass_count++); fflush(stdout); map = Malloc(sizeof(Region)); if((map->reserved_base = reserve(RESERVE_AMOUNT)) == MAP_FAILED) { perror("mmap"); Exit(1); } map->uncommited_base = map->reserved_base; map->uncommited = RESERVE_AMOUNT; while(map->uncommited > 0) { if(!commit(map->uncommited_base, COMMIT_AMOUNT)) { perror("mmap"); Exit(1); } map->uncommited -= COMMIT_AMOUNT; ((char*)map->uncommited_base) += COMMIT_AMOUNT; } } return 0; }
Ответ на:
комментарий
от cvv
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от cvv
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от cvv
Ответ на:
комментарий
от cvv
Ответ на:
комментарий
от cvv
Ответ на:
комментарий
от cvv
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от cvv
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от cvv
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от cvv
Ответ на:
комментарий
от cvv
Ответ на:
комментарий
от cvv
Ответ на:
комментарий
от cvv
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от cvv
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум Не понимаю с mmap.. (2005)
- Форум non-blocking write (2011)
- Форум Переход от LinuxThreads к NTPL (2004)
- Форум Программа на Си падает, при выделении памяти (2014)
- Форум Возвращаясь: Семафоры в Red Hat 9.0 (2004)
- Форум Не понимаю почему не работает (2013)
- Форум [C] malloc (2010)
- Форум вопрос про select() (2013)
- Форум Копирование фрагмента файла - учебная программа (2015)
- Форум Утилита для изменения аптайма (2008)