Чи повністю застигає процесор при використанні DMA?


19

У мене досить просте запитання, але я не могла знайти відповіді на нього ніде.

У системі Von-Neumann, де код і дані живуть в одній і тій же оперативній пам'яті, центральний процесор повинен витягнути всі його інструкції з пам'яті. Тепер для переміщення великої кількості даних між комп'ютерними компонентами існує контролер прямого доступу до пам'яті, який дозволяє периферійним пристроям мати доступ до основної системної оперативної пам'яті.

Моє запитання таке: якщо DMA дозволяє (можливо, дуже тривалий) передавати дані між, скажімо, жорстким диском та оперативною пам’яттю, чи це не означає, що процесор не може використовувати ОЗУ і тому не може отримати наступну інструкцію?

Коротше кажучи, DMA призначений для заміни процесора, який арбітрує всі зчитування і записи вводу-виводу, щоб звільнити процесор, щоб робити інші дії. Однак, якщо він не може отримати свої вказівки з оперативної пам’яті, він все одно не буде звільнений.

Чи є якась деталь, яку мені тут не вистачає?

Спасибі


7
Так. DMA рідко працює на повній пропускній здатності пам'яті. Він просто краде цикл (або спалах циклів) раз у раз, контролюючи швидкість пристрою вводу / виводу.
Трейд Дейва

Домашній комп'ютер Amiga обійшов це, помітивши, що використовуваний процесор фактично здійснював лише два цикли до шини, а потім залишався поза шиною протягом двох циклів, коли все ще працював на повній швидкості. Периферія на базі DMA (графіка, аудіо, диск) використовувала цикли між ними. Не відповідь на ваше запитання, оскільки питання гіпотетичне, а комп'ютери завжди зруйновані практичними деталями. :)
труба

2
@pipe: Це не правильно. Amiga використовував процесор M68K, який має повністю асинхронну шину. Ви можете подумати про Apple II, який скористався тим, що його 6502 процесор використовує шину лише половину кожного тактового циклу, а іншу половину використовував для відеовиходу, який також служив для оновлення DRAM.
Трейд Дейва

4
Сучасні процесори мають кеші, які в середньому вирішують 95% доступу до пам'яті. Поки процесору не потрібна оперативна пам’ять, DMA все одно не заважає.
MSalters

2
@DaveTweed Nope. Якщо ви подивитеся на таймінги шини для 68000, кожен "цикл шини" (читання або запис) розділений на 8 станів, беручи мінімум 4 фактичних тактових цикли, з яких лише деякі з них керують шиною даних. Однак для цього мультиплексування потрібне додаткове обладнання, оскільки воно постійно управляє адресною шиною.
труба

Відповіді:


18

Ви впевнені, що процесор не може отримати доступ до пам'яті під час передачі DMA. Однак є два фактори, які в поєднанні дозволяють очевидний паралельний доступ до пам'яті процесором та пристроєм, що здійснює передачу DMA:

  • Процесор займає кілька тактових циклів для виконання інструкції. Після того, як він отримав інструкцію, яка займає, можливо, один або два цикли, вона часто може виконувати всю інструкцію без подальшого доступу до пам'яті (якщо тільки це не інструкція, яка сама отримує доступ до пам'яті, наприклад, movінструкція з непрямим операндом).
  • Пристрій, що здійснює передачу DMA, значно менший, ніж швидкість процесора, тому процесору не потрібно зупинятися на кожній інструкції, а лише час від часу, коли пристрій DMA отримує доступ до пам'яті.

У поєднанні ці два фактори означають, що пристрій, що здійснює передачу DMA, матиме незначний вплив на швидкість процесора.

EDIT: Забув зазначити, що є також фактор кеш-процесора, який до тих пір, поки код, який виконує процесор, знаходиться в кеші, тоді йому не потрібно буде отримувати доступ до реальної пам'яті для отримання інструкцій, тому передача DMA не збирається перешкоджати (хоча якщо інструкція потребує доступу до пам'яті, тоді, очевидно, відбудеться реальний доступ до пам'яті - можливо, доведеться чекати перерви у використанні пам'яті пристрою DMA).


4
В якості додаткового підходу деякі системи можуть пропонувати кілька каналів для доступу до пам'яті. ЦП може бути дозволено використовувати один канал, поки двигун DMA працює на іншому
Cort Ammon - Відновити Моніку

1
@CortAmmon Я вважаю, що двоканальна пам'ять зазвичай поширюється у фізичному адресному просторі, тому, наприклад, якщо у вас є 2 Гб оперативної пам’яті, то нижній 1 ГБ - на першому каналі, а верхній - на другому каналі. У такому випадку, якщо і процесор, і DMA хочуть отримати доступ до однієї і тієї ж області пам’яті 1 Гб, вони опиняться на одному каналі і, таким чином, можуть конфліктувати.
Міхеал Джонсон

Я не впевнений, чи багато реальних систем коли-небудь використовували справжню архітектуру VNM. Вузьке місце було просто занадто вузьким. Це справді був теоретичним приладом, що застосовувався в КС. Найбільш близьким, що я можу придумати, був 16-бітний пристрій Техасу 1970 року, який мав свої регістри в оперативній пам'яті. Я думаю про відеокарту, де використовується подвійна оперативна пам'ять. Такі мікросхеми, як ARM, мають найвищі кінцеві результати на багатьох внутрішніх шинах (AHP, APB, Stacks). futureelectronics.com/en/memory/dual-ports.aspx idt.com/products/memory-logic/multi-port-memory/…
ChrisR

1
Я не думав, що питання ставиться про суворий процесор Von-Neumann, а скоріше практичний, як x86 або ARM, які вільно Von-Neumann. У випадку суворого Von-Neumann, без будь-яких внутрішніх регістрів, можливість процесора продовжувати працювати під час DMA зводиться до мого другого моменту у моїй відповіді, що DMA не використовує всю пропускну здатність пам'яті.
Мішель Джонсон

20

Якщо є єдиний інтерфейс пам’яті, існуватиме обладнання для арбітражу між запитами. Зазвичай процесору буде надано пріоритет над входом / виводом без голодування вводу / виводу, але навіть при вході / виводу, який завжди має пріоритет, процесор мав би деякі можливості отримати доступ до пам'яті, оскільки введення / виведення має менші вимоги до пропускної здатності та бути переривчастим.

Крім того, в пам'яті зазвичай є більше одного інтерфейсу. Процесори більш високої продуктивності, як правило, мають кеші (якщо DMA не є когерентним, кеші навіть не потрібно переносити; навіть при перегляді, накладні витрати, як правило, будуть невеликими через різницю пропускної здатності між кешем і основною пам'яттю або (коли DMA переходить на L3) кеш) між кешем L3 і кешем L1), забезпечуючи окремий інтерфейс для доступу до пам'яті. Мікроконтролери часто отримують доступ до інструкцій з окремої флеш-пам’яті, що дозволяє під час DMA переходити на мікросхему, і часто мають щільно з’єднану пам’ять з незалежним інтерфейсом (що дозволяє багатьом доступу до даних уникати конфліктів з DMA).

Навіть з одним інтерфейсом пам'яті, пікова пропускна здатність, як правило, буде вищою, ніж зазвичай використовується пропускна здатність. (Для отримання інструкцій навіть невеликий буфер із ширшим середнім завантаженням із пам'яті дозволив би отримувати інструкцію з буфера, коли інший агент використовує інтерфейс пам'яті, використовуючи тенденцію коду не розгалужуватися.)

Також зауважте, що оскільки процесор отримує доступ до даних, якщо є єдиний інтерфейс пам'яті, повинен існувати механізм арбітражу між доступом до даних та доступом до інструкцій.

Якщо процесор (з єдиним інтерфейсом пам'яті) був змушений реалізувати копію з буфера пристрою вводу-виводу в основну пам'ять, він також повинен був отримати інструкції для виконання копії. Це може означати два доступу до пам’яті на одне слово, передане навіть в ISA з операціями з пам’яттю пам’яті (ISA-сховище для завантаження може зажадати трьох доступів пам’яті або більше, якщо не передбачено адресацію пам’яті після збільшення); тобто на додаток до доступу вводу / виводу, який у старих системах може використовувати той же інтерфейс, що і основна пам'ять. Двигун DMA не отримує доступу до інструкцій у пам'яті, і таким чином уникає накладних витрат.


2

Оскільки існує лише одна система шини, яка блокується доступом до пам'яті DMA, процесор не може працювати, поки DMA переміщує дані, і тому зупиняється.

Ідея цього полягає в наступному:

Якщо ви хочете скопіювати послідовні дані з пам'яті, тоді процесор повинен зробити щось подібне:

Обчислити адресу-> прочитати дані-> обчислити нову адресу (+ 1 слово) -> прочитати дані ...

Тоді як DMA обчислює нову адресу паралельно (залежно від режиму) і тому швидше. Таким чином, DMA може працювати на повній пропускній здатності (теоретично).


"оскільки існує лише єдина система шин" ... не є надійним припущенням робити сучасні комп'ютери, у яких пам'ять і периферійні шини працюють з різною швидкістю, і між ними відбувається переклад протоколу.
rackandboneman

3
На старих комп'ютерах: в Apple II (чи якийсь його попередник / прототип?) Спостерігався дизайн дизайну, оскільки вони буквально зупинили процесор. Регістри в 6502 реалізовані як динамічна пам'ять. Те, як вони зупинили процесор, зупинило оновлення мертвих. Максимальна довжина DMA закінчилася дуже, дуже залежить від машини.
rackandboneman

Оскільки питання стосується архітектури фон Неймана та DMA, це звучить скоріше як питання, що стосується мікроконтролерів (тоді в прикладі знову згадуються жорсткі диски). Крім того, як зазначає Пол А. Клейтон, він стає ще складнішим, якщо розглядати багаторівневий кеш. Можна також подумати про процесор, де декілька опкодів містяться у слові і виконуються після іншого, або cpus із власним кешем, де був би код, який процесор міг би виконати, але вихід повинен бути забудований ... так що так прямо є безмежні можливості.
NeinDochOah

2

Взагалі кажучи, ні.

У більшості системних архітектур всі запити на доступ до пам'яті мають пріоритет . Коли одночасно запитів на пам'ять більше, ніж система може одночасно обробляти, запити з більш високим пріоритетом обслуговуються спочатку. Запити на пам'ять, ініційовані процесором, зазвичай мають найвищий пріоритет.


0

Загалом немає.

Деякі системи впевнені, лише один господар одночасно. Трохи старіший дизайн, якщо це так (навіть старі конструкції часто мали паралельні рішення). Сучасний тип шини, хоча кожна шина (адреса, запис даних, зчитування даних) працює незалежно та має тег чи ідентифікатор на цикл годин, щоб показати, з якою транзакцією пов'язаний один тактовий цикл. Таким чином, ви можете мати багато / багато транзакцій у польоті одночасно в обох напрямках, при цьому різні транзакції перемішуються разом на шинах даних для читання або запису. Кому слід рухатись далі, було б пріоритетним, не існує правила, що транзакції на шині повинні виходити в порядку, згідно з яким викладені інструкції щодо програмного забезпечення, процесор може визначити, що він може початися раніше, ніж інші, і, природно, відповіді будуть повертатися в різних порядках, залежно від того, наскільки близька та швидка мета. Аналогічно, результати не в порядку, передбачення гілок вимикає випадкові вибори, коли це здається.

Велика транзакція dma вимагає набагато більшої пропускної здатності шини, але сказати, що процесор зупиняється, не обов'язково, також залежить від архітектури та коду. Код може мати інструкцію, яка говорить про затримку, поки не відбудеться цей кінець сигналу / події передачі, і тоді переконайтесь, що процесор закінчить те, що він може зробити в трубі, а потім зупинить. Але та чи інша архітектура може не вимагати від вас затримок, але не дуже розумно зупинятись, стільки витрачається на пропускну здатність. Який би був сенс dma у будь-якому випадку, якщо він не працює паралельно, просто кодуйте передачу в циклі, отримує додавання деяких циклів, можливо, залежно від архітектури, вони не такі затратні, як логіка накладних даних dma, потужність тощо. dma працює для конкретної архітектури та системи, на якій ви перебуваєте, і вирішіть, чи варто її використовувати,

Немає загальної відповіді на те, як працює dma, вона сильно залежить від конструкції системи та всіх компонентів в системі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.