Bagikan melalui


Pengantar kunci putar

Spin lock adalah mekanisme sinkronisasi yang didefinisikan oleh kernel dan hanya berfungsi pada mode kernel, dieksport sebagai tipe opaque: 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 spin lock sebagai spin lock antrean .

Atau, penelepon yang berjalan di IRQL >= DISPATCH_LEVEL dapat memanggil KeAcquireSpinLockAtDpcLevel dan KeReleaseSpinLockFromDpcLevel untuk performa driver yang lebih baik.

Banyak komponen menggunakan pengunci putar, termasuk driver. Setiap jenis driver mungkin menggunakan satu atau beberapa kunci putar eksekutif. Misalnya, sebagian besar sistem file menggunakan antrean pekerjaan yang terkunci dalam ekstensi perangkat dari driver sistem file (FSD) untuk menyimpan IRP yang diproses baik oleh rutinitas panggilan balik dari alur kerja sistem file dan oleh FSD. Antrean kerja yang saling mengunci dilindungi oleh spin lock eksekutif, yang menyelesaikan persaingan di antara FSD yang mencoba memasukkan IRP ke dalam antrean dan utas apa pun yang secara bersamaan mencoba menghapus IRP. Sebagai contoh lain, driver pengontrol disket floppy sistem menggunakan dua kunci putar. Satu "spin lock" eksekutif melindungi antrean kerja terhubung yang dibagikan dengan utas khusus perangkat penggerak ini; yang lainnya melindungi objek penanda waktu yang dibagikan oleh tiga prosedur driver.

Kunci putar berantai memberikan performa yang lebih baik daripada kunci putar biasa untuk kunci dengan tingkat kontensi tinggi pada mesin multiprosesor. Untuk informasi selengkapnya, lihat Antrian Spin Lock. Driver juga dapat menggunakan KeAcquireSpinLock dan KeReleaseSpinLock untuk memperoleh dan melepaskan kunci putaran sebagai kunci putar biasa.

Untuk menyinkronkan akses ke struktur data sederhana, driver dapat menggunakan salah satu rutinitas ExInterlockedXxx untuk memastikan akses atomik ke struktur data. Pengemudi yang menggunakan rutinitas ini tidak perlu secara eksplisit memperoleh atau melepaskan kunci putar.

Setiap driver yang memiliki ISR menggunakan kunci putar interupsi untuk melindungi data atau perangkat keras apa pun yang dibagikan antara ISR dan rutinitas SynchCritSection yang dipanggil dari rutinitas StartIo dan DpcForIsr . Kunci putaran interupsi dikaitkan dengan set objek interupsi yang dibuat saat driver memanggil IoConnectInterrupt, seperti yang dijelaskan dalam Mendaftarkan ISR.

Ikuti panduan ini untuk menggunakan kunci putaran di driver:

  • Berikan penyimpanan untuk data atau sumber daya yang dilindungi oleh kunci putar dan untuk kunci putar itu sendiri dalam memori ruang sistem residen (pool yang tidak dipagasi, seperti ditunjukkan dalam gambar Ruang Memori Virtual dan 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 spin lock yang disediakan oleh driver sebelum menggunakannya untuk sinkronisasi akses ke data atau sumber daya bersama yang dilindunginya.

  • Panggil setiap rutinitas dukungan yang menggunakan kunci putar pada IRQL yang sesuai, umumnya pada <= DISPATCH_LEVEL untuk kunci putar eksekutif atau pada <= DIRQL untuk kunci putar 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 mengakses memori yang bisa dipindahkan halaman.

    • 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.