Yanıtlar:
Düzenli kilitleri (muteksleri, kritik bölümleri vb) kullandığınızda, işletim sistemi WAIT devlet ve içinde iplik koyar geçirmekler aynı çekirdekte diğer konuları planlayarak o. Bekleme süresi gerçekten kısaysa, bunun bir performans cezası vardır, çünkü iş parçacığınız artık CPU zamanını tekrar almak için bir ön emir beklemek zorundadır.
Ayrıca, çekirdek nesneleri çekirdeğin her durumunda, örneğin bir kesme işleyicisinde veya sayfalamanın kullanılamadığı durumlarda kullanılamaz.
Spinlocks ön emmeye neden olmaz, ancak diğer çekirdek kilidi açana kadar bir döngüde ("döndürme") bekleyin. Bu, iş parçacığının kuantumunu kaybetmesini önler ve kilit açılır açılmaz devam eder. Basit spinlock mekanizması, bir çekirdeğin onu hemen hemen her durumda kullanmasına izin verir.
Bu nedenle, tek çekirdekli bir makinede spinlock basitçe "kesintileri devre dışı bırak" veya "IRQL yükseltme" dir ve iş parçacığı zamanlamayı tamamen engeller.
Spinlock'lar nihayetinde çekirdeklerin "Büyük Çekirdek Kilitlerinden" (çekirdek çekirdeğe girdiğinde ve çıkışta serbest bırakıldığında elde edilen bir kilit) kaçınmasına ve çekirdek ilkelleri üzerinde granüler kilitlemeye sahip olmasını sağlayarak çok çekirdekli makinelerde daha iyi çoklu işlemeye ve dolayısıyla daha iyi performansa neden olur.
DÜZENLEME : Bir soru geldi: "Bu, mümkün olan her yerde spinlock kullanmam gerektiği anlamına mı geliyor?" ve cevaplamaya çalışacağım:
Bahsettiğim gibi, Spinlock'lar yalnızca beklenen bekleme süresinin bir kuantumdan daha kısa olduğu (okuma: milisaniye) ve ön alımın pek bir anlam ifade etmediği (örneğin çekirdek nesnelerinin mevcut olmadığı) yerlerde kullanışlıdır.
Bekleme süresi bilinmiyorsa veya kullanıcı modundaysanız Spinlock'lar verimli değildir. Döndürme kilidinin mevcut olup olmadığını kontrol ederken, bekleyen çekirdekte% 100 CPU zamanı tüketirsiniz. Kuantumunuzun süresi dolana kadar diğer iş parçacıklarının o çekirdek üzerinde çalışmasını engellersiniz. Bu senaryo, yalnızca çekirdek düzeyindeki kısa patlamalar için uygundur ve kullanıcı modu uygulaması için olası bir seçenek değildir.
İşte SO ile ilgili şu soruyu ele alan bir soru: Spinlocks, Ne Kadar Faydalılar?
Bir kaynağın bir kilitle korunduğunu varsayalım, kaynağa erişmek isteyen bir iş parçacığının önce kilidi alması gerekir. Kilit mevcut değilse, iplik tekrar tekrar kilidin açılıp açılmadığını kontrol edebilir. Bu süre boyunca, iş parçacığı meşgul bekler, kilidi kontrol eder, CPU kullanır, ancak herhangi bir işe yaramaz. Böyle bir kilit, döndürme kilidi olarak adlandırılır.
Belli bir koşul karşılanana kadar devam eden bir döngüdür:
while(cantGoOn) {};
sleep(0)
ipliği koyarsanız , ilk etapta spinlock kullanma amacını öldürür. diğer dişlere boyun eğmeniz gerekiyorsa, normal bir kilit kullanmanız gerekir. (Yorumunuzun çok eski olduğunu biliyorum, ancak başkalarının bunu bir öneri olarak görmesini engellemek istedim).
while(something != TRUE ){};
// it happend
move_on();
Bu, beklemekle meşgul olan bir kilit türüdür
Çok düşük seviyeli sürücü programlaması haricinde bir anti-model olarak kabul edilir (burada "uygun" bir bekleme işlevi çağırmanın birkaç döngü için meşgul kilitlemeden daha fazla ek yükü olabilir).
Örneğin Linux çekirdeğindeki Spinlocks'a bakın .
SpinLocks, ipliğin kilit kullanılabilir olana kadar beklediği kilitlerdir. Bu, normalde çekirdek nesnesini küçük bir süre içinde edinmenin bir kapsamı olduğunda çekirdek nesnelerini elde etmenin ek yükünü önlemek için kullanılacaktır.
Ör:
While(SpinCount-- && Kernel Object is not free)
{}
try acquiring Kernel object
Meşgul bir bekleme döngüsüne girmenin daha ucuz olduğunu düşündüğünüzde ve kaynak kilitlendiğinde bloke etmek yerine bir kaynak havuzu oluşturmanın daha ucuz olduğunu düşündüğünüzde bir spinlock kullanmak isteyebilirsiniz.
Döndürme, kilitler ince taneli ve çok sayıda olduğunda (örneğin, bağlantılı bir listedeki düğüm başına bir kilit) ve ayrıca kilit tutma süreleri her zaman çok kısa olduğunda yararlı olabilir. Genel olarak, bir döndürme kilidi tutarken, engellemekten, engelleyebilecek herhangi bir şeyi çağırmaktan, aynı anda birden fazla döndürme kilidi tutmaktan, dinamik olarak gönderilen çağrılar yapmaktan (arayüz ve sanallar), statik olarak gönderilen çağrılar yapmaktan kaçınılmalıdır. t sahip olma veya bellek ayırma.
Performans nedenlerinden ötürü SpinLock'un bir değer türü olduğuna dikkat etmek de önemlidir. Bu nedenle, bir SpinLock örneğini yanlışlıkla kopyalamamaya çok dikkat etmelisiniz, çünkü iki örnek (orijinal ve kopya) daha sonra birbirinden tamamen bağımsız olacak ve bu da muhtemelen uygulamanın hatalı davranışına yol açacaktır. Bir SpinLock örneğinin etrafından geçirilmesi gerekiyorsa, değere göre değil, başvuruya göre iletilmelidir.
Özetle, spinlock atomik karşılaştırma ve takas (CAS) ya da test ve set benzeri komutları kullanarak kilitsiz, bekle serbest iş parçacığı güvenli deyim uygular. Bu tür yapılar, çok çekirdekli makinelerde iyi ölçeklenir.
Evet, döndürme kilitlerinin amacı (geleneksel kritik bölümlere karşı, vs.) bazı durumlarda (çok çekirdekli sistemler ..) daha iyi performans sunmalarıdır, çünkü iş parçacığının kuantumunun geri kalanını hemen vermezler.
Spinlock, bloke edilemeyen ve uyuyamayan bir kilit türüdür. Herhangi bir paylaşılan veya kritik kaynak için bir spinlock elde etmek isteyen herhangi bir iş parçacığı, belirtilen kaynak için kilidi alana kadar CPU işlem döngüsünü boşa harcayarak sürekli olarak dönecektir. Spinlock elde edildikten sonra, işi kendi kuantumunda tamamlamaya ve ardından kaynağı sırasıyla serbest bırakmaya çalışır. Spinlock, en yüksek öncelikli kilit türüdür, basitçe, önleyici olmayan bir kilit türüdür.