Подтвердить что ты не робот

Неужели в Дарвине нет никакого перехвата?

Я пытаюсь выяснить, как переназначить файлы с отображением памяти на Mac (когда я хочу расширить доступное пространство).

Я вижу, что наши друзья в мире Linux имеют mremap, но я не могу найти такую ​​функцию в заголовках на моем Mac. /Developer/SDKs/MacOSX10.6.sdk/usr/include/sys/mman.h имеет следующее значение:

  • mmap
  • mprotect
  • msync
  • munlock
  • munmap
  • но не mremap

man mremap подтверждает мои страхи.

В настоящее время мне нужно munmap и mmmap, если я хочу изменить размер отображаемого файла, что приводит к аннулированию всех загруженных страниц. Должен быть лучший способ. Конечно?

Я пытаюсь написать код, который будет работать на Mac OS X и Linux. Я мог бы согласиться на макрос, чтобы использовать лучшую функцию в каждом случае, если бы мне пришлось, но я бы предпочел сделать это правильно.

4b9b3361

Ответ 1

Вы можете ftruncate файл на большой размер (создание отверстия) и mmap все это. Если файл является постоянным, я рекомендую заполнить отверстие с помощью вызовов записи, а не путем записи в сопоставлении, так как в противном случае блоки файлов могут быть излишне фрагментированы на диске.

Ответ 2

Если вам нужно сжать карту, просто munmap часть в конце, которую вы хотите удалить.

Если вам нужно увеличить карту, вы можете mmap правильно смещать с MAP_FIXED на адреса, расположенные над старой картой, но вам нужно быть осторожным, чтобы вы не сопоставляли что-то еще что уже там...

Вышеприведенный текст под аутом - ужасная идея; MAP_FIXED является принципиально неправильным, если вы уже не знаете, что на целевом адресе и хотите его атомарно заменить. Если вы пытаетесь оппортунистически отобразить что-то новое, если диапазон адресов свободен, вам нужно использовать mmap с запрошенным адресом, но без MAP_FIXED и посмотреть, удастся ли ему и вы получите запрошенный адрес; если это удастся, но с другим адресом, вы захотите развязать новое сопоставление, которое вы только что создали, и предположите, что выделение по запрошенному адресу невозможно.

Ответ 3

Если вы развернете достаточно большие куски (скажем, 64 МБ, но это зависит от того, насколько быстро он растет), то стоимость аннулирования старой карты незначительна. Как всегда, ориентир перед тем, как приступить к проблеме.

Ответ 4

У меня нет опыта с сопоставлением памяти, но похоже, что вы можете временно сопоставить один и тот же файл дважды, как средство для расширения отображения, не теряя ничего.

int main() {
    int fd;
    char *fp, *fp2, *pen;

      /* create 1K file */
    fd = open( "mmap_data.txt", O_RDWR | O_CREAT, 0777 );
    lseek( fd, 1000, SEEK_SET );
    write( fd, "a", 1 );

      /* map and populate it */
    fp = mmap( NULL, 1000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0 );
    pen = memset( fp, 'x', 1000 );

      /* expand to 8K and establish overlapping mapping */
    lseek( fd, 8000, SEEK_SET );
    write( fd, "b", 1 );
    fp2 = mmap( NULL, 7000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0 );

      /* demonstrate that mappings alias */
    *fp = 'z';
    printf( "%c ", *fp2 );

      /* eliminate first mapping */
    munmap( fp, 1000 );

      /* populate second mapping */
    pen = memset( fp2+10, 'y', 7000 );

      /* wrap up */
    munmap( fp2, 7000 );
    close( fd );
    printf( "%d\n", errno );
}

Выходной сигнал zxxxxxxxxxyyyyyy.....

Я полагаю, что если вы натолкнетесь на это, возможно, выйдет из адресного пространства быстрее, чем с помощью mremap. Но ничто не гарантируется в любом случае, и с другой стороны это может быть безопасно.