spin lock ve semaphores arasındaki fark nedir?


15

Döndürme kilitleri ve semaforlar arasındaki temel farklar nelerdir?



@Gilles Ben de buna baktım, ama sayfadaki semaforlardan tek söz Warren bir yorumda "Bir spin kilidi ile semafor arasındaki farkı bilmek istiyorsa, bu farklı bir soru."
Michael Mrozek

@Michael: tamam, sanırım orada cevaplar ana noktaya değindi, ama haklısın, semaforların diğer kilit türlerinden biri olduğunu açıkça belirtmediniz.
Gilles 'SO- kötü olmayı bırak'

Linus Torvalds'ın açıklaması: yarchive.net/comp/linux/semaphores.html
myaut

Stackoverflow.com/questions/195853/spinlock-versus-semaphore kopyası Yinelenen ileti dizisinde birçok iyi açıklama var.
iankits

Yanıtlar:


13

Her ikisi de sınırlı bir kaynağı yönetir. İlk olarak ikili semafor (muteks) ve dönüş kilidi arasındaki farkı anlatacağım.

Sıkma kilitleri yoğun bir bekleme gerçekleştirir - yani döngü devam eder:

while (try_acquire_resource ());
...
release();

Çok hafif kilitleme / kilit açma gerçekleştirir, ancak kilitleme ipliği aynı kaynaklara erişmeye çalışacak başkaları tarafından önlenecekse, ikincisi CPU quanta'sından tükenene kadar kaynak elde etmeye çalışacaktır.

Öte yandan muteks daha çok davranıyor:

if (!try_lock()) {
    add_to_waiting_queue ();
    wait();
}
...
process *p = get_next_process_from_waiting_queue ();
p->wakeUp ();   

Bu nedenle, iş parçacığı engellenmiş bir kaynak edinmeye çalışacaksa, bunun için uygun olana kadar askıya alınacaktır. Kilitleme / kilit açma çok daha ağırdır, ancak bekleme 'ücretsiz' ve 'adil' dir.

Semafor , birden çok kez (başlangıçtan itibaren bilinen) kullanılmasına izin verilen bir kilittir - örneğin 3 iş parçacığının kaynağı aynı anda tutmasına izin verilir, ancak daha fazla değil. Örneğin üretici / tüketici probleminde veya genel olarak kuyruklarda kullanılır:

P(resources_sem)
resource = resources.pop()
...
resources.push(resources)
V(resources_sem)

İyi açıklama, sadece bir noktayı vurgulamak istiyorum. Semafor ve muteks bir arayüz meselesidir: bir muteks tutulur ya da tutulmazken, bir semafor en fazla N iş parçacığı tarafından tutulur; muteks, N = 1 olan özel bir semafor örneğidir. Spinlock'a karşı diğer kilit türleri bir uygulama meselesidir: Bir spinlock kilidi almaya çalışırken, diğer türler bir bildirim bekler. Bir Linux çekirdek bağlamında, bir döndürme uygulamasına sahip tek kilit bir muteks arabirimine sahiptir.
Gilles 'SO- kötü olmayı bırak'

Bir Linux çekirdek bağlamında, bir döndürme uygulamasına sahip tek kilit bir muteks arabirimine sahiptir. Bu çizgiyi anlıyorum. Lütfen genişletebilir misiniz?
Sen

@Sen: Linux'ta spin kilidinin ikili davrandığını (kilitli olsun ya da olmasın) kastediyordu. Semafor gibi davranan bir eğirme kilidine sahip olmak mümkündür.
Maciej Piechotka

“Ancak kilitleme iş parçacığı aynı özgeçmişe erişmeye çalışacak başka biri tarafından önlenecekse, ikincisi CPU quanta'sından bitene kadar kaynak elde etmeye çalışacaktır.”: Ancak yine de Mutex ile ilgili bir sorun devam ediyor. Ya daha öncelikli bir görevin kaynağa erişmesi gerekiyorsa… sadece sıraya alınmış mı? Farklı önceliklere sahip görevler arasında kaynak paylaşımını geçersiz kılmak daha iyi olabilir.
Hibou57

@ Hibou57: Evet, durum tutarlı olmadığından ve kaynağı kullanmanın 'komik' etkilere sahip olacağı için engellendi (düşük öncelikli iş parçacığının bağlantılı listeye / listesinden bir şey eklemek veya listeden bir şey çıkarmak arasında olduğunu varsayalım). Bu ifadenin amacı, iş parçacığı bloke edilirse zamanlanmış değildir, bu nedenle spinlock sırasında bekleyen iş parçacığı sırasında kaynak tüketmez. Gerçek zamanlı sistemler için kilitleme (özellikle zor) farklı bir konudur ve cevaplamak için yeterli bilgiye sahip değilim - ancak bu sistem bazen öncelikli bağışları veya diğer teknikleri uygular.
Maciej Piechotka

2

Spinlocks, uyumaya izin verilmeyen bir kesme bağlamında kullanılır. Kaynak alınana kadar başka bir şey yapmadan sıkı bir döngü içinde anket yaparlar. Çoğunlukla ISR'lerde kullanılır ve daha güvenli ve verimlidir.

Semaforlar, uykunun iyi olduğu bir işlem bağlamında kullanılabilir.


1

İşte bir cevap hızlı çekim: bir spin kilidi ve (sadece bir şey tarafından kullanılabilen bir kaynağı yöneten) bir ikili semafor neredeyse aynı. Onların farkı, spin kilitlerinin çalıştırılacak kodu yönetmesidir, ikili semaforlar ise bir tür tekil kaynağı yönetir (örn. Cpu zamanı, ekran çıkışı)

Bununla birlikte, düzenli bir semafor, bir kaynağa erişen ve birkaç taneye bölünebilen ancak sınırlı olan (ör. Bellek, ağ bant genişliği) birkaç iş parçacığını yönetebilir.

Kısacası, bir döndürme kilidinin bir semaforu bir kaynak kullanıp kullanamayacağını sormaya devam etmesi muhtemeldir. (Çocuğu tuvaleti kullanmak zorunda olduğunu ve başka birinin bitirmesini beklediğini düşünün.)

Kaynaklar: Sistem Programlamaya Giriş, İşletim Sistemleri ve wikipedia

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.