C / C ++ Linux: самая быстрая запись фиксированного фрагмента памяти в файл (1 Гц) - PullRequest
7 голосов
/ 12 октября 2011

В системе Linux у меня есть один 7 МБ фрагмент памяти фиксированного размера (без увеличения), содержимое которого я обновляю в приложении реального времени.

Мне нужно записывать этот кусок памяти на диск (один и тот же файл) один раз в секунду.

С учетом современных (на конец 2011 года) процессоров и жестких дисков, каков наиболее эффективный способ реализации этой функции? Меня не волнует, действительно ли запись занимает некоторое время, но, поскольку это приложение реального времени, мне нужно как можно скорее вернуться к работающему приложению.

Какие методологии мне следует попробовать?

Моя базовая линия - это стандартный базовый цикл fopen (), двоичный цикл fwrite (), fclose ().

Я прочитал, что mmap () может быть полезным. Может быть асинхронный ввод / вывод? Существуют ли другие методологии, которые я должен сравнивать? Как вы считаете, какая методология будет наиболее быстрой?

Ответы [ 2 ]

9 голосов
/ 12 октября 2011

mmap(2) это путь.Просто позвоните msync(2) с MS_ASYNC, если хотите написать.

1 голос
/ 12 октября 2011

Я бы объединил два упомянутых подхода: я бы использовал mmap для сопоставления памяти с файлом, а затем настраивал отдельный поток (с более низким приоритетом), чтобы msync это каждую секунду.(В этом случае фактические аргументы msync не слишком важны; вам не нужно MS_ASYNC, поскольку вы не будете блокировать основной поток.) ​​

Возможно, стоит попробовать еще одну альтернативу:быть асинхронным IO.Однако из моей документации мне не ясно, что произойдет, если вы никогда не восстановите результаты, поэтому вам может понадобиться какой-то код переписчика, чтобы предотвратить потерю ресурсов.(Асинхронный ввод-вывод в Posix, по-видимому, недостаточно указан, что, по-моему, является хорошим поводом для его избежания.)

...