"Döndürme kilitleri" tam olarak nedir?


108

Her zaman ne olduklarını merak etmişimdir: Onları her duyduğumda, fütüristik volan benzeri cihazların görüntüleri zihnimde dans ediyor (yuvarlanıyor?) ...

Onlar neler?

Yanıtlar:


125

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?


bu, mümkün olan her yerde kilitleri döndürmem gerektiği anlamına mı geliyor (muteks, kritik bölüm vb. yerine)?

1
Yanlışsam birisi lütfen beni düzeltin, ancak spinlock ön emmeyi devre dışı bırakmaz (örn. yeniden programlama). basit bir nedenden ötürü, spinlock başka bir işlem tarafından kilitlenmiş bir kaynağı bekliyorsa, o zaman bu ikinci işleme, çalıştırma ve kaynağı serbest bırakma şansı verilmelidir. veya ikinci işlemi yürütmek, birinci (eğirme) işleminin önceden uygulanmasını gerektirir.
user1284631

spinlock bunun yerine işlem durumunu TASK_RUNNING'den TASK_INTERRUPTIBLE'a (uyku durumu) değiştirmemesi ve bu nedenle bu işlemle ilgili her şeyi (bellek, önbellek vb.) kaydetmemesidir . bunun yerine, eğirme işlemi önceliklidir, ancak "hemen programlanabilir" işlemlerden asla çıkmaz: bellekte tutulur ve diğer işlemler, biri eğiricinin beklediği kaynağı serbest bırakana kadar düzenli olarak çalıştırılır: o anda spinlock basitçe geri döner ve eğirme işlemi devam edebilir. her zaman TASK_RUNNING durumunda bekler.
user1284631

1
bu konuda haklısınız (ayrıca şuna bakın: linuxjournal.com/article/5833 ), ancak gerçek şu ki, bir kaynağı kilitlemek ve kesintileri devre dışı bırakmak, birlikte gerçekleştirilmesi yararlı olsa da, başka türlü ilgisiz kavramlardır. temelde tutarsız bir durumda bulunan bir kaynağı kullanmadığınızdan emin olmak istersiniz ve bu yüzden kilidini test edersiniz. kesintileri devre dışı bırakmak (ayrıca ön ödeme), evet, siz onunla uğraşırken hiç kimsenin yeniden dirilişinizle uğraşmayacağını garanti eder. ancak bunun için, kaynağı alırken kaynağın ücretsiz olduğundan emin olmalısınız.
user1284631

1
(daha sonra başka hiçbir görevin sizi engellemediğinden ve kaynakla uğraşmadığından emin olmak için kesintileri devre dışı bırakın). UP'de (tek işlemci), durum her zaman böyledir: ilk (ve sonrakiler) spinlock basitçe verilir, kesintiler (yani ön alım) devre dışı bırakılır ve kaynağı kullanan görev hiçbir zaman öncelikli değildir: her şeyi yapar kaynakla çalışın, ardından kesintileri etkinleştirin (ve dolayısıyla ön alım). ön ödeme etkinleştirildiğinde, kaynak zaten boştur. Temelde, UP, hiçbir spinlock çekişme yoktur ve hiç beklemezsiniz . SMP'de olabilir.
user1284631

25

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.


2
Güzel cevap! +1
Jayesh Bhoi

18

Belli bir koşul karşılanana kadar devam eden bir döngüdür:

while(cantGoOn) {};

1
Ve / veya while (cantGoOn) {uyku (0)};
Jiminion

@Jiminion eğer bir 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).
Sedat Kapanoğlu

"Sıfır değeri, iş parçacığının zaman diliminin kalanını çalışmaya hazır başka herhangi bir iş parçacığına bırakmasına neden olur. Çalışmaya hazır başka bir iş parçacığı yoksa, işlev hemen geri döner ve iş parçacığı çalışmaya devam eder."
Jiminion



3

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

3

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.


1

Ö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.


Tanım gereği, bir spinlock, herhangi bir kilidi serbest bırakmak veya beklemek için kullanılmaz.
rdb


0

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.


0

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.

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.