Планирование прямого доступа к памяти (DMA) в многопоточном приложении - PullRequest
3 голосов
/ 28 февраля 2012

Я хотел бы использовать DMA для ускорения сетевого ввода-вывода (интенсивное чтение с диска и вывод через Интернет).Интересно, есть ли у меня многопоточное приложение, в котором каждый поток выдает передачи DMA? Как операционные системы планируют передачу дискового ввода-вывода и DMA?

Насколько я понимаю, ядро ​​загружает необходимую часть данныхв ОЗУ с диска без пользовательской программы и выдает передачу DMA.Следовательно, дисковый планировщик мало поможет (только один процесс ядра всегда обращается к диску).Также могу ли я надеяться, что есть какие-либо средства в ядре для планирования передач DMA, когда для данных, которые были загружены в память?

1 Ответ

3 голосов
/ 10 сентября 2012

Сетевой драйвер уже будет использовать DMA для ускорения передачи. Когда вы запускаете write, ядро ​​выделяет непрерывный блок физической памяти и копирует данные из буфера пользовательского пространства в эту память. На этом этапе ядро ​​подключит все необходимые заголовки Ethernet и TCP / IP.

Затем ядро ​​выдаст запрос DMA на сетевую карту, попросив его взять данные из этой физической памяти и загрузить их во внутренние буферы. В этот момент ваш write системный вызов вернется. Когда сетевая карта завершена (и данные выходят из адаптера), сетевая карта сообщит ядру о завершении.

В Linux сетевые драйверы обычно являются однопоточными (есть некоторые исключения, но это усложняется), поэтому, если вы попытаетесь write некоторых данных и драйвер уже активен, они все равно будут скопированы в пространство ядра, но Запрос DMA не будет выполнен, пока сетевой драйвер снова не освободится (он будет запущен, когда ядро ​​будет в следующий раз уведомлено о завершении DMA).

Мораль этой истории состоит в том, что это уже работает и довольно быстро, вам ничего не нужно делать, чтобы ускорить работу приложения с использованием DMA, об этом уже позаботились. Единственный фрагмент, который вы могли бы ускорить, - это копия в буфере пространства ядра, но, поскольку это намного быстрее, чем фактическая передача по сети (и может выполняться одновременно), это не имеет никакого значения для пропускной способности, только для задержки.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...