Сначала я расскажу об окружении моего ПК, предыстории моего вопроса, моей проблеме, затем я объясню свой точный вопрос.
Окружающая среда:
ОС: Ubuntu 16.04
Ядро: 4.17.1
ЦП: i7-6700k
Память: 8 ГБ DRAM
Хранилище: SSD 120 ГБ
Предыстория:
я пытаюсь оптимизировать ядро Linux для своего конкретного приложения. Ниже приведена абстрактная логика этого приложения.
1. Вызвать malloc, выделить пространство памяти, размер которого ровно 4 КБ (размер страницы)
2. Скопировать предопределенные данные (также, размер 4 КБ) в выделенное пространство памяти.< br> 3. Выполнение вычислений
4. Освобождение выделенного пространства памяти.
Эта последовательность повторяется примерно от нескольких тысяч до десяти тысяч раз в секунду. Поэтому я подумал, что копировать предопределенные данные в выделенное пространство памяти с помощью memcpy() тысячи раз в секунду очень неэффективно. Но я не могу исправить код этого приложения.
Моя проблема:
Я хочу делать эти копии асинхронно с помощью модуля ядра, используя как можно меньше циклов процессора. Итак, я пытаюсь реализовать модуль ядра, который асинхронно копирует эти предопределенные данные в свободные кадры страниц в ядре и управляет кадрами страниц пула, на которых есть предопределенные данные. Когда мое конкретное приложение запрашивает кадр страницы, мое ядро выдает кадр страницы из этого пула.
Для асинхронного копирования данных я сначала рассматривал DMA, но Intel idma64 моего процессора не может асинхронно копировать данные из памяти в память. Теперь я пытаюсь скопировать эти данные из вторичного хранилища (SSD) в память. Я обнаружил, что в Linux есть библиотека для асинхронного ввода-вывода с именем libaio.
Мой вопрос:
1. Могу ли я использовать библиотеки libaio в модуле ядра? Если нет, то какую библиотеку или API мне нужно использовать для асинхронного копирования в моем модуле ядра?
2. Будет ли libaio (или что-то еще) действительно копировать без использования циклов ЦП?
gprof
илиperf
для профилирования вашего приложения, чтобы точно увидеть, на что тратится время.memcpy
из 4 КБ на этом процессоре должно быть меньше микросекунды. - person Mike Andrews   schedule 24.06.2018