2009-07-27 4 views

ответ

4

Все указатели, которые хранятся внутри области mmap'd, должны выполняться как смещения от основания области mmap'd, а не как реальные указатели! Вы не обязательно получите один и тот же базовый адрес, когда вы нажмете регион на следующий прогон программы. (Мне пришлось очистить код, который сделал неправильные предположения о постоянстве адресного адреса mmap region).

3

Обязательно проверьте наличие ограничений на размер открытого файла или использование памяти. В Linux есть встроенная команда оболочки ulimit. Запустите как ulimit -a, чтобы просмотреть текущие настройки.

Flush записывает в массив памяти в файл с помощью системного вызова msync (2), иначе они могут оставаться в памяти до munmap (2), и может произойти перерыв в электропитании или что-то еще до этого!

Если несколько процессов имеют одинаковые области памяти, разделяемые с привилегиями чтения и записи, убедитесь, что за один раз записывается только одно, чтобы не повредить ваши данные. Или используйте блокировку файлов или некоторые другие средства синхронизации.

+0

Промывка не требуется, поскольку данные постоянны. –

3

Это самый прямой вариант использования для mmap(), поэтому вам не должно быть много, чтобы вас тронуть.

Вы фактически просто загружаете большой постоянный массив. Будучи постоянными, вам не нужно беспокоиться о синхронизации. Было бы желательно убедиться, что параметр prot установлен в PROT_READ только с тех пор, как вы не будете писать.

Если одна или несколько программ, использующих константы, будут постоянно выполняться, может быть целесообразно иметь отдельную программу, которая загружает данные и сохраняет их. Запуск других программ, по сути, просто выполняет добавление разделяемой памяти, а не постоянно считывает файл в память.

Смежные вопросы