Не понимаю. Есть прога, активно резервирующая и коммитающая память с
помощью 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)
- Форум Утилита для изменения аптайма (2008)
- Форум Копирование фрагмента файла - учебная программа (2015)