Jawaban:
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.
Ini adalah perulangan yang tepat yang terus berjalan sampai kondisi tertentu terpenuhi:
while(cantGoOn) {};
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).
while(something != TRUE ){};
// it happend
move_on();
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 .
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:
While(SpinCount-- && Kernel Object is not free)
{}
try acquiring Kernel object
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.
Pemintalan dapat bermanfaat saat kunci berbutir halus dan jumlahnya besar (misalnya, kunci per node dalam daftar tertaut) serta saat waktu penahanan kunci selalu sangat singkat. Secara umum, sambil memegang kunci putar, seseorang harus menghindari pemblokiran, memanggil apa pun yang mungkin diblokir, memegang lebih dari satu kunci putar sekaligus, membuat panggilan yang dikirim secara dinamis (antarmuka dan virtual), membuat panggilan yang dikirim secara statis ke kode apa pun yang tidak dilakukan seseorang ' t memiliki, atau mengalokasikan memori.
Penting juga untuk dicatat bahwa SpinLock adalah tipe nilai, untuk alasan kinerja. Dengan demikian, seseorang harus sangat berhati-hati untuk tidak secara tidak sengaja menyalin instance SpinLock, karena kedua instance (asli dan salinannya) kemudian akan sepenuhnya independen satu sama lain, yang kemungkinan akan menyebabkan perilaku aplikasi yang salah. Jika instance SpinLock harus diedarkan, itu harus diteruskan dengan referensi, bukan dengan nilai.
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.
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.
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.