Какова цель прямого доступа к памяти жесткого диска? - PullRequest
6 голосов
/ 15 сентября 2010

На первый взгляд кажется хорошей идеей позволить жесткому диску выполнять запись в ОЗУ самостоятельно, без инструкций ЦП, копирующих данные, особенно с учетом успеха асинхронных сетей. Но в статье Википедии о прямом доступе к памяти (DMA) говорится следующее:

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

Я не понимаю, как автобусная линия может быть "частично заблокирована". Предположительно, в одно и то же время доступ к памяти может получить одно устройство, и тогда кажется, что ЦП практически не может выполнять полезную работу. Он будет заблокирован при первой попытке чтения не кэшированной памяти, что, как я ожидаю, происходит очень быстро в случае кэша объемом 2 МБ.

Цель освобождения ЦП для выполнения других задач кажется неоправданной. Способствует ли жесткий диск DMA увеличению производительности на практике?

Ответы [ 7 ]

6 голосов
/ 23 сентября 2010

1: PIO (запрограммированный ввод-вывод) перебивает кэши ЦП. Данные, считанные с диска, в большинстве случаев не будут обрабатываться сразу после этого. Данные часто читаются приложением большими порциями, но PIO выполняется небольшими блоками (обычно 64K IIRC). Таким образом, приложение для чтения данных будет ждать, пока большой кусок не будет передан, и не получит выгоду от меньших блоков, находящихся в кэше, сразу после того, как они были извлечены из контроллера. Между тем другие приложения будут страдать от значительных частей кэша, высвобождаемых при передаче. Этого, вероятно, можно избежать, используя специальные инструкции, которые инструктируют ЦП не кэшировать данные, а записывать их «напрямую» в основную память, однако я уверен, что это замедлит цикл копирования. И тем самым причиняет боль даже больше, чем кеша.

2: PIO, поскольку он реализован в системах x86 и, возможно, в большинстве других систем, работает очень медленно по сравнению с DMA. Проблема не в том, что процессор не будет достаточно быстрым. Проблема связана с тем, как спроектированы шина и режимы PIO контроллера диска. Если я не ошибаюсь, CPU должен считывать каждый байт (или каждый DWORD при использовании 32-битных режимов PIO) с так называемого порта IO. Это означает, что для каждого DWORD данных адрес порта должен быть помещен на шину, и контроллер должен ответить, поместив DWORD данных на шину. Тогда как при использовании DMA контроллер может передавать пакеты данных, используя полную полосу пропускания шины и / или контроллера памяти. Конечно, есть много возможностей для оптимизации этого устаревшего дизайна PIO. DMA переводы - это такая оптимизация. Другие решения, которые все еще будут рассматриваться как PIO, также могут быть возможны, но с другой стороны, они по-прежнему будут страдать от других проблем (например, перегрузка кэша, упомянутая выше).

3: Ширина полосы памяти и / или шины не является ограничивающим фактором для большинства приложений, поэтому передача DMA ничего не остановит. Это может немного замедлить работу некоторых приложений, но обычно это должно быть едва заметно. Ведь все диски довольно медленные по сравнению с пропускной способностью шины и / или контроллера памяти. «Диск» (SSD, RAID-массив), обеспечивающий скорость> 500 МБ / с, действительно быстрый. Шина или подсистема памяти, которая не может по крайней мере доставить в 10 раз больше числа, должна быть из каменных веков. OTOH PIO действительно полностью останавливает процессор, пока он передает блок данных.

5 голосов
/ 22 сентября 2010

Не знаю, пропустил ли я что-нибудь.

Предположим, у нас нет контроллера DMA. Каждая передача с «медленных» устройств в память была бы для CPU петлей

ask_for_a_block_to_device 
wait_until_device_answer (or change_task_and_be_interrupted_when_ready)
write_to_memory

Таким образом, CPU должен записывать саму память. Кусок за кусок.

Необходимо ли использовать процессор для передачи памяти? Нет. Мы используем другое устройство (или механизм, такой как мастеринг шины DMA), который передает данные в / из памяти.

Между тем ЦП может делать что-то иное, например: делать вещи с кешем, но даже получать доступ к другим частям памяти большую часть времени.

Это важная часть : данные не передаются 100% времени, потому что другое устройство работает очень медленно (по сравнению с памятью и процессором).

Попытка представить пример использования шины совместно используемой памяти (C, когда принимается CPU, D, когда принимается DMA)

Memory Bus ----CCCCCCCC---D----CCCCCCCCCDCCCCCCCCC----D

Как вы можете видеть, к памяти допускается одно устройство за раз. Иногда процессором, иногда контроллером DMA. В DMA очень мало раз.

4 голосов
/ 18 сентября 2010

Я не понимаю, как автобусная линия может быть "частично заблокирована"

В течение многих тактов некоторые будут заблокированы, а некоторые - нет. Цитируя Университет Мельбурна :

Q2. Что такое кража цикла? Почему есть циклы, чтобы украсть?

A2. Когда устройство DMA передает данные в память или из нее, оно (в большинстве архитектур) использовать ту же шину, что и процессор для доступа к памяти. Если процессор хочет использовать шину в то же время время как устройство DMA, процессор будет останавливаться на цикл, так как устройство DMA имеет более высокий приоритет. Это необходимо для предотвращения переполнение с небольшими буферами DMA. (Процессор никогда не страдает от переполнения.)

Большинство современных процессоров имеют кэши, которые удовлетворяют большинству ссылок на память без необходимости заходить в основную память через шину. DMA будет поэтому иметь гораздо меньшее влияние на них.

Даже если ЦП полностью истощен во время передачи блока DMA, это произойдет быстрее, чем если бы ЦП пришлось сидеть в цикле, сдвигая байты в / из устройства ввода-вывода.

3 голосов
/ 15 сентября 2010

Одним из возможных повышений производительности может быть тот факт, что на компьютере может быть установлено несколько устройств DMA.Таким образом, с DMA вы можете иметь несколько чтений памяти параллельно без ЦП, чтобы выполнить все служебные данные.

3 голосов
/ 15 сентября 2010

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

0 голосов
/ 22 сентября 2010

Если вы используете Linux, вы можете легко проверить это, отключив DMA с помощью hdparm.Эффект драматический.

0 голосов
/ 15 сентября 2010

Обработка не происходит на шине процессора в любом случае.Инструкции по выдаче процессора, которые могут касаться или не касаться памяти.Когда они это делают, они обычно разрешаются сначала в кэш-памяти L1, а затем в L2 и L3 перед попыткой использования памяти.Таким образом, передачи DMA не блокируют обработку.

Даже если и для ЦП, и для передачи DMA потребуется память, ожидается, что они не получат доступ к одним и тем же байтам в памяти.Контроллер памяти может фактически обрабатывать оба запроса одновременно.

...