Kilit kullanırsam algoritmam hala kilitsiz olabilir mi?


10

Lock-free'in ortak bir tanımı, en az bir sürecin ilerleme kaydetmesidir. 1

Bir kilitle korunan kuyruk gibi basit bir veri yapım varsa, bir işlem her zaman ilerleme kaydedebilir, çünkü bir işlem kilidi alabilir, istediklerini yapabilir ve serbest bırakabilir.

Peki kilitsiz tanımını karşılıyor mu?


1 Bkz. Örneğin M. Herlihy, V. Luchangco ve M. Moir. Engelsiz senkronizasyon: Örnek olarak çift uçlu kuyruklar. Distributed Computing, 2003. "Yalnızca bir iş parçacığının her zaman ilerleme kaydetmesini sağlıyorsa kilitsizdir".


3
Ben her zaman "kilit özgür" bir veri yapısı ve kilitler, sadece küçük bir tanımlı atomik bellek işlemleri kümesi algoritmalar kümesi tanımlamak için anladım. Örneğin, drdobbs.com/parallel/writing-lock-free-code-a-corrected-queue/…
Paul Johnson

Yanıtlar:


16

Bu kilitsiz için bir tanım değil.

İlerlemeyi garanti edebiliyorsanız, kilitlenmeden arındırılmış olursunuz ve her bir talebin sonunda tamamlanması durumunda, açlıktan kurtulursunuz , ancak kilitsiz değilsiniz.

Basit örneğinizin bunu gerçekten sağlayıp sağlamadığını soruyorum. Birden fazla kilit söz konusu olduğunda aslında ilerleme garantisi sağlamak için kilit hiyerarşilerine vb.


1
M. Herlihy'nin tanımını kullanıyorum. Yüksek eşzamanlı veri nesnelerinin uygulanması için bir metodoloji. Programlama Dilleri ve Sistemleri İşlemleri, 1993. "Kilitsiz koşul, bazı süreçlerin keyfi durdurma başarısızlıklarına veya diğer süreçlerin gecikmesine rağmen her zaman ilerleme kaydedilmesini garanti eder"
Joe Pension

12
@Joe: Bu bir tanım değil, bir anlamı anlatıyor. Tersinin mantık yanlışlığına dikkat edin.
Ben Voigt

2
Ayrıca M. Herlihy, V. Luchangco ve M. Moir'den alıntı yapabilir. Engelsiz senkronizasyon: Örnek olarak çift uçlu kuyruklar. Distributed Computing, 2003. "Yalnızca bir iş parçacığının her zaman ilerleme kaydetmesini sağlıyorsa kilitsizdir".
Joe Pension

1
Ayrıca, açlıktan arındırılmış olandan daha özel olan açlık yoktur (her işlem diğer işlemlerin ne yaparsa yapsın) - CaS döngülerinin (atomik ilkellere dayalı olarak) olmadığını unutmayın
mandal ucube

5
@Joe: Eğer dünyanın geri kalanı bu mülkü kilitlenmemiş olarak adlandırıyorsa , o zaman bu terimi kullanacağım. Hayır, basit örneğiniz kilitlenmemiş değildir. Bir şeyin kilitlenmeden arındırılmasını garanti etmek için, sadece senkronizasyona değil, kilidi tutarken hiçbir ipliğin herhangi bir engelleme işlemi gerçekleştirmediğine dair bir garantiye ihtiyacınız vardır. “ne isterse onu yap” oldukça belirsizdir ve bu garantiyi sağlamaz görünmektedir.
Ben Voigt

11

Çok İşlemcili Programlama Sanatı 1'i okudum ve metinleri de tıpkı bahsettiğiniz kitap gibi net değil. İşte TAMPP'den bazı alıntılar:

Alıntı 1 (kilitsiz tanımı)

Bir yöntem sonsuz sayıda adımın sonsuz sayıda adımda bitmesini garanti ederse kilitlemesizdir.

Alıntı 2 (engellemenin tanımı)

beklemede olan başka bir çağrının tamamlanmasını beklemek için hiçbir zaman toplam bir yöntemin beklemede tutulması gerekmez.

3. Alıntı (kilitlenmenin engelleme olmadığını iddia edin)

Beklemesiz ve kilitsiz tıkanmasız ilerleme koşulları, bir bütün olarak hesaplamanın, sistemin iş parçacıklarını nasıl zamanladığından bağımsız olarak ilerleme kaydetmesini garanti eder.

Sorun, Alıntı 3'teki iddianın Alıntı 1'deki tanımdan açıkça takip etmemesidir. Daha önce de belirtildiği gibi, senkronize edilmiş bir kuyruk Alıntı 1'i tatmin ediyor gibi görünüyor: Sonsuz sıklıkla bazı yöntemlerin kilidi başarıyla kazanması ve tamamlanması.

Alıntı 3'teki oldukça belirsiz ifadeye özellikle dikkat edin: "sistemin konuları nasıl planladığından bağımsız olarak". Bunun öncesinde "iş parçacığı çizelgeleme sistemi" nin herhangi bir resmi açıklaması yoktur, bu nedenle tanımların ne anlama geldiği konusundaki önyargılarımıza dayanarak özelliklerini yeniden yapılandırmaya bırakıldık :

  1. sistem her zaman bir iş parçacığının talimatlarını yürütür ;
  2. hiçbir zaman belirli bir iş parçacığının talimatlarını yürütemez ;
  3. tüm iş parçacıkları dikkate alınan yöntemi çağırıyor.

Böyle bir sistemde, bir engelleme yöntemi kilitlenemez: kilidi tutan iş parçacığı bir kez daha yürütmek üzere zamanlanmazsa, yöntem çağrısını sonlu adımlarla tamamlayabilecek başka bir iş parçacığı olmayacaktır, ancak yöntemin adımlarını yürüten bazı iş parçacıkları. Sonunda her iş parçacığına CPU zamanı vermeyi garanti eden daha gerçekçi bir sistem için, tanım açıkça engelleme yapma özelliğini içermelidir:

Kilitlenmemiş tanımı düzeltildi

Bir yöntem, engelleme yapmıyorsa kilitsizdir ve ek olarak, bazı yöntem çağrılarının sınırsız sayıda sonlu adımda tamamlandığını garanti eder.

1 Maurice Herlihy, Nir Shavit, Çok İşlemcili Programlama Sanatı, Elsevier 2008, s.58-60


1
Alıntı 1 ifadeleri gerçekten garip. "Sonsuz sıklıkta" ile ne anlama geliyorlar? Açıkçası "her zaman" dan farklı bir şey, bu yüzden yöntemin asla "bazı" durumlarda dönmüyor tamam mı?
Hulk

Evet, kesin olmayan bir dil var. Zaten "sık sık" nedir? Bence "sonsuz bir icra tarihinde, bu özel olay sonsuza kadar birçok kez gerçekleşir" anlamına gelir.
Marko Topolnik

5

Terminoloji her zaman tutarlı değildir, ancak önemli olan önerilen bir algoritma veya sistem hakkında aşağıdaki soruları sormaktır:

  1. Tüm iş parçacıklarının kullanabileceği tüm CPU sürelerine izin verilse bile, iş parçacıklarının birbirini beklemesine neden olabilecek herhangi bir olay dizisi var mı?
  2. Bir iş parçacığı keyfi olarak uzun bir süre engellenmişse, diğer iş parçacıklarını durdurabilir veya keyfi olarak uzun bir süre sistem çalışmasını bozabilir [öyleyse, engellemez].
  3. Kimse ilerleme kaydetmeden, birbirlerinin çalışmalarını geçersiz kılarken, tüm iş parçacıklarının aynı işlemleri tekrar tekrar denemesine neden olabilen en azından teorik olarak mümkün olan bazı iplik zamanlaması kombinasyonu var mı?
  4. Bazı iş parçacıklarına bir diğerine göre yeterli CPU zamanı verilirse, ikinci iş parçacığının işlemlerini süresiz olarak yeniden denemeye devam etmeleri için zorlayabilirler.

Kilitsiz algoritmaların öneminin büyük bir kısmı, kilitsiz algoritmalardan daha hızlı olmaları değil, daha çok bir iş parçacığı yön değiştirirse ölmeye eğilimli olmamalarıdır [böyle bir garantinin yalnızca gerektirdiğini unutmayın algoritmaların bloke olmayışı, ancak tüm kilitsiz algoritmalar]. Kilidi olmayan bir algoritmanın kilitleri kullanması mümkündür, ancak yalnızca kilit alma girişimleri, birisinin ilerleme kaydetmesini her zaman mümkün kılacak algoritmalar ile birlikte zaman aşımları içeriyorsa (örneğin, bir algoritma bir CompareExchangedöngüyü birincil olarak kullanabilir) tahkim yöntemi, ancak çekişme yüksek göründüğünde erişimi tahkim etmek için kilitleri kullanın; bir kilit aşırı uzun süre basılı tutulursa, diğer iş parçacıkları bu kilidi kullanma çabalarından vazgeçmeye ve bunun yerine yeni bir tane oluşturmaya karar verebilir.CompareExchange, müşterilerin kilidi terk etmeleri sistem tutarlılığını tehlikeye atmaz, ancak eski kilidi tutan kodun eski kilidi terk edip yenisi ile aynı hizaya gelene kadar herhangi bir iş yapılmayacağı anlamına gelebilir.


Bu standart terminolojiden farklıdır: 2. değeriniz engellemenin standart anlamını belirtirken 3. kilit özgürlüğünü ifade eder.
Marko Topolnik

Tutarsız terminoloji kullanımları gördüm ve "resmi" bir standart bilmiyorum. En önemlisi, bir algoritmanın sunabileceği farklı garantiler olması ve uygulama gereksinimlerini karşılamak için yeterli garantiler sunan bir algoritma kullanılması önemlidir. Birçok makale yukarıdaki garantilerin sadece bazılarını kapsamaktadır, ancak her birinin uygulama gereksinimlerini, gereksinimleri karşılayacak diğer garantilerden daha kolay karşılayabileceği durumlar vardır.
supercat

Çok İşlemcili Programlama Sanatı'nda sunulan terminolojinin "standart" olduğuna dair bir fikir birliği olduğunu düşünüyorum.
Marko Topolnik

@ MarkoTopolnik: Gönderiyi ona uyacak şekilde düzenleyeceğim. Yeni sürümü beğendiniz mi?
Supercat

Güzel, çok hoş.
Marko Topolnik

4

Bağlamda sunduğunuz "tanım" a bakmak zorundasınız :

Paylaşılan veri yapılarını uygulamanın geleneksel yolu, eşzamanlı işlemlerin birbirini engellememesini sağlamak için karşılıklı dışlama (kilitler) kullanmaktır. Kilitlemenin yazılım mühendisliği, hata toleransı ve ölçeklenebilirliği açısından bir takım dezavantajları vardır (bakınız [8]). Buna yanıt olarak, araştırmacılar karşılıklı dışlama kullanmayan çeşitli alternatif senkronizasyon tekniklerini araştırmışlardır . Her iş parçacığının diğer iş parçacıklarının keyfi gecikmesi (hatta arızası) karşısında ilerleme kaydetmeye devam etmesini sağlarsa bir senkronizasyon tekniği beklemez. Sadece bazı ipliklerin her zaman ilerleme kaydetmesini sağlarsa kilitsizdir.

Karşılıklı dışlama için kilitleri kullanıyorsunuz, bu yüzden bahsettikleri kilitsiz bir teknik değil.


2

Kilit kullanırsam algoritmam hala kilitsiz olabilir mi?

Olabilir, ancak algoritmaya bağlıdır.

Bir kilitle korunan kuyruk gibi basit bir veri yapım varsa, bir işlem her zaman ilerleme kaydedebilir, çünkü bir işlem kilidi alabilir, istediklerini yapabilir ve serbest bırakabilir.

Peki kilitsiz tanımını karşılıyor mu?

Kendi başına not .

Eğer "o ne isterse" adım başka kilit alınıyor içermez ve sonlu bir sürede tamamlanması için garanti edilir, sonra algoritmanın bu özel bölümü serbest kilitlenmeye edilecektir.

Bununla birlikte, bu önkoşullar karşılanmazsa, en azından kilitlenme potansiyeli vardır ...


Çok İşlemcili Programlama Sanatı'ndaki metnin biraz çalışılmasından sonra, mutekslerin tanım doğru bir şekilde yazıldığında kilitsiz tanımı kesinlikle geçersiz kıldığı sonucuna vardım. Bunu açıklığa kavuşturmak için bu sayfaya bir cevap ekledim.
Marko Topolnik

1

Aşağıdaki örnekte verdiğiniz örnek kilitsiz değildir.

Destek bir iş parçacığı kilidi alır ve işletim sistemi zamanlayıcı iş parçacığı sonsuz bir yalnız süre askıya aldı, o zaman tüm iş parçacığı ilerleme kaydedemez çünkü askıya alınmış iş parçacığı tarafından alınan kilidi elde edemez.

Genel olarak, kilitleri kullanan algoritmalar kilitsiz değildir.

Kilitlenme ve kilitsizliğin iki farklı kavram olduğunu unutmayın. kilitlenme olmadan kilitlenme olasılığı yoktur, ancak tüm sistemin ilerlemesini engelleyebilecek canlı kilit olabilir. Kilit özgürlüğü bundan daha güçlüdür, çünkü sistemdeki bazı ipliklerin her zaman sonlu adımlarla ilerleme kaydettiği anlamına gelir.


Wikipedia'da daha dikkatli bir tanıma bakın: "Program iş parçacıkları yeterince uzun çalıştırıldığında iş parçacıklarından en az birinin ilerleme kaydetmesini sağlıyorsa bir algoritma kilitlenmez." Bu, iplikleri durdurma durumunu hariç tutar. Ayrıca durma altındaki ilerleme, özgürlüğü kilitlemek değil, engel özgürlüğü ile kaplıdır .
Marko Topolnik

@MarkoTopolnik Yorumunuz hiç mantıklı değil. Kilit özgürlüğü engel özgürlüğünü kapsar. Kilitsiz olan her şey engelsiz olmalıdır. Ve verdiğiniz tanım, iş parçacığı durdurmayı hariç tutmaz.
Chaoran

Lütfen "mantıklı" olanı "doğru" olandan ayırmaya dikkat edin. Bir sonraki cevabımda görülebileceği gibi yorumum yanlış. Ancak Wikipedia tanımı da yanlış veya en azından belirsiz.
Marko Topolnik

@MarkoTopolnik Yorumunuzun doğru olmadığını kabul ettiğiniz için, diğer okuyucuların kafasını karıştırmamak için onu kaldırmalısınız. Vikipedi genellikle yanlış veya belirsizdir. "Kilit özgürlüğü" gibi ince tanımları cs.rochester.edu/~scott/papers/2006_PPoPP_synch_queues.pdf gibi akademik makalelerde bulmalısınız ( kilitsiz tanımı bölüm 2.1'de verilmiştir)
Chaoran

Evet, kilit özgürlüğü tanımının bir parçası olarak engellenmeyen özelliği dahil etmek bunu yapmanın bir yoludur. Bu, cevabımın daha önceki bir revizyonunda ifade edildi.
Marko Topolnik
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.