Я думаю, что самая большая вещь в mmap - это возможность асинхронного чтения с:
addr1 = NULL;
while( size_left > 0 ) {
r = min(MMAP_SIZE, size_left);
addr2 = mmap(NULL, r,
PROT_READ, MAP_FLAGS,
0, pos);
if (addr1 != NULL)
{
/* process mmap from prev cycle */
feed_data(ctx, addr1, MMAP_SIZE);
munmap(addr1, MMAP_SIZE);
}
addr1 = addr2;
size_left -= r;
pos += r;
}
feed_data(ctx, addr1, r);
munmap(addr1, r);
Проблема в том, что я не могу найти нужные MAP_FLAGS, чтобы дать подсказку, что эта память должна быть синхронизирована из файла как можно скорее.
Я надеюсь, что MAP_POPULATE дает правильную подсказку для mmap (то есть он не будет пытаться загрузить все содержимое до возврата из вызова, но сделает это в асинхронном режиме с feed_data). По крайней мере, это дает лучшие результаты с этим флагом, даже если руководство заявляет, что ничего не делает без MAP_PRIVATE начиная с 2.6.23.