Saya selalu bertanya-tanya apa itu: setiap kali saya mendengarnya, gambar perangkat seperti flywheel yang futuristik menari (berputar?) Di benak saya ...
Apakah mereka?
Saat Anda menggunakan kunci biasa (mutex, bagian kritis, dll.), Sistem operasi menempatkan utas Anda dalam status WAIT dan mendahului dengan menjadwalkan utas lain pada inti yang sama. Ini memiliki penalti kinerja jika waktu tunggu sangat singkat, karena utas Anda sekarang harus menunggu preemption untuk menerima waktu CPU lagi.
Selain itu, objek kernel tidak tersedia di setiap status kernel, seperti di penangan interupsi atau saat paging tidak tersedia, dll.
Spinlock tidak menyebabkan preemption tetapi menunggu dalam satu putaran ("spin") sampai inti lainnya melepaskan kunci. Ini mencegah utas kehilangan kuantumnya dan melanjutkan segera setelah kunci dilepaskan. Mekanisme sederhana dari spinlock memungkinkan kernel untuk menggunakannya di hampir semua kondisi.
Itulah mengapa pada mesin inti tunggal, spinlock hanyalah "menonaktifkan interupsi" atau "meningkatkan IRQL" yang mencegah penjadwalan thread sepenuhnya.
Spinlock pada akhirnya memungkinkan kernel untuk menghindari "Big Kernel Lock" (kunci yang diperoleh saat inti memasuki kernel dan dilepaskan saat keluar) dan memiliki penguncian granular atas kernel primitif, menyebabkan multi-pemrosesan yang lebih baik pada mesin multi-core sehingga kinerja yang lebih baik.
EDIT : Sebuah pertanyaan muncul: "Apakah itu berarti saya harus menggunakan spinlock sedapat mungkin?" dan saya akan mencoba menjawabnya:
Seperti yang saya sebutkan, Spinlock hanya berguna di tempat-tempat di mana waktu tunggu yang diantisipasi lebih pendek daripada kuantum (baca: milidetik) dan preemption tidak masuk akal (misalnya objek kernel tidak tersedia).
Jika waktu tunggu tidak diketahui, atau jika Anda dalam mode pengguna, Spinlock tidak efisien. Anda menghabiskan 100% waktu CPU pada inti tunggu sambil memeriksa apakah spinlock tersedia. Anda mencegah utas lain berjalan pada inti itu hingga kuantum Anda kedaluwarsa. Skenario ini hanya layak untuk ledakan singkat pada tingkat kernel dan tidak mungkin merupakan opsi untuk aplikasi mode pengguna.
Berikut adalah pertanyaan tentang SO yang menjawab bahwa: Spinlocks, Seberapa Berguna Apakah Mereka?
Misalnya sumber daya dilindungi oleh kunci, utas yang menginginkan akses ke sumber daya perlu mendapatkan kunci terlebih dahulu. Jika kunci tidak tersedia, utas mungkin berulang kali memeriksa apakah kunci telah dibebaskan. Selama waktu ini, utas sibuk menunggu, memeriksa kunci, menggunakan CPU, tetapi tidak melakukan pekerjaan yang berguna. Kunci seperti itu disebut kunci putar.
sumber
Ini adalah perulangan yang tepat yang terus berjalan sampai kondisi tertentu terpenuhi:
sumber
sleep(0)
akan mendahului utas, mematikan tujuan menggunakan spinlock di tempat pertama. jika Anda perlu menyerah ke utas lain, Anda harus menggunakan kunci biasa. (Saya tahu komentar Anda sudah sangat tua tetapi ingin mencegah orang lain melihat ini sebagai saran).sumber
Ini adalah jenis kunci yang sibuk menunggu
Ini dianggap sebagai anti-pola, kecuali untuk pemrograman driver tingkat sangat rendah (di mana dapat terjadi bahwa memanggil fungsi menunggu yang "tepat" memiliki lebih banyak overhead daripada hanya penguncian sibuk untuk beberapa siklus).
Lihat misalnya Spinlocks di kernel Linux .
sumber
SpinLocks adalah yang di mana utas menunggu sampai kunci tersedia. Ini biasanya akan digunakan untuk menghindari overhead dalam memperoleh objek kernel saat ada cakupan untuk memperoleh objek kernel dalam beberapa periode waktu singkat.
Ex:
sumber
Anda ingin menggunakan spinlock jika menurut Anda lebih murah untuk memasuki loop tunggu yang sibuk dan mengumpulkan sumber daya daripada memblokir saat sumber daya terkunci.
sumber
Singkatnya, spinlock menggunakan atomic Compare and Swap (CAS) atau instruksi seperti test-and-set untuk mengimplementasikan lock free, tunggu idiom thread safe gratis. Struktur seperti itu berskala baik di mesin multi-inti.
sumber
Ini adalah lingkaran yang berputar sampai suatu kondisi terpenuhi.
sumber
Ya, inti dari spin locks (vs bagian kritis tradisional, dll) adalah bahwa mereka menawarkan kinerja yang lebih baik dalam beberapa keadaan (sistem multicore ..), karena mereka tidak segera menghasilkan sisa kuantum utas.
sumber
Spinlock, adalah jenis kunci, yang tidak dapat diblokir & tidak dapat tidur. Setiap utas yang ingin memperoleh spinlock untuk sumber daya bersama atau kritis akan terus berputar, menyia-nyiakan siklus pemrosesan CPU hingga memperoleh kunci untuk sumber daya yang ditentukan. Setelah spinlock diperoleh, ia mencoba menyelesaikan pekerjaan di kuantumnya dan kemudian melepaskan sumber daya masing-masing. Spinlock adalah jenis kunci dengan prioritas tertinggi, dapat dikatakan, ini adalah jenis kunci non-preemptive.
sumber