Избегайте копирования данных между пользователем и пространством ядра и наоборот - PullRequest
3 голосов
/ 04 мая 2010

Я разрабатываю протокол активных сообщений для параллельных вычислений, который заменяет TCP / IP. Моя цель - уменьшить задержку пакета. Поскольку среда представляет собой локальную сеть, я могу заменить TCP / IP более простым протоколом, чтобы уменьшить задержку пакетов. Я не пишу какой-либо драйвер устройства и просто пытаюсь заменить стек TCP / IP на что-то более простое. Теперь я хотел избежать копирования данных пакета из пространства пользователя в пространство ядра и и наоборот . Я слышал о ММАП (). Это лучший способ сделать это? Если да, было бы хорошо, если бы вы могли дать ссылки на некоторые примеры. Я новичок в Linux, и я очень ценю вашу помощь .. Спасибо ...

Спасибо, Bala

Ответы [ 2 ]

3 голосов
/ 04 мая 2010

Вы должны использовать UDP, это уже довольно быстро. По крайней мере, это было достаточно быстро, чтобы W32 / SQLSlammer распространился по всему интернету.

О вашем начальном вопросе см. Системные вызовы (vm)splice и tee Linux.

С справочной страницы:

Три системных вызова splice (2), vmsplice (2) и tee (2)), предоставьте пользовательские программы с полным контролем через произвольный буфер ядра, реализовано в ядре с помощью тот же тип буфера, который используется для трубы. В общих чертах, эти системы звонки выполняют следующие задачи:

сращивания (2)

  moves data from the buffer to an arbitrary file descriptor, or vice

наоборот или из одного буфера в другой.

тройник (2)

  "copies" the data from one buffer to another.

vmsplice (2)

  "copies" data from user space into the buffer.

Хотя мы говорим о копировании, фактическое Копий, как правило, избегают. Ядро делает это путем реализации труба буфера как набор подсчитанные ссылками указатели на страницы память ядра. Ядро создает «копии» страниц в буфере создание новых указателей (для вывода буфер) со ссылкой на страницы, и увеличение количества ссылок для страницы: копируются только указатели, не страницы буфера.

0 голосов
/ 04 мая 2010

Поскольку среда представляет собой локальную сеть, я могу заменить TCP / IP более простым протоколом, чтобы уменьшить задержку пакетов

Как правило, даже в локальной сети UDP пакеты, как правило, теряются, также они будут потеряны, если клиент не хватает времени на его употребление ...

ТАК нет, не заменяйте TCP на что-то другое (UDP). Потому что, если вам нужна надежная доставка, TCP будет самым быстрым (потому что все, что связано с подтверждениями и повторной передачей, выполняется в пространстве ядра).

Обычно в обычном случае нет недостатков задержки при использовании TCP (конечно, не забудьте параметр TCP_NODELAY)

О совместном использовании памяти. Фактически вся выделенная вами память создается с помощью mmap. Поэтому ядро ​​должно будет каким-то образом копировать его в любом случае, когда оно создает пакет из драйвера.

Если вы говорите о сокращении копирования, это обычно делается для файлов / сокетов и sendfile() используется, что действительно предотвращает копирование данных между ядром и пользователем. Но я предполагаю Вам не нужно отправлять файлы.

...