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
sumber
Jawaban:
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:
mov
instruksi dengan operan tidak langsung).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).
sumber
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.
sumber
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).
sumber
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.
sumber
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.
sumber