19 / 24 · Konsep
Pertahankan pencatatan transaksi saat pengosongan dan reset
Pisahkan pembatalan dari pengiriman dan selaraskan status valid dengan antrean yang diharapkan.
Pelajaran dapat dibaca gratis. Daftar untuk menyimpan progres.
Pembatalan merupakan peristiwa desain yang eksplisit
Reset mengembalikan kendali ke keadaan yang diketahui; pengosongan membatalkan pekerjaan tertentu yang belum selesai. Mengosongkan data saja tidak cukup. Jika valid tetap tinggi, nol dapat menjadi transaksi palsu. Bit data lama dengan valid nol tidak berbahaya. Kosongkan keadaan kepemilikan yang sesuai: full dalam penyangga satu slot, count dan penunjuk dalam FIFO, atau keadaan FSM dan valid hasil.
Kontrak sinkron satu clock kita mengecualikan penerimaan dan pengiriman pada tepi reset di kedua ujung serta membatalkan seluruh pekerjaan yang belum selesai pada tepi itu. Mereset hanya satu ujung sementara ujung lain menghitung valid lama sebagai pengiriman melanggar kesepakatan tersebut. Dokumentasikan cakupan reset dan kebijakan kesiapan. Masukan baru setelah reset termasuk interval transaksi baru.
| Peristiwa | accepted | delivered | canceled | outstanding |
|---|---|---|---|---|
| Terima A,B,C | 3 | 0 | 0 | 3 |
| Kirim A | 3 | 1 | 0 | 2 |
| Batalkan B,C | 3 | 1 | 2 | 0 |
| Terima D | 4 | 1 | 2 | 1 |
| Kirim D | 4 | 2 | 2 | 0 |
Dengan pembatalan, gunakan accepted-delivered-canceled=outstanding. Batalkan setiap transaksi yang belum dikirim tepat sekali. Antrean acuan juga harus menghapus pekerjaan yang dibatalkan, sambil memeriksa bahwa tidak ada hasil usang masuk ke interval baru.
Permintaan memori eksternal dapat bertahan melewati pengosongan internal. Bedakan respons terlambat menggunakan pengenal generasi, atau tunggu permintaan lama selesai sebelum memulai kembali. Menggunakan ulang bidang generasi kecil terlalu cepat dapat membuat respons lama tertukar dengan respons saat ini. Proyek akhir kita tidak memiliki respons eksternal tertunda dan hanya membatalkan penyangga internal.
Pengosongan selektif dapat mempertahankan pekerjaan yang lebih lama daripada suatu percabangan sambil menghapus operasi lebih muda pada jalur salah. Ini memerlukan aturan urutan dan commit yang ditetapkan. Pekerjaan tidak valid tidak boleh memperbarui penyimpanan atau ikut dalam penerusan. Uji reset saat kosong, tertunda, penuh, dan selama kemungkinan transfer serentak. Reset awal saja tidak menguji pembatalan pekerjaan yang belum selesai.
Coba sendiri
Terima lima, kirim dua, lalu batalkan tiga sisanya. Berikutnya terima dua dan kirim satu. Cari jumlah kumulatif accepted, delivered, canceled, dan outstanding.
Baca penjelasan
Accepted=7, delivered=3, canceled=3, outstanding=1. Pencatatannya adalah 7-3-3=1. Item yang dibatalkan bukan pengiriman yang berhasil.