Kunci Putar antrean
Kunci spin yang diantrekan adalah varian kunci putar yang bekerja dengan baik untuk kunci yang sangat dipersatukan. Kunci spin tradisional yang tidak diantrekan adalah pilihan yang lebih baik untuk kunci durasi yang ringan atau lebih pendek.
Manfaat menggunakan kunci putar yang diantrekan meliputi:
Pengurangan Ketidakcocokan Prosesor: Kunci putar tradisional dapat menyebabkan ketidakcocokan prosesor yang signifikan ketika beberapa utas mencoba untuk memperoleh kunci secara bersamaan, karena terus mengulang (atau "berputar") memeriksa status kunci. Hal ini dapat menurunkan performa sistem, terutama pada sistem multiproscessor. Kunci putaran antrean mengurangi ini dengan mengatur utas ke dalam antrean. Ketika utas memperoleh kunci, hanya baris berikutnya yang secara aktif berputar, menunggu untuk memperoleh kunci. Ini mengurangi siklus CPU yang terbuang saat berputar, terutama ketika kunci ditahan untuk durasi yang lebih lama.
Kewajaran dan Penghindarian Kelaparan: Salah satu masalah dengan kunci spin dasar adalah kurangnya kewajaran; utas dapat kelaparan dan tidak pernah memperoleh kunci jika utas lain terus memperoleh dan melepaskannya. Kunci putaran yang diantrekan mengatasinya dengan memastikan bahwa utas memperoleh kunci dalam urutan yang mereka coba. Penanganan berurutan ini mencegah kelaparan dan memastikan bahwa semua utas mendapatkan layanan dari waktu ke waktu.
Skalabilitas: Ketika jumlah prosesor atau inti meningkat dalam suatu sistem, efisiensi mekanisme sinkronisasi menjadi penting untuk performa. Kunci spin yang diantrekan lebih dapat diskalakan daripada kunci spin tradisional karena mengurangi overhead pada prosesor dengan meminimalkan pemutaran aktif di semua inti. Ini sangat penting dalam sistem multi-inti performa tinggi di mana efisiensi driver dapat langsung berdampak pada performa sistem secara keseluruhan.
Penggunaan Sumber Daya Sistem yang Efisien: Dengan mengurangi pemintalan prosesor yang tidak perlu, kunci spin yang diantrekan memungkinkan sistem untuk menggunakan sumber dayanya secara lebih efisien. Hal ini tidak hanya meningkatkan performa driver perangkat tetapi juga berdampak positif pada responsivitas sistem secara keseluruhan dan konsumsi daya, yang sangat bermanfaat dalam lingkungan yang sensitif terhadap daya.
Kesederhanaan dan Keandalan: Terlepas dari keuntungan mereka dalam mengurangi pertikaian dan meningkatkan kewajaran, kunci spin yang diantrekan mengabstraksi kompleksitas dari pengembang. Mereka menyediakan mekanisme yang sederhana dan dapat diandalkan untuk melindungi sumber daya bersama tanpa pengembang harus menerapkan logika penguncian yang kompleks. Kesederhanaan ini mengurangi kemungkinan bug yang terkait dengan penanganan kunci yang tidak tepat, sehingga meningkatkan keandalan driver.
Di bawah ini adalah cuplikan kode yang disederhanakan yang menunjukkan operasi yang dijelaskan dengan kunci putar yang diantrekan dalam Driver Mode Kernel Windows. Contoh ini menunjukkan cara mendeklarasikan dan menginisialisasi kunci putar menggunakan KeInitializeSpinLock, lalu memperoleh dan melepaskan kunci menggunakan KeAcquireInStackQueuedSpinLock dan KeReleaseInStackQueuedSpinLock.
KSPIN_LOCK SpinLock;
KLOCK_QUEUE_HANDLE LockHandle;
// Initialize the spin lock
KeInitializeSpinLock(&SpinLock);
// Assume this function is called in some kind of context where
// the below operations make sense, e.g., in a device I/O path
// Acquire the queued spin lock
KeAcquireInStackQueuedSpinLock(&SpinLock, &LockHandle);
// At this point, the current thread holds the spin lock.
// Perform thread-safe operations here.
// ...
// Release the queued spin lock
KeReleaseInStackQueuedSpinLock(&LockHandle);
Driver mengalokasikan struktur KLOCK_QUEUE_HANDLE yang diteruskannya oleh pointer ke KeAcquireInStackQueuedSpinLock. Driver melewati struktur yang sama dengan penunjuk ke KeReleaseInStackQueuedSpinLock saat melepaskan kunci putar.
Driver biasanya harus mengalokasikan struktur pada tumpukan setiap kali mereka memperoleh kunci. Driver tidak boleh mengalokasikan struktur sebagai bagian dari konteks perangkatnya lalu berbagi struktur yang sama dari beberapa utas.
Driver tidak boleh mencampur panggilan ke rutinitas penguncian spin yang diantrekan dan rutinitas SpinLock KeXxxbiasa pada kunci putaran yang sama.
Jika driver sudah berada di IRQL = DISPATCH_LEVEL, driver dapat memanggil KeAcquireInStackQueuedSpinLockAtDpcLevel dan KeReleaseInStackQueuedSpinLockFromDpcLevel sebagai gantinya.