Czy procesor całkowicie zawiesza się podczas korzystania z DMA?

19

Mam dość proste pytanie, ale nigdzie nie mogłem znaleźć na nie odpowiedzi.

W systemie Von-Neumann, w którym kod i dane znajdują się w tej samej pamięci RAM, procesor musi pobrać wszystkie instrukcje z pamięci. Teraz, aby przenosić duże ilości danych między komponentami komputera, istnieje kontroler bezpośredniego dostępu do pamięci, który pozwala urządzeniom peryferyjnym na dostęp do głównej pamięci RAM systemu.

Moje pytanie brzmi: jeśli DMA pozwala na (być może bardzo długi) transfer danych między, powiedzmy, dyskiem twardym a pamięcią RAM, czy nie oznacza to, że procesor nie może użyć pamięci RAM, a zatem nie może pobrać kolejnej instrukcji?

W skrócie, DMA ma zastąpić procesor arbitrażujący wszystkie operacje odczytu i zapisu we / wy, aby zwolnić procesor do wykonywania innych czynności. Jeśli jednak nie może pobrać instrukcji z pamięci RAM, i tak nie został zwolniony.

Czy brakuje mi jakiegoś szczegółu?

Dzięki

Mahkoe
źródło
7
Tak. DMA rzadko działa z pełną przepustowością pamięci. Po prostu kradnie cykl (lub serię cykli) od czasu do czasu, kontrolowany przez szybkość urządzenia we / wy.
Dave Tweed
Komputer domowy Amigi obejrzał ten problem, obserwując, że użyty procesor faktycznie uzyskał dostęp do magistrali tylko dwa cykle, a następnie pozostawał poza magistralą przez dwa cykle, gdy nadal pracował z pełną prędkością. Urządzenia peryferyjne oparte na DMA (grafika, dźwięk, dysk) wykorzystywały cykle pomiędzy nimi. Nie jest to odpowiedź na twoje pytanie, ponieważ pytanie jest hipotetyczne, a komputery są zawsze niszczone przez praktyczne szczegóły. :)
fajka
2
@pipe: To nie brzmi dobrze. Amiga zastosowała procesor M68K, który ma całkowicie asynchroniczną magistralę. Być może myślisz o Apple II, który wykorzystał fakt, że jego procesor 6502 wykorzystuje magistralę tylko przez połowę każdego cyklu zegarowego, a drugą połowę używał do wyjścia wideo, co również służyło do odświeżenia pamięci DRAM.
Dave Tweed
4
Nowoczesne procesory mają pamięci podręczne, które średnio rozwiązują 95% dostępów do pamięci. Dopóki procesor nie potrzebuje pamięci RAM, DMA i tak nie zakłóca.
MSalters
2
@DaveTweed Nope. Jeśli spojrzysz na taktowanie magistrali dla 68000, każdy „cykl magistrali” (odczyt lub zapis) jest podzielony na 8 stanów, biorąc co najmniej 4 rzeczywiste cykle zegara, z których tylko niektóre z nich sterują magistralą danych. To multipleksowanie wymaga jednak dodatkowego sprzętu, ponieważ cały czas napędza magistralę adresową.
rura

Odpowiedzi:

18

Masz rację, że procesor nie może uzyskać dostępu do pamięci podczas transferu DMA. Istnieją jednak dwa czynniki, które łącznie pozwalają na pozorny równoległy dostęp do pamięci przez CPU i urządzenie wykonujące transfer DMA:

  • Procesor wykonuje wiele cykli zegara, aby wykonać instrukcję. Po pobraniu instrukcji, która zajmuje może jeden lub dwa cykle, często może wykonać całą instrukcję bez dalszego dostępu do pamięci (chyba że jest to instrukcja, która sama uzyskuje dostęp do pamięci, na przykład movinstrukcja z operandem pośrednim).
  • Urządzenie wykonujące transfer DMA jest znacznie wolniejsze niż prędkość procesora, więc procesor nie będzie musiał zatrzymywać się przy każdej instrukcji, ale tylko czasami, gdy urządzenie DMA uzyskuje dostęp do pamięci.

W połączeniu te dwa czynniki oznaczają, że urządzenie wykonujące transfer DMA będzie miało niewielki wpływ na szybkość procesora.

EDYCJA: Zapomniałem wspomnieć, że istnieje również czynnik pamięci podręcznej procesora, który dopóki kod wykonywany przez procesor znajduje się w pamięci podręcznej, nie będzie musiał uzyskiwać dostępu do prawdziwej pamięci w celu pobrania instrukcji, więc transfer DMA nie będzie przeszkadzać (chociaż jeśli instrukcja wymaga dostępu do pamięci, to oczywiście nastąpi prawdziwy dostęp do pamięci - potencjalnie konieczne będzie poczekanie na przerwę w korzystaniu z pamięci przez urządzenie DMA).

Micheal Johnson
źródło
4
Jako dodatkowe podejście, niektóre systemy mogą oferować wiele kanałów dostępu do pamięci. Procesor może mieć możliwość korzystania z jednego kanału, podczas gdy silnik DMA działa na drugim
Cort Ammon - Przywróć Monikę
1
@CortAmmon Uważam, że pamięć dwukanałowa jest zwykle rozproszona w fizycznej przestrzeni adresowej, więc na przykład, jeśli masz 2 GB pamięci RAM, dolny 1 GB znajduje się na pierwszym kanale, a górny 1 GB na drugim kanale. W takim przypadku, jeśli zarówno CPU, jak i DMA chcą uzyskać dostęp do tego samego obszaru pamięci 1 GB, będą one na tym samym kanale, a zatem potencjalnie wystąpią konflikty.
Micheal Johnson
Nie jestem pewien, czy wiele prawdziwych systemów kiedykolwiek używało prawdziwej architektury VNM. Wąskie gardło było po prostu zbyt wąskie. To naprawdę było teoretyczne urządzenie używane w CS. Najbliżej mogę wymyślić 16-bitowe urządzenie Texas z 1970 roku, które miało swoje rejestry w RAM. Mam na myśli kartę graficzną, w której używana jest podwójna pamięć RAM. Chipy, takie jak ARM, szczególnie te wysokiej klasy, osiągają to samo na wielu wewnętrznych magistralach (AHP, APB, stosy). futureelectronics.com/en/memory/dual-ports.aspx idt.com/products/memory-logic/multi-port-memory/…
ChrisR
1
Nie sądziłem, że pytanie dotyczy ścisłego procesora Von-Neumann, ale raczej praktycznego, takiego jak x86 lub ARM, które są luźno Von-Neumann. W przypadku ścisłego Von-Neumanna, bez żadnych wewnętrznych rejestrów, zdolność procesora do kontynuowania działania podczas DMA sprowadza się do drugiego punktu mojej odpowiedzi, że DMA nie wykorzystuje całej przepustowości pamięci.
Micheal Johnson
20

Jeśli istnieje pojedynczy interfejs pamięci, istnieje sprzęt do arbitrażu między żądaniami. Zazwyczaj procesor miałby pierwszeństwo przed I / O bez głodzenia I / O, ale nawet przy I / O zawsze mającym priorytet, procesor miałby pewne możliwości dostępu do pamięci, ponieważ I / O ma zwykle mniejsze zapotrzebowanie na przepustowość i jest przerywany.

Ponadto zazwyczaj istnieje więcej niż jeden interfejs do pamięci. Procesory o wyższej wydajności zwykle mają pamięci podręczne (jeśli DMA nie jest spójne, pamięci podręczne nawet nie muszą być szpiegowane; nawet przy szpiegowaniu narzut byłby ogólnie niewielki z powodu różnicy przepustowości między pamięcią podręczną a pamięcią główną lub (gdy DMA przenosi się do L3 pamięć podręczna) między pamięcią podręczną L3 a pamięcią podręczną L1), zapewniając oddzielny interfejs dostępu do pamięci. Mikrokontrolery często uzyskują dostęp do instrukcji z oddzielnej pamięci flash, umożliwiając kontynuowanie pobierania podczas DMA do pamięci na chipie, i często mają ściśle sprzężoną pamięć z niezależnym interfejsem (umożliwiając dostęp do wielu danych w celu uniknięcia konfliktów DMA).

Nawet w przypadku pojedynczego interfejsu pamięci szczytowa przepustowość będzie na ogół wyższa niż zwykle używana przepustowość. (W przypadku pobierania instrukcji nawet mały bufor z ładowaniem większym niż średnia pobierania z pamięci pozwala na pobieranie instrukcji z bufora, gdy inny agent korzysta z interfejsu pamięci, wykorzystując tendencję kodu do nie rozgałęziania się.)

Należy również zauważyć, że ponieważ procesor uzyskuje dostęp do danych, jeśli istnieje pojedynczy interfejs pamięci, musi istnieć mechanizm arbitrażu między dostępem do danych a dostępem do instrukcji.

Gdyby procesor (z pojedynczym interfejsem pamięci) był zmuszony zaimplementować kopię z bufora urządzenia I / O do pamięci głównej, musiałby również pobrać instrukcje, aby wykonać kopię. Może to oznaczać dwa dostępy do pamięci na słowo przesyłane nawet w programie ISA z operacjami pamięci-pamięci (program ISA przechowujący obciążenia może wymagać trzech dostępów do pamięci lub więcej, jeśli nie zapewniono adresowania pamięci po inkrementacji); jest to dodatek do dostępu we / wy, który w starych systemach może współdzielić ten sam interfejs co pamięć główna. Silnik DMA nie ma dostępu do instrukcji w pamięci, dzięki czemu unika się tego narzutu.

Paul A. Clayton
źródło
2

Ponieważ istnieje tylko jeden system magistrali, który jest blokowany przez dostęp do pamięci DMA, procesor nie może działać, nawet gdy DMA przenosi dane i dlatego zostaje zatrzymany.

Idea tego jest następująca:

Jeśli chcesz skopiować kolejne dane z pamięci, procesor musiałby zrobić coś takiego:

Oblicz adres-> odczyt danych-> oblicz nowy adres (+ 1 słowo) -> odczyt danych ...

Podczas gdy DMA oblicza nowy adres równolegle (w zależności od trybu) i dlatego jest szybszy. Tak więc DMA może pracować z pełną przepustowością magistrali (teoretycznie).

NeinDochOah
źródło
„ponieważ istnieje tylko jeden system magistrali”… nie jest to bezpieczne założenie w przypadku nowoczesnych komputerów, które mają swoją pamięć i peryferyjne magistrale działające na różnych prędkościach, a między nimi odbywa się tłumaczenie protokołów.
rackandboneman,
3
Na starszych komputerach: Apple II (lub jakiś jego poprzednik / prototyp?) Nadzorował projekt, ponieważ dosłownie zatrzymał procesor. Rejestry w 6502 są zaimplementowane jako pamięć dynamiczna. Sposób, w jaki zatrzymali procesor, zatrzymał odświeżanie. Maksymalna długość DMA była bardzo zależna od maszyny.
rackandboneman,
Ponieważ pytanie dotyczyło architektury von neumann i DMA, brzmi to bardziej jak pytanie dotyczące mikrokontrolerów (w tym przykładzie ponownie wymieniono dyski twarde). Również, jak zauważa Paul A. Clayton, staje się jeszcze bardziej skomplikowany, jeśli wziąć pod uwagę wielopoziomową pamięć podręczną. Można również pomyśleć o jednostce centralnej, w której wiele słów zawiera się w jednym słowie i jest wykonywanych po innej lub cpus z własną pamięcią podręczną, gdzie byłby kod, który jednostka centralna mogłaby wykonać, ale dane wyjściowe musiały być buforowane ... więc tak, jesteś są nieograniczone możliwości.
NeinDochOah
2

Ogólnie rzecz biorąc, nie.

W większości architektur systemowych wszystkie żądania dostępu do pamięci mają przypisany priorytet . Gdy jest więcej jednoczesnych żądań pamięci, niż system może obsłużyć jednocześnie, żądania o wyższym priorytecie są obsługiwane w pierwszej kolejności. Żądania pamięci inicjowane przez CPU mają zwykle najwyższy możliwy priorytet.

duskwuff
źródło
0

Ogólnie nie.

Niektóre systemy na pewno, tylko jeden master na raz. W tym przypadku jest to nieco starszy projekt (nawet stare projekty często miały równoległe rozwiązania). Nowoczesny typ magistrali przez każdą magistralę (adres, zapis danych, odczyt danych) działa niezależnie i ma znacznik lub identyfikator na cykl zegara, aby pokazać, z jaką transakcją jest powiązany jeden cykl zegara. Dzięki temu możesz mieć wiele / wiele transakcji w locie jednocześnie w obu kierunkach, a różne transakcje są przetasowane razem w szynach danych do odczytu lub zapisu. Kto będzie następny, będzie zależał od priorytetu, nie ma zasady, że transakcje w autobusie musiałyby wychodzić w kolejności, w jakiej są ułożone instrukcje oprogramowania, procesor może ustalić, że niektóre mogą rozpocząć się wcześniej niż inne, i naturalnie odpowiedzi będą wracać w różnych kolejności, w zależności od tego, jak blisko i jak szybko jest cel. Podobnie pobieranie nie jest w porządku, przewidywanie gałęzi odpala losowo wyglądające pobrania, gdy tylko ma na to ochotę.

Duża transakcja dma wymagałaby oczywiście znacznie większej przepustowości magistrali, ale stwierdzenie, że procesor się zatrzymuje, niekoniecznie tak, zależy również od architektury i kodu. Kod może zawierać instrukcję, która mówi, że utknięcie do końca tego sygnału / zdarzenia transferu, a następnie upewnienie się, że procesor dokończy to, co może zrobić w potoku, a następnie utknie. Ale to lub niektóre architektury mogą nie wymagać przeciągnięcia, i tak naprawdę nie jest to rozsądne, aby stracić przepustowość. Jaki byłby sens DMA, gdyby nie działał równolegle, wystarczy zakodować transfer w pętli, pobiera dodać kilka cykli, być może w zależności od architektury, nie są one tak kosztowne, jak obciążenie logiczne dma, moc itp. Zrozum, w jaki sposób dma działa dla konkretnej architektury i systemu, na którym się znajdujesz, i decydujesz, czy warto go użyć,

Nie ma ogólnej odpowiedzi na pytanie, jak działa dma, jest on w dużym stopniu zależny od projektu systemu i wszystkich komponentów w systemie.

old_timer
źródło