Что следует использовать mmap, malloc или File I / O - PullRequest
0 голосов
/ 04 ноября 2018

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

Вопрос Каков предпочтительный способ чтения небольшого файла, который используется многими недолговечными процессами? В настоящее время мы используем File I / O (fopen, fread)

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

1 Ответ

0 голосов
/ 04 ноября 2018

Каков предпочтительный способ чтения небольшого файла, который используется несколькими недолговечными процессами?

getline() или fread() с использованием стандартного ввода-вывода POSIX от <stdio.h> или низкого уровня <unistd.h> open() и read() в достаточно большой буфер (при достаточно агрессивной политике роста); в зависимости от того, как прочитанные данные анализируются / интерпретируются.

Вы не используете отображение памяти для чтения файла один раз; это просто не так эффективно, как read() / fread(), из-за затрат на отображение.

Обратите внимание, что если файл содержит много чисел, фактическим узким местом является преобразование строки в целое и строки в число с плавающей запятой (strtol(), strtod(), sscanf() и т. Д.), Потому что если доступ к файлу достаточно часто останется в кеш страницы Стандартные реализации функций преобразования строк предназначены для корректности, а не для эффективности.

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

Мне кажется, очень неэффективно. Лично я сохранил бы «файл» в ядре как структуру и предоставил бы только интерфейс пользовательского пространства, возможно, символьное устройство, для изменения его содержимого.

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

Это то, что, например, netfilter (встроенный брандмауэр) и другие существующие вещи делают.

...