Pengantar Kunci Putar
Kunci putar didefinisikan kernel, mekanisme sinkronisasi khusus mode kernel, diekspor sebagai jenis buram: KSPIN_LOCK. Kunci putaran dapat digunakan untuk melindungi data atau sumber daya bersama dari akses bersamaan. Saat berjalan di IRQL <= DISPATCH_LEVEL, driver dapat menggunakan KeAcquireInStackQueuedSpinLock dan KeReleaseInStackQueuedSpinLock untuk memperoleh dan melepaskan kunci putaran sebagai kunci putar yang diantrekan.
Atau, penelepon yang berjalan di IRQL >= DISPATCH_LEVEL dapat memanggil KeAcquireSpinLockAtDpcLevel dan KeReleaseSpinLockFromDpcLevel untuk performa driver yang lebih baik.
Banyak komponen menggunakan kunci putar, termasuk driver. Setiap jenis driver mungkin menggunakan satu atau beberapa kunci putaran eksekutif. Misalnya, sebagian besar sistem file menggunakan antrean kerja yang saling mengunci dalam ekstensi perangkat driver sistem file (FSD) untuk menyimpan RUN yang diproses baik oleh rutinitas panggilan balik alur pekerja sistem file dan oleh FSD. Antrean kerja yang saling mengunci dilindungi oleh kunci putaran eksekutif, yang menyelesaikan ketidakcocokan di antara FSD yang mencoba memasukkan RUN ke dalam antrean dan utas apa pun secara bersamaan mencoba menghapus RUN. Sebagai contoh lain, driver pengontrol floppy sistem menggunakan dua kunci putaran eksekutif. Satu kunci putaran eksekutif melindungi antrean kerja yang saling mengunci yang dibagikan dengan utas khusus perangkat driver ini; yang lain melindungi objek timer yang dibagikan oleh tiga rutinitas driver.
Kunci putar antrean memberikan performa yang lebih baik daripada kunci putaran biasa untuk kunci pertikaian tinggi pada mesin multiprosedur. Untuk informasi selengkapnya, lihat Kunci Spin Antrean. Driver juga dapat menggunakan KeAcquireSpinLock dan KeReleaseSpinLock untuk memperoleh dan melepaskan kunci putaran sebagai kunci putaran biasa.
Untuk menyinkronkan akses ke struktur data sederhana, driver dapat menggunakan salah satu rutinitas ExInterlockedXxx untuk memastikan akses atom ke struktur data. Driver yang menggunakan rutinitas ini tidak perlu memperoleh atau melepaskan kunci putar secara eksplisit.
Setiap driver yang memiliki ISR menggunakan kunci putaran interupsi untuk melindungi data atau perangkat keras apa pun yang dibagikan antara ISR dan rutinitas SynchCritSection yang biasanya dipanggil dari rutinitas StartIo dan DpcForIsr-nya. Kunci putaran interupsi dikaitkan dengan set objek interupsi yang dibuat saat driver memanggil Io Koneksi Interrupt, seperti yang dijelaskan dalam Mendaftarkan ISR.
Ikuti panduan berikut untuk menggunakan kunci putaran di driver:
Berikan penyimpanan untuk data atau sumber daya apa pun yang dilindungi oleh kunci putaran dan untuk kunci putar yang sesuai dalam memori ruang sistem residen (kumpulan yang tidak dipagasi, seperti yang ditunjukkan pada Ruang Memori Virtual dan angka Memori Fisik). Driver harus menyediakan penyimpanan untuk setiap kunci putaran eksekutif yang digunakannya. Namun, driver perangkat tidak perlu menyediakan penyimpanan untuk kunci putaran interupsi kecuali memiliki ISR multivektor atau memiliki lebih dari satu ISR, seperti yang dijelaskan dalam Mendaftarkan ISR.
Panggil KeInitializeSpinLock untuk menginisialisasi setiap kunci putaran yang disediakan driver sebelum menggunakannya untuk menyinkronkan akses ke data atau sumber daya bersama yang dilindunginya.
Panggil setiap rutinitas dukungan yang menggunakan kunci putaran pada IRQL yang sesuai, umumnya pada <= DISPATCH_LEVEL untuk kunci putaran eksekutif atau di = DIRQL <untuk kunci putaran interupsi yang terkait dengan objek interupsi driver.
Terapkan rutinitas untuk dijalankan secepat mungkin sambil memegang kunci putaran. Tidak ada rutinitas yang harus menahan kunci putaran lebih dari 25 mikrodetik.
Jangan pernah menerapkan rutinitas yang melakukan salah satu hal berikut sambil memegang kunci putar:
Menyebabkan pengecualian perangkat keras atau memunculkan pengecualian perangkat lunak.
Coba akses memori yang dapat di-pageable.
Lakukan panggilan rekursif yang akan menyebabkan kebuntuan atau dapat menyebabkan kunci putaran ditahan lebih dari 25 mikrosekon.
Mencoba untuk memperoleh kunci putaran lain jika melakukannya dapat menyebabkan kebuntuan.
Panggil rutinitas eksternal yang melanggar salah satu aturan sebelumnya.