Bagikan melalui


Mencegah Kesalahan dan Kebuntuan Saat Menggunakan Kunci Putar

Meskipun rutinitas driver memegang kunci putaran, itu tidak dapat menyebabkan pengecualian perangkat keras atau menimbulkan pengecualian perangkat lunak tanpa menurunkan sistem. Dengan kata lain, ISR dari 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 boleh menimbulkan pengecualian perangkat lunak. Rutinitas yang memanggil KeAcquireSpinLock atau KeAcquireInStackQueuedSpinLock juga tidak dapat menyebabkan pengecualian perangkat keras atau menimbulkan pengecualian perangkat lunak sampai merilis kunci putaran eksekutifnya dan tidak lagi berjalan di IRQL = DISPATCH_LEVEL.

Rutinitas Data yang Dapat Dipaging dan Pendukung

Saat memegang spin lock, driver tidak boleh memanggil rutinitas yang mengakses data pageable. Ingatlah bahwa driver dapat memanggil rutinitas dukungan tertentu yang mengakses data yang dapat di-pageable jika dan hanya jika panggilan mereka terjadi saat menjalankan di IRQL secara ketat kurang dari DISPATCH_LEVEL. Pembatasan IRQL ini melarang pemanggilan rutinitas pendukung tersebut saat sedang memegang spin lock. Untuk persyaratan IRQL untuk rutinitas dukungan tertentu, lihat halaman referensi rutin.

Rekursi

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

Panduan berikut menjelaskan cara menggunakan spin lock 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 driver lain tidak boleh memanggil rutinitas rekursif jika rekursi dapat menyebabkan kebuntuan atau dapat menyebabkan penelepon menahan kunci putar selama lebih dari 25 mikrosecond.

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

Akuisisi Kunci Putar Berlapis

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

Panduan berikut menjelaskan bagaimana driver harus menahan kunci putaran:

  • Pengemudi tidak boleh memanggil rutinitas dukungan yang menggunakan kunci putar, kecuali jika kebuntuan tidak mungkin terjadi.

  • Bahkan jika kebuntuan tidak dapat terjadi, driver sebaiknya tidak memanggil rutinitas dukungan yang menggunakan spin lock kecuali jika teknik pengodean alternatif tidak dapat memberikan performa dan fungsionalitas driver yang sebanding.

  • Jika driver melakukan panggilan berlapis untuk memperoleh kunci putaran, driver harus selalu memperoleh kunci putaran dalam urutan yang sama setiap kali mereka diperoleh. Urutan ini membantu menghindari kebuntuan.

Secara umum, hindari menggunakan kunci putar berlapis untuk melindungi subset yang tumpang tindih atau kumpulan 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. Driver akan mengalami deadlock secara berkala di mesin SMP, setiap kali salah satu dari dua rutinitas, masing-masing memegang satu kunci putaran, mencoba untuk memperoleh kunci putaran lainnya.

Untuk informasi selengkapnya tentang memperoleh spinlock tertumpuk, lihat Locks, Deadlocks, and Synchronization.