Bagaimana spinlock berbeda dari polling?

41

Apakah spinlock dan polling adalah hal yang sama?

Wikipedia:

spinlock adalah kunci yang menyebabkan utas mencoba mendapatkannya dengan hanya menunggu dalam satu lingkaran ("putaran") sambil berulang kali memeriksa apakah kunci tersedia

Ini terdengar sangat mirip:

while(!ready);

Saya diajari untuk menghindari pemungutan suara bila memungkinkan karena hal itu secara keseluruhan kurang optimal. Jadi, apakah spinlock nama yang bagus untuk polling lama yang buruk? Bagaimana spinlock berbeda dari polling?

Tuan Loh.
sumber

Jawaban:

85

Polling mengacu pada berulang kali memeriksa apakah suatu sumber daya ( segala jenis sumber daya) siap.

Spinlock adalah ketika sumber daya yang Anda polling adalah kunci.

Perhatikan bahwa pemungutan suara tidak buruk. Secara khusus, polling efisien ketika biasanya ada data yang siap ketika Anda polling. Polling hanya tidak efisien jika Anda melakukannya tanpa mendapatkan data apa pun sebagai balasannya.

Di sisi lain, interupsi tidak efisien jika ada begitu banyak data sehingga Anda terus-menerus terganggu. Mereka efisien jika data datang cukup jarang sehingga Anda benar-benar bisa menyelesaikan pekerjaan yang berguna sebelum terganggu.

Saya dapat memberi Anda contoh kehidupan nyata dari pengalaman saya sendiri: 15 tahun yang lalu, saya mengatur program email untuk mengganggu saya setiap kali email baru masuk. Yang terjadi sekali atau dua kali seminggu. Terus-menerus memeriksa kotak masuk saya akan membuang-buang waktu.

Saat ini, semua notifikasi saya dimatikan. Saya tahu bahwa setiap kali saya melihat kotak masuk saya, akan ada email baru di sana. Polling sekarang jauh lebih efisien.

Spinlocks efisien ketika a) kemungkinan kunci diambil rendah, dan b) jika kunci diambil, ia hanya akan ditahan untuk waktu yang singkat. Dengan kata lain: ini efisien untuk sebagian besar kunci berbutir halus, tetapi tidak efisien untuk kunci berbutir kasar yang sangat diperdebatkan.

(Dan tentu saja, spinlocks hanya berfungsi ketika ada paralelisme yang sebenarnya, kalau tidak thread lain tidak akan memiliki kesempatan untuk melepaskan kunci. Saya kira itu agak jelas, tetapi saya tetap ingin menyatakannya.)

Jörg W Mittag
sumber
5
Spinlocks bisa sangat masuk akal di lingkungan yang multitugas secara kooperatif. Anda hanya perlu memastikan bahwa Anda menghasilkan kontrol dalam loop.
Kevin
4
Contoh yang bagus dengan email. Mengingatkan saya pada Anda selalu memiliki email ...
Petr Pudlák
2
@ Kevin: Saya memiliki ide yang sangat murni tentang spinlock, secara harfiah kunci yang hanya berputar dalam satu lingkaran kosong. ( atomically_do { while (lock.is_locked?); lock.acquire! }) Jika menghasilkan, itu bukan loop kosong dan dengan demikian bukan spinlock dalam pandangan murni: -D Tapi tentu saja beberapa hibridisasi dengan jenis lain dari kunci atau relaksasi / penambahan pada ideal platonis masuk akal di dunia nyata.
Jörg W Mittag
3
@bubakazouba: Spinlock bekerja dengan benar-benar "memutar" dalam loop kosong dan memeriksa "Apakah kunci sudah dilepaskan? Apakah kunci dilepaskan? Apakah kunci dilepaskan? Apakah kunci dilepaskan? Apakah kunci dilepaskan? Apakah kunci dilepaskan?" lagi dan lagi. Jika tidak ada paralelisme, maka tidak ada utas lain yang berjalan pada saat yang sama yang dapat melepaskan kunci, sehingga Anda secara efektif memiliki loop tanpa akhir! Lihat komentar langsung di atas Anda.
Jörg W Mittag
1
@kasperd: Anda masih dapat melihat multitasking kooperatif dalam perangkat lunak server yang dikendalikan oleh peristiwa seperti nginx. Dalam hal ini, ada satu utas dan tidak ada penguncian, yang berarti Anda hanya bisa mengeksploitasi satu inti. Sepengetahuan saya, tidak ada contoh nyata multitasor koperasi nyata di dunia nyata. Sistem seperti itu akan bodoh, karena Anda akan mendapatkan semua kelemahan dari kerja sama multitasking tanpa terbalik tanpa kunci.
Kevin
10

Spinlock adalah jenis kunci, khususnya yang diperoleh melalui polling.

Polling adalah metode untuk memeriksa status sesuatu (dengan meminta status, sebagai lawan dari menunggu untuk diberi tahu statusnya).

Tidak semua polling adalah spinlock, misalnya, polling status tombol keyboard.


Juga, polling secara inheren tidak buruk. Periode pemungutan suara yang sangat singkat dapat menghindari perubahan konteks yang mahal yang membutuhkan interupsi, belum lagi bahwa pemungutan suara kadang-kadang bisa lebih mudah untuk diterapkan dan dengan demikian lebih mudah untuk dipertahankan, terutama pada tingkat yang lebih rendah. Seperti biasa, absolut adalah hal yang mengerikan, dan Anda harus menggunakan metode yang memberikan kinerja / kompleksitas yang sesuai untuk kebutuhan Anda saat Anda mengukurnya , daripada secara membabi buta menggunakan atau membuang opsi.

8bree
sumber
5

Spinlock berbeda dari pemungutan suara karena hanya terjadi untuk periode waktu yang sangat singkat, dalam urutan beberapa milidetik atau kurang. Polling bisa berlangsung tanpa batas.

Dalam pemrograman paralel, episode pemintalan singkat seringkali lebih baik daripada pemblokiran, karena menghindari biaya pengalihan konteks dan transisi kernel.

Bacaan Lebih Lanjut
SpinLock dan SpinWait di C #
Spinlocks dan Read-Write Locks di C

Robert Harvey
sumber
Saya pikir Anda bermaksud mengatakan mikrodetik. Untuk kunci yang bertahan satu milidetik, kita harus menggunakan implementasi kunci yang membuat panggilan kernel pada pertikaian.
Peter
@ Peter Mungkin itulah yang dimaksud Albahari. Itulah yang dikatakan teksnya.
Robert Harvey
4

Perbedaannya adalah bahwa spinlock (semoga) hanya digunakan dalam situasi yang sesuai, dan dalam situasi ini sangat efisien.

Anda menggunakan spinlock jika Anda mengharapkan sumber daya hanya akan dikunci untuk waktu yang sangat singkat - misalnya jika kunci hanya digunakan untuk memperbarui variabel. Spinlock mengumpulkan kunci pada kecepatan maksimum, tetapi mudah-mudahan kurang dari mikrodetik. Mutex normal akan membutuhkan panggilan OS. JIKA kunci hanya ditahan untuk sejumlah kecil waktu, maka spinlock hanya menggunakan sedikit waktu CPU, sementara panggilan OS akan memakan waktu lebih lama. Tetapi jika ekspektasi ini salah, maka spinlock sangat tidak efisien - ia akan menggunakan waktu CPU 100% pada satu CPU, sedangkan mutex normal hanya membutuhkan waktu untuk memasuki OS dan kembali.

Terkadang keduanya digabungkan; Anda menjalankan spin lock untuk waktu yang singkat dan beralih ke strategi yang berbeda jika spinlock tidak berfungsi.

gnasher729
sumber
2

Polling yang berlebihan adalah sesuatu yang tidak boleh Anda lakukan karena boros sumber daya sistem. Oleh karena itu polling baik-baik saja jika tidak menyia-nyiakan sumber daya sistem .

Sebagai contoh, pemungutan suara yang berlebihan akan menghasilkan beban CPU hingga 100% dalam kasus di mana pekerjaan yang sebenarnya hanya akan menghasilkan beban 2%.

Polling dapat digunakan untuk hal lain selain while(!ready). Misalnya itu berarti memeriksa secara teratur jika pengguna menekan tombol. Implementasi yang waras akan memeriksa paling banyak sekali setiap 15 milidetik, jadi itu satu pemeriksaan setiap ~ 20 juta siklus clock. Jajak pendapat semacam itu hebat, karena tidak menyia-nyiakan sumber daya sistem.

SpinLock bukan kasus khusus. Jika kita memiliki SpinLock dan satu utas memasuki kunci, dan yang lain harus menunggu, SpinLock adalah pilihan yang salah jika dan hanya jika utas menunggu menghabiskan sumber daya sistem. Utas tunggu akan menyia-nyiakan sumber daya sistem jika dan hanya jika harus menunggu waktu yang cukup lama sebelum dapat memperoleh kunci.

Oleh karena itu, menggunakan SpinLock untuk melindungi apa pun yang memerlukan beberapa ribu siklus jam atau lebih sebelum membukanya kembali (mis., Mengkompilasi dan mengeksekusi sepotong javascript dengan cepat) buruk, tepat untuk alasan yang Anda nyatakan. Tetapi menggunakan SpinLock untuk melindungi sesuatu yang selesai dengan cepat, seperti mengakses peta hash yang diimplementasikan dengan baik adalah baik karena utas menunggu hanya akan berputar 2 atau 3 kali dan karenanya tidak menghabiskan sumber daya sistem.

Peter
sumber