Насколько портативен mmap? - PullRequest
7 голосов
/ 26 января 2010

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

Можно ли предположить, что mmap работает на этих платформах?

Ответы [ 4 ]

10 голосов
/ 26 января 2010

Функция mmap() является вызовом POSIX. Он отлично работает на MacOS X (и Linux, и HP-UX, и AIX, и Solaris).

Проблемной областью будет Windows. Я не уверен, есть ли вызов _mmap() в подсистеме совместимости POSIX. Скорее всего, он там есть, но будет иметь имя с первым подчеркиванием, потому что у Microsoft есть альтернативное представление о пространствах имен и она рассматривает mmap() для вторжения в пространство имен пользователя, даже если вы запрашиваете функциональность POSIX. Вы можете найти определение альтернативного интерфейса Windows MapViewOfFile() и обсуждение производительности в другом вопросе SO (mmap() против блоков чтения .

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

3 голосов
/ 26 января 2010

Использование mmap для чтения файлов непереносимо, если вы полагаетесь на отображение больших бит больших файлов в ваше адресное пространство - 32-разрядные системы могут легко не иметь ни одного большого доступного пространства - скажем, 1G - доступного адресного пространства, поэтому mmap будет довольно часто терпеть неудачу для отображения 1G.

2 голосов
/ 26 мая 2012

Я считаю, что память сопоставлена ​​с IO в UNIX как непригодный для интерактивных приложений, как это может привести к SIGSEGV / SIGBUS (в случае, если файл был усечен каким-то другим процессом). Игнорирование таких больных "решений", как setjmp / longjmp нет ничего, что можно сделать, кроме как прекратить процесс после получения SIGSEGV / SIGBUS. Новая функция G ++ для преобразования таких сигналов в исключения кажется, предназначен в основном для яблок ОС, поскольку в описании говорится, что для этой функции G ++ требуется поддержка во время выполнения и нигде нет информации об этой функции G ++. Вероятно, нам придется подождать пару лет, пока не будет найдена структурированная обработка исключений, подобная той, которую можно найти в Windows, поскольку более 20 лет попадает в UNIX.

2 голосов
/ 26 января 2010

Принцип отображения файла в память довольно переносим, ​​но у вас нет mmap () в Windows (но существуют такие вещи, как MapViewOfFile ()). Вы можете взглянуть на код модуля python mmap c, чтобы увидеть, как они это делают для различных платформ.

...