Spinlock yoklamadan ne kadar farklıdır?


41

Spinlock ve yoklama aynı şeyi mi?

Wikipedia:

Döndürme kilidi, bir iş parçacığının kilitleme olup olmadığını kontrol ederken art arda kontrol ederken bir döngüde beklemeye ("sıkma") beklemeye çalışmasına neden olan bir kilittir.

Bu çok gibi sesler:

while(!ready);

Mümkün olduğunca yoksul alt optimal olduğu için oy kullanmaktan kaçınmam gerektiği öğrenildi. Yani, spinlock kötü eski oylama için süslü bir isim midir? Bir spinlock yoklamadan ne kadar farklıdır?

Yanıtlar:


85

Yoklama, bir kaynağın ( herhangi bir tür kaynağın) hazır olup olmadığını sürekli olarak kontrol etmeyi ifade eder .

Döndürme kilidi, yoklama yaptığınız kaynağın kilit olduğu zamandır.

Oylamanın kötü olmadığını unutmayın . Özellikle, yoklama sırasında genellikle hazır veriler olduğunda, yoklama etkindir. Yoklama yalnızca, daha sonra karşılığında veri almadan yapmazsanız verimsizdir.

Öte yandan, sürekli olarak kesilecek çok fazla veri varsa, kesintiler verimsizdir. Veriler nadiren yeteri kadar geldiğinde etkindir, ancak kesintiye uğramadan önce bazı yararlı işleri yapabilirsiniz.

Size kendi deneyimlerimden gerçek hayattan bir örnek verebilirim: 15 yıl önce, yeni bir e-posta geldiğinde beni durdurmak için e-posta programımı kurdum. Haftada bir ya da iki kez oldu. Gelen kutumun sürekli kontrol edilmesi devasa bir zaman kaybı olurdu.

Bugünlerde tüm bildirimleri kapattım. Ben biliyorum gelen kutuma bakmak ne zaman, orada yeni e-postaları öyle olacak ki. Oylama artık çok daha verimli.

Spinlocks kilit alınır a) olasılığı düşük olduğunda verimli ve b) eğer kilit alınır, sadece kısa bir süre için gerçekleştirilecek. Başka bir deyişle: çoğunlukla kontrolsüz ince taneli kilitler için etkilidir, ancak yüksek oranda korunan kaba taneli kilitler için verimsizdir.

(Ve tabii ki, spinlocklar sadece gerçek paralellik olduğunda işe yarar, aksi halde diğer dişlinin kilidi serbest bırakma şansı olmaz. Sanırım bu çok açık, ama yine de belirtmek istedim.)


5
Döndürme kilitleri birlikte çalışan çok görevli bir ortamda mükemmel şekilde anlaşılabilir. Sadece döngüde kontrol sağladığından emin olmalısın.
Kevin

4
E-posta ile harika bir örnek. Bana her zaman e-posta olduğunu hatırlatıyor ...
Petr Pudlák

2
@Kevin: Tam anlamıyla boş bir döngüde dönen bir kilit, tam anlamıyla bir dönüş kilidi fikrine sahibim. ( atomically_do { while (lock.is_locked?); lock.acquire! }) Verirse, boş bir döngü değildir ve bu yüzden o saflık görünümünde bir dönme kilidi yoktur: -D Ama elbette diğer dünya kilitleri veya gevşetmeler / platonik idealin ilaveleriyle bir miktar melezleme, gerçek dünyada mükemmel bir anlam ifade eder.
Jörg W Mittag

3
@bubakazouba: Döndürme kilidi tam anlamıyla boş bir döngüde "döndürme" ve "Kilit henüz açılmış mı? Kilit henüz açılmış mı? Kilit henüz açılmış mı? Kilit henüz açılmış mı? Kilit henüz açılmış mı?" tekrar tekrar. Paralellik olmazsa, aynı zamanda çalışan kilidi açabilecek başka bir iplik yoktur, bu yüzden etkili bir şekilde sonsuz bir döngüye sahipsiniz! Yorumunuzun hemen üstündeki yoruma bakın.
Jörg W Mittag

1
@ kasperd: Nginx gibi olay odaklı sunucu yazılımlarında işbirlikçi çoklu görev görmeye devam edebilirsiniz. Bu durumda, bir iplik vardır ve kilitleme yoktur, bu sadece bir çekirdekten faydalanabileceğiniz anlamına gelir. Bildiğim kadarıyla, gerçek anlamda, gerçek çok çekirdekli kooperatif çoklu görevler için gerçek dünyadan gerçek örnekler yoktur . Böyle bir sistem aptalca olacaktır, çünkü kooperatif multitasking'in tüm dezavantajlarını, kilitleri ters çevirmeden alırsınız.
Kevin,

10

Döndürme kilidi, özellikle oylama yoluyla elde edilen bir kilit türüdür .

Yoklama, bir şeyin durumunu kontrol etmenin bir yöntemidir (statü söylenmeyi beklemek yerine, statü isteyerek).

Tüm yoklama bir döndürme kilidi değildir, örneğin, klavye tuşlarının durumunu yoklama.


Ayrıca, yoklama doğal olarak fena değil. Çok kısa süreli oylama, kesintilerin kullanılmasının gerektirdiği bağlam bağlam kaymalarını önleyebilir, oylamanın, özellikle düşük seviyelerde, yapılan uygulamaların bazen daha kolay ve bu nedenle bakımı daha kolay olabileceğinden bahsetmiyoruz. Her zaman olduğu gibi, mutlaklar çok kötü bir şeydir ve seçenekleri kör kullanarak veya atmak yerine ölçtüğünüz gibi ihtiyaçlarınız için uygun performans / karmaşıklık ticareti sağlayan yöntemi kullanmalısınız.


5

Spinlock yoklama işleminden farklıdır çünkü çok kısa bir süre için, birkaç milisaniye veya daha kısa bir sürede gerçekleşir . Yoklama süresiz olarak devam edebilir.

Paralel programlamada, bağlamsal anahtarlama ve çekirdek geçişlerinin maliyetinden kaçınılması nedeniyle, kısa bir eğirme bölümü genellikle bloke edilmek için tercih edilir.


C # Spinlock'larda SpinLock ve SpinWait Okuma ve C'de
Okuma-Yazma Kilitleri


Sanırım mikrosaniye demek istedin. Tüm milisaniyede süren bir kilit için çekirdeği çekişme çağrısı yapan bir kilitleme uygulaması kullanmalıyız.
Peter

@Peter Belki de Albahari'nin anlamı budur. Metni öyle diyor.
Robert Harvey,

4

Fark, bir spinlockun (umarım) yalnızca uygun olduğu durumlarda kullanılmasıdır ve bu durumlarda çok verimlidir.

Bir kaynağın yalnızca çok kısa bir süre için kilitleneceğini düşünüyorsanız, örneğin bir kilit yalnızca bir değişkeni güncellemek için kullanılıyorsa, bir döndürme kilidi kullanırsınız. Döndürme kilidi kilidi maksimum hızda, ancak umarım mikrosaniyeden daha kısa sürede yoklar. İşletim sistemi çağrısında normal bir muteks gerekir. EĞER kilit sadece zaman küçük bir miktar için düzenlenen OS çağrı uzun sürer iken, daha sonra spinlock yalnızca CPU zaman küçük bir miktar kullanır. Ancak bu beklenti yanlışsa, dönüş kilidi çok verimsizdir - normal bir muteks sadece işletim sistemine girmek ve geri dönmek için zaman alırken, bir CPU'da% 100 CPU zamanı kullanır.

Bazen ikisi de birleştirilir; döndürme kilidini kısa bir süre boyunca çalıştırır ve döndürme kilidi çalışmazsa farklı bir stratejiye geçersiniz.


2

Aşırı oylama, sistem kaynaklarını boşa harcadığı için yapmamanız gereken bir şeydir. Sistem kaynaklarını boşa harcamazsa , yoklamanın iyi olduğu sonucuna varır .

Örneğin, aşırı oylama, asıl işin sadece% 2 yüke yol açacağı durumlarda CPU yükünü% 100'e ulaştıracaktır.

Yoklama, başka şeyler için de kullanılabilir while(!ready). Örneğin, kullanıcının bir tuşa basıp basmadığını düzenli olarak kontrol etmek anlamına gelir. Aklı başında bir uygulama en fazla her 15 milisaniyede bir kontrol edecek, bu yüzden her ~ 20 milyon saat döngüsünde bir kontrol olacak. Bu tür bir oylama harika, çünkü sistem kaynaklarını boşa harcıyor.

Bir SpinLock özel bir durum değildir . Bir SpinLock'umuz varsa ve bir iplik kilidi girerse, diğeri beklemek zorunda kalırsa, SpinLock yanlış bir seçimdir ve eğer sadece bekleyen iplik sistem kaynaklarını boşa harcarsa yanlış seçimdir. Bekleyen iş parçacığı, yalnızca kilit elde edebilmek için önemli bir süre beklemesi gerekirse, sistem kaynaklarını israf edecektir.

Bu nedenle, tekrar kilidini açmadan önce birkaç bin saat veya daha fazla süre gerektiren bir şeyi korumak için SpinLock kullanmak (örneğin, anında bir javascript parçasını derlemek ve çalıştırmak), tam olarak belirttiğiniz nedenlerden dolayı kötüdür. Ancak hızlı bir şekilde tamamlanan bir şeyi korumak için bir SpinLock kullanmak, düzgün bir şekilde uygulanan bir karma haritaya erişmek gibi, çünkü bekleyen iş parçacığı yalnızca 2 veya 3 kez dönecek ve bu nedenle sistem kaynaklarını boşa harcamaz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.