17 / 24 · Konsep
FIFO kosong, penuh, dan transfer serentak
Pisahkan okupansi dari penunjuk dan tentukan perilaku push/pop pada batas.
Pelajaran dapat dibaca gratis. Daftar untuk menyimpan progres.
Antrean mempertahankan urutan penerimaan
FIFO mengirim item yang diterima paling awal terlebih dahulu. Penunjuk bacanya menunjukkan entri tertua dan penunjuk tulisnya menunjukkan lokasi penyimpanan berikutnya. Kesamaan penunjuk saja tidak dapat membedakan kosong dari penuh, sehingga desain ini menyimpan penghitung okupansi. Untuk kedalaman empat, penunjuk membutuhkan dua bit, tetapi count membutuhkan tiga bit untuk mewakili nol hingga empat. Simpan tag bersama data.
FIFO berregister kita tidak langsung melewatkan masukan saat antrean kosong. Output-valid adalah count>0 dan pop adalah output-valid AND output-ready. Input-ready adalah count<depth OR pop, sehingga penggantian dimungkinkan ketika antrean penuh sekaligus mengirim item terdepannya. Push adalah input-valid AND input-ready. Count berikutnya adalah count+push-pop. Dua penugasan terpisah yang menaikkan dan menurunkan count dapat salah menangani transfer serentak; gunakan satu pembaruan gabungan atau kasus eksplisit.
| count lama | Kondisi | push | pop | count baru |
|---|---|---|---|---|
| 0 | Ada masukan dan penerima siap | 1 | 0 | 1 |
| 1 | Ada masukan dan penerima siap | 1 | 1 | 1 |
| 4 | Ada masukan dan penerima tertunda | 0 | 0 | 4 |
| 4 | Ada masukan dan penerima siap | 1 | 1 | 4 |
Antrean kosong tidak dapat melakukan pop hanya karena penerima siap. Masukan barunya pertama kali ditransfer pada tepi berikutnya. Antrean penuh [A,B,C,D] yang sekaligus mengirim A dan menerima E menjadi [B,C,D,E], tetap penuh. Verifikasi perilaku memori yang mendasarinya saat membaca dan menulis posisi fisik yang sama.
FIFO empat slot. Awalnya kosong; pointer baca dan tulis bernilai 0. Terima pop ketika tidak kosong. Terima push jika ada ruang atau pop diterima pada tepi yang sama.
Kedalaman berpangkat dua berputar secara alami dalam bit penunjuk. Kedalaman tiga memerlukan transisi eksplisit dari posisi dua ke nol. Uji perputaran, pengambilan item terakhir, dan penggantian saat penuh secara terpisah.
Antrean kosong berkedalaman empat hanya menampung empat item selama penundaan penerima lima siklus. Masukan kelima harus menunggu. Sumber yang tidak dapat ditunda membutuhkan kapasitas lebih besar atau kebijakan kehilangan yang ditetapkan. Tidak ada FIFO berhingga yang memperbaiki konsumsi yang selalu lebih lambat. Periksa 0≤count≤depth, accepted-delivered=count, dan urutan tag; jumlah saja tidak mengungkap perubahan urutan.
Coba sendiri
Untuk kedalaman dua dan antrean [tag3,tag4], masukan tag5 ditawarkan dengan out-ready=1. Cari push, pop, count berikutnya, dan antrean berikutnya. Apakah tag5 langsung di-pop jika antrean kosong?
Baca penjelasan
Pop=1 membuat input-ready tinggi meskipun okupansi penuh, sehingga push=1. Count berikutnya tetap dua dan antreannya [tag4,tag5]. Antrean kosong memiliki out-valid=0, sehingga tag5 disimpan dan tidak dapat di-pop hingga tepi berikutnya.