Apakah CPU benar-benar membeku saat menggunakan DMA?

19

Saya punya pertanyaan yang cukup mudah, tetapi saya tidak dapat menemukan jawaban di mana pun.

Pada sistem Von-Neumann tempat kode dan data hidup dalam RAM yang sama, CPU harus mengambil semua instruksinya dari memori. Sekarang, untuk memindahkan sejumlah besar data antara komponen komputer, ada pengontrol Akses Memori Langsung yang memungkinkan periferal untuk memiliki akses ke RAM sistem utama.

Pertanyaan saya adalah ini: jika DMA memungkinkan transfer data (mungkin sangat lama) antara, katakanlah, hard disk dan RAM, bukankah itu berarti bahwa CPU tidak dapat menggunakan RAM dan karena itu tidak dapat mengambil instruksi berikutnya?

Secara singkat, DMA dimaksudkan untuk menggantikan prosesor yang melakukan arbitrasi semua I / O membaca dan menulis, untuk membebaskan prosesor untuk melakukan hal-hal lain. Namun, jika tidak dapat mengambil instruksi dari RAM, maka itu belum dibebaskan.

Apakah ada detail yang saya lewatkan di sini?

Terima kasih

Mahkoe
sumber
7
Iya. DMA jarang berjalan pada bandwidth penuh dari memori. Itu hanya mencuri siklus (atau ledakan siklus) setiap sekarang dan kemudian, dikendalikan oleh laju perangkat I / O.
Dave Tweed
Komputer rumah Amiga menyelesaikan ini dengan mengamati bahwa CPU yang digunakan sebenarnya hanya mengakses bus dua siklus, kemudian tinggal di luar bus selama dua siklus, ketika masih berjalan dengan kecepatan penuh. Periferal berbasis DMA (grafik, audio, disk) menggunakan siklus di antaranya. Bukan jawaban untuk pertanyaan Anda karena pertanyaan itu hipotetis dan komputer selalu dirusak oleh detail praktis. :)
pipa
2
@pipe: Itu kedengarannya tidak benar. Amiga menggunakan CPU M68K, yang memiliki bus yang sepenuhnya tidak sinkron. Anda mungkin berpikir tentang Apple II, yang mengambil keuntungan dari fakta bahwa 6502 CPU-nya hanya menggunakan bus untuk setengah dari setiap siklus clock, dan menggunakan setengah lainnya untuk output video, yang juga berfungsi untuk membuat DRAM tetap segar.
Dave Tweed
4
CPU modern memiliki cache yang rata-rata menyelesaikan 95% dari akses memori. Selama CPU tidak membutuhkan RAM, DMA toh tidak mengganggu.
MSalters
2
@DaveTweed Tidak. Jika Anda melihat timing bus untuk 68000, setiap "siklus bus" (baca atau tulis) dibagi menjadi 8 status, dengan mengambil minimum 4 siklus clock aktual, yang hanya beberapa dari mereka yang menggerakkan bus data. Multiplexing ini memang memerlukan beberapa perangkat keras tambahan, karena ia mendorong bus alamat setiap saat.
pipa

Jawaban:

18

Anda benar bahwa CPU tidak dapat mengakses memori selama transfer DMA. Namun ada dua faktor yang secara kombinasi memungkinkan akses memori paralel yang jelas oleh CPU dan perangkat yang melakukan transfer DMA:

  • CPU membutuhkan beberapa siklus clock untuk menjalankan instruksi. Setelah mengambil instruksi, yang mungkin memerlukan satu atau dua siklus, sering dapat menjalankan seluruh instruksi tanpa akses memori lebih lanjut (kecuali itu adalah instruksi yang mengakses memori, seperti movinstruksi dengan operan tidak langsung).
  • Perangkat yang melakukan transfer DMA secara signifikan lebih lambat daripada kecepatan CPU, sehingga CPU tidak perlu berhenti pada setiap instruksi tetapi hanya sesekali ketika perangkat DMA mengakses memori.

Secara kombinasi, kedua faktor ini berarti bahwa perangkat yang melakukan transfer DMA akan berdampak kecil pada kecepatan CPU.

EDIT: Lupa menyebutkan bahwa ada juga faktor cache CPU, yang selama kode yang dieksekusi CPU ada dalam cache maka tidak perlu mengakses memori nyata untuk mengambil instruksi, sehingga transfer DMA tidak akan berjalan untuk menghalangi (meskipun jika instruksi perlu mengakses memori maka jelas akses memori nyata akan terjadi - berpotensi harus menunggu jeda dalam penggunaan memori perangkat DMA).

Micheal Johnson
sumber
4
Sebagai pendekatan tambahan, beberapa sistem mungkin menawarkan beberapa saluran untuk mengakses memori. CPU mungkin diizinkan untuk menggunakan satu saluran sementara mesin DMA bekerja di saluran lainnya
Cort Ammon - Reinstate Monica
1
@CortAmmon Saya percaya bahwa memori dual-channel biasanya tersebar di ruang alamat fisik, jadi misalnya jika Anda memiliki 2GB RAM maka 1GB lebih rendah pada saluran pertama dan 1GB atas adalah pada saluran kedua. Dalam hal ini, jika CPU dan DMA ingin mengakses area memori 1GB yang sama, mereka akan berada di saluran yang sama dan karenanya berpotensi konflik.
Micheal Johnson
Saya tidak yakin apakah banyak sistem nyata yang pernah menggunakan arsitektur VNM yang sebenarnya. Kemacetan itu terlalu sempit. Itu benar-benar perangkat teoritis yang digunakan dalam CS. Yang paling dekat yang bisa saya pikirkan adalah perangkat Texas 16 bit tahun 1970 yang memiliki register dalam RAM. Saya sedang memikirkan kartu grafis di mana dual porting RAM digunakan. Chips seperti ARM khususnya yang high-end mencapai hal yang sama pada banyak bus internal (AHP, APB, Stacks). futureelectronics.com/en/memory/dual-ports.aspx idt.com/products/memory-logic/multi-port-memory/…
ChrisR
1
Saya tidak berpikir bahwa pertanyaannya adalah tentang CPU Von-Neumann yang ketat tetapi lebih praktis, seperti x86 atau ARM, yang secara longgar Von-Neumann. Dalam kasus Von-Neumann yang ketat, tanpa register internal, kemampuan CPU untuk terus berjalan selama DMA turun ke titik kedua dalam jawaban saya, bahwa DMA tidak menggunakan seluruh bandwidth memori.
Micheal Johnson
20

Jika ada antarmuka memori tunggal, akan ada perangkat keras untuk menengahi antara permintaan. Biasanya prosesor akan diberi prioritas lebih dari I / O tanpa kelaparan I / O, tetapi bahkan dengan I / O selalu memiliki prioritas prosesor akan memiliki beberapa peluang untuk mengakses memori karena I / O cenderung memiliki permintaan bandwidth yang lebih rendah dan intermiten.

Selain itu, biasanya ada lebih dari satu antarmuka ke memori. Prosesor berkinerja lebih tinggi biasanya memiliki cache (jika DMA tidak koheren, cache bahkan tidak harus diintip; bahkan dengan pengintaian, overhead umumnya akan kecil karena perbedaan bandwidth antara cache dan memori utama atau (ketika DMA transfer ke L3 cache) antara L3 cache dan L1 cache), menyediakan antarmuka terpisah untuk mengakses memori. Microcontrollers akan sering mengakses instruksi dari memori berbasis flash yang terpisah, memungkinkan pengambilan untuk melanjutkan selama DMA ke memori on-chip, dan sering memiliki memori yang digabungkan dengan antarmuka independen (memungkinkan banyak akses data untuk menghindari konflik DMA).

Bahkan dengan antarmuka memori tunggal, bandwidth puncak umumnya akan lebih tinggi dari bandwidth yang biasanya digunakan. (Untuk pengambilan instruksi, bahkan penyangga kecil dengan pengambilan pengambilan yang lebih luas dari rata-rata akan memungkinkan instruksi mengambil dari buffer sementara agen lain menggunakan antarmuka memori, mengeksploitasi kecenderungan kode untuk tidak melakukan percabangan.)

Juga perhatikan bahwa karena prosesor mengakses data, jika ada antarmuka memori tunggal, harus ada mekanisme arbitrase antara akses data dan akses instruksi.

Jika prosesor (dengan antarmuka memori tunggal) terpaksa mengimplementasikan salinan dari buffer perangkat I / O ke memori utama, prosesor juga harus mengambil instruksi untuk melakukan salinan. Ini bisa berarti dua akses memori per kata yang ditransfer bahkan dalam ISA dengan operasi memori-memori (ISA penyimpanan-toko dapat membutuhkan tiga akses memori atau lebih jika pengalamatan memori pasca kenaikan tidak disediakan); itu selain akses I / O yang dalam sistem lama mungkin berbagi antarmuka yang sama dengan memori utama. Mesin DMA tidak mengakses instruksi dalam memori, dan karenanya menghindari overhead ini.

Paul A. Clayton
sumber
2

Karena hanya ada satu sistem bus, yang diblokir oleh akses memori DMA, CPU tidak dapat bekerja paling baik jika DMA memindahkan data dan karena itu dihentikan.

Gagasan di balik ini adalah sebagai berikut:

Jika Anda ingin menyalin data berurutan dari memori, maka CPU harus melakukan sesuatu seperti itu:

Hitung alamat-> baca data-> hitung alamat baru (+ 1 kata) -> baca data ...

Padahal DMA melakukan perhitungan alamat baru secara paralel (tergantung mode) dan karenanya lebih cepat. Jadi DMA dapat bekerja pada throughput bus penuh (secara teoritis).

NeinDochOah
sumber
"karena hanya ada sistem bus tunggal" ... bukan asumsi yang aman untuk dibuat dengan komputer modern yang memiliki memori dan bus periferal berjalan pada kecepatan yang berbeda, dan dengan terjemahan protokol terjadi di antara mereka.
rackandboneman
3
Pada komputer lama: Ada kekeliruan desain pada Apple II (atau pendahulunya / prototipe dari itu?), Karena mereka benar-benar menghentikan CPU. Register di 6502 diimplementasikan sebagai memori dinamis. Cara mereka menghentikan CPU menghentikan penyegaran mati. Panjang DMA maksimum berakhir sangat, sangat bergantung pada alat berat.
rackandboneman
Karena pertanyaannya adalah tentang arsitektur von neumann dan DMA, ini terdengar lebih seperti pertanyaan mengenai mikrokontroler (sekali lagi harddisk disebutkan dalam contoh). Juga seperti yang ditunjukkan oleh Paul A. Clayton, semakin rumit ketika Anda mempertimbangkan cache bertingkat. Seseorang juga dapat berpikir tentang cpu di mana beberapa opcodes terkandung dalam sebuah kata dan dieksekusi setelah cpu lain atau cpus dengan cache sendiri, di mana akan ada kode cpu yang dapat dieksekusi, tetapi output harus buffered ... jadi ya Anda benar ada kemungkinan tak terbatas.
NeinDochOah
2

Secara umum, tidak.

Di sebagian besar arsitektur sistem, semua permintaan untuk akses memori memiliki prioritas yang ditetapkan kepadanya. Ketika ada lebih banyak permintaan simultan untuk memori daripada yang dapat ditangani sistem pada satu waktu, permintaan dengan prioritas lebih tinggi dilayani terlebih dahulu. Permintaan memori yang diprakarsai oleh CPU biasanya diberikan prioritas setinggi mungkin.

duskwuff
sumber
0

Secara umum tidak.

Beberapa sistem yakin, hanya satu master dalam satu waktu. Sedikit desain yang lebih tua jika itu yang terjadi (bahkan desain lama sering memiliki solusi paralel). Jenis bus modern meskipun setiap bus (alamat, tulis data, baca data) beroperasi secara independen dan memiliki tag atau id per siklus clock untuk menunjukkan transaksi apa yang dikaitkan dengan satu siklus clock. Sehingga Anda dapat memiliki banyak / banyak transaksi dalam penerbangan pada saat yang sama di kedua arah, dengan transaksi yang berbeda-beda dikocok bersama-sama pada bus data baca atau tulis. Siapa yang akan pergi berikutnya akan berdasarkan prioritas, tidak ada aturan bahwa transaksi pada bus harus keluar dalam urutan instruksi perangkat lunak yang ditetapkan, prosesor dapat menentukan bahwa ia dapat memulai beberapa lebih awal daripada yang lain, dan tentu saja respons akan kembali dalam urutan berbeda juga tergantung pada seberapa dekat dan cepat targetnya. Demikian juga pengambilan yang tidak berurutan, prediksi cabang akan menyala secara acak setiap kali terasa.

Transaksi dma besar tentu membutuhkan bandwidth bus lebih banyak, tetapi untuk mengatakan bahwa prosesor berhenti, tidak harus demikian halnya, juga tergantung pada arsitektur dan kode. Kode mungkin memiliki instruksi yang mengatakan berhenti sampai akhir ini sinyal transfer / peristiwa terjadi, dan kemudian yakin prosesor akan menyelesaikan apa yang dapat dilakukan dalam pipa dan kemudian berhenti. Tapi itu atau beberapa arsitektur mungkin tidak mengharuskan Anda untuk berhenti, tidak benar-benar bijaksana untuk menunda, begitu banyak bandwidth yang terbuang. Lagipula apa gunanya dma jika tidak beroperasi secara paralel, hanya kode transfer dalam satu lingkaran, mengambil menambahkan beberapa siklus mungkin tergantung pada arsitektur mereka tidak semahal logika dma overhead, daya, dll. Memahami bagaimana dma bekerja untuk arsitektur dan sistem tertentu yang Anda gunakan dan memutuskan apakah itu layak digunakan,

Tidak ada jawaban umum untuk bagaimana dma bekerja, itu sangat tergantung pada desain sistem dan semua komponen dalam sistem.

old_timer
sumber