Mencegah Kesalahan dan Kebuntuan Saat Menggunakan Kunci Putar

Meskipun rutinitas driver memegang kunci putaran, itu tidak dapat menyebabkan pengecualian perangkat keras atau menaikkan pengecualian perangkat lunak tanpa menurunkan sistem. Dengan kata lain, ISR driver dan rutinitas SynchCritSection apa pun yang disediakan driver dalam panggilan ke KeSynchronizeExecution tidak boleh menyebabkan kesalahan atau perangkap, seperti kesalahan halaman atau pengecualian aritmatika, dan tidak dapat meningkatkan pengecualian perangkat lunak. Rutinitas yang memanggil KeAcquireSpinLock atau KeAcquireInStackQueuedSpinLock juga tidak dapat menyebabkan pengecualian perangkat keras atau menaikkan pengecualian perangkat lunak sampai merilis kunci spin eksekutifnya dan tidak lagi berjalan di IRQL = DISPATCH_LEVEL.

Rutinitas Data dan Dukungan yang Dapat Dipaginasi

Saat memegang kunci putar, driver tidak boleh memanggil rutinitas yang mengakses data yang dapat dipaginasi. Ingatlah bahwa driver dapat memanggil rutinitas dukungan tertentu yang mengakses data yang dapat dipaginasi jika dan hanya jika panggilan mereka terjadi saat mengeksekusi di IRQL yang benar-benar kurang dari DISPATCH_LEVEL. Pembatasan IRQL ini menghalangi panggilan rutinitas dukungan ini sambil memegang kunci putaran. Untuk persyaratan IRQL untuk rutinitas dukungan tertentu, lihat halaman referensi rutin.

Rekursi

Mencoba memperoleh kunci putaran secara rekursif dijamin menyebabkan kebuntuan: instantiasi memegang rutinitas rekursif tidak dapat melepaskan kunci putaran sementara instansiasi kedua berputar, mencoba memperoleh kunci putaran yang sama.

Panduan berikut menjelaskan cara Anda menggunakan kunci spin dengan rutinitas rekursif:

  • Rutinitas rekursif tidak boleh memanggil dirinya sendiri saat memegang kunci putaran, atau tidak boleh mencoba memperoleh kunci putaran yang sama pada panggilan berikutnya.

  • Meskipun rutinitas rekursif memegang kunci putaran, rutinitas pengemudi lain tidak boleh memanggil rutinitas rekursif jika rekursi dapat menyebabkan kebuntuan atau dapat menyebabkan penelepon menahan kunci putaran lebih dari 25 mikrosekon.

Untuk informasi selengkapnya tentang rutinitas driver rekursif, lihat Menggunakan Tumpukan Kernel.

Akuisisi Kunci Spin Berlapis

Mencoba memperoleh kunci putaran kedua sambil memegang kunci spin lain juga dapat menyebabkan kebuntuan atau performa driver yang buruk.

Panduan berikut menjelaskan bagaimana driver harus menahan kunci spin:

  • Driver tidak boleh memanggil rutinitas dukungan yang menggunakan kunci putar kecuali kebuntuan tidak dapat terjadi.

  • Bahkan jika kebuntuan tidak dapat terjadi, driver tidak boleh memanggil rutinitas dukungan yang menggunakan kunci putaran kecuali teknik pengkodean alternatif tidak dapat memberikan performa dan fungsionalitas driver yang sebanding.

  • Jika pengemudi melakukan panggilan berlapis untuk memperoleh kunci spin, ia harus selalu memperoleh kunci spin dalam urutan yang sama setiap kali mereka diperoleh. Perintah ini membantu menghindari kebuntuan.

Secara umum, hindari menggunakan kunci spin berlapis untuk melindungi subset yang tumpang tindih atau set diskrit data dan sumber daya bersama. Pertimbangkan apa yang dapat terjadi jika driver menggunakan dua kunci putaran eksekutif untuk melindungi sumber daya diskrit, seperti sepasang objek timer yang mungkin diatur secara individual dan kolektif oleh berbagai rutinitas driver. Pengemudi akan mengalami kebuntuan sewaktu-waktu di mesin SMP, setiap kali salah satu dari dua rutinitas, masing-masing memegang satu kunci putaran, mencoba memperoleh kunci putaran lainnya.

Untuk informasi selengkapnya tentang memperoleh kunci spin berlapis, lihat Kunci, Kebuntuan, dan Sinkronisasi.