Kilitsiz koleksiyonların sınırları?


10

David Rodríguez - dribeas , StackOverflow'a yaptığı açıklamada, "Tüm koleksiyonlar kilitsiz uygulanamaz" yazdı . Bunun doğru olup olmadığından emin değilim ve her iki şekilde de kanıt bulamıyorum.

Bu ifade çok kesin değil, ama biraz daha resmi bir şekilde yeniden ifade etmeye çalışmama izin verin: Her koleksiyon türü için C, aynı işlem kümesini sunan ve LF üzerindeki her işlemin bulunduğu kilitsiz bir koleksiyon türü CLF vardır. ilgili işlemle aynı big-O karmaşıklığına sahiptir .CC

Bu arada bir dönüşüm beklemiyorum.


1
Uzman olmayan biri olarak, "kilitsiz" in titizlikle tanımlanıp tanımlanamayacağını merak ediyorum.
Tsuyoshi Ito

1
@Suresh: Belki de “veri yapısı” ile eşanlamlıdır?
Tsuyoshi Ito

2
Ya sadece kilitsiz bir STM (yazılım işlem belleği) uygulaması alıp üzerine veri yapıları uygularsanız?
Jukka Suomela

5
@Tsuyoshi: Sanırım kilitsizin resmi bir tanımı yok. Gayri resmi olarak, CPU'nun KİLİTLEME talimatını kullanmadığınız anlamına gelir, bu da yavaştır ve daha hızlı karşılaştır ve değiştir'e bağlı kalır. Bir LOCK karşılaştırma ve takas ile simüle edilebildiğinden, "bir kilidi simüle etmek için buradaki karşılaştırma ve takas etme işlevini kullanın" ve "oh, bu bir karşılaştırma ve takas işleminin gerçekten akıllıca kullanımı ve bildiğimiz daha üst düzey bir işlemi simüle etmiş gibi görünmüyor. "
Radu Grigore

1
Anladığım kadarıyla, lock-free burada engellemeyen ile eşanlamlı olarak anlaşılıyor. Bu CPU'nun LOCKtalimatını değil, muteksler / semaforlar / vb. Yoluyla iş parçacığı zamanlayıcısını içerir.
MSalters

Yanıtlar:


11

Kendim biraz karıştığım için, sorudaki birkaç kavramı açıklığa kavuşturuyorum.

Koleksiyonu . Genel olarak veri yapıları için ne olduğunu sorabildiğimizde, "koleksiyon" un ne anlama geldiğini tanımlamak için zaman harcamak için hiçbir neden göremiyorum. Bir veri yapısı bir bellek alanını kaplar ve bu belleğe erişebilen ve kullanıcılar tarafından çağrılabilecek bazı işlemleri vardır . Bu kullanıcılar farklı işlemciler veya sadece farklı iş parçacıkları olabilir, bizi ilgilendirmez. Önemli olan tek şey işlemleri paralel olarak yürütebilmeleridir.

Kilitsiz . Herlihy ve Boss , kilitlenen bir kullanıcı veri yapısının daha fazla kullanılmasını engellemediğinde bir veri yapısının kilitsiz olduğunu söyler. Örneğin, sıralı bir kümeye bir düğüm eklemenin ortasında bulunan bir işlemciye su döktüğünü düşünün. Diğer işlemciler daha sonra bu sıralı kümeye eklemeyi denerse başarılı olurlar. ( Düzenleme: Bu tanımlamaya göre, bir veri yapısı kullanır kilitler o zaman kilit serbest değilse bu durumda, ama öyle değil , bir veri yapısı kilitlerini kullanmıyorsa o zaman kilidi serbest olduğunu olgusu.)

Bu tanım ile, Herlihy ve Boss'un temelde cevabın kritik bölgeleri işlemlere dönüştürmek olduğunu söylüyorum.

Ancak, bunun aynı karmaşıklığa sahip olduğunu sorabilirsiniz. Sorunun mantıklı olduğundan emin değilim. Düşünün push(x) { lock(); stack[size++] = x; unlock(); }. Bu sabit bir zaman operasyonu mu? Kilitleme işlemini ve dolayısıyla diğer kullanıcıları yoksayarsanız, YES (Evet) yanıtı verebilirsiniz. Eğer diğer kullanıcıları göz ardı etmek istemiyorsanız, o zaman orada gerçekten olup olmadığını söylemek için bir yol yoktur itme sabit zamanda çalışacaktır. Eğer bir düzey yukarı gidip yığını bazı belirli algoritma ile nasıl kullanıldığını görürseniz, o zaman söylemek mümkün olabilir itme her zaman (sizin paralel algoritmanın girdi ne olursa olsun, anlamında artık ölçülen) sabit zaman alacaktır. O söylemek mantıklı değil Fakat bunu gerçekten senin algoritmasının bir özelliktir itme olan sabit zaman çalışma.

Özetle, bir işlemi yürüten bir kullanıcının diğer kullanıcılar için ne kadar beklediğini görmezden gelirseniz, kritik bölgeler yerine işlemleri kullanmak sorunuzu olumlu yanıtlar. Bekleme süresini yoksayarsanız, veri yapısının nasıl kullanıldığına bakmanız gerekir.


pushYukarıda belirtilen işlemin sabit bir zaman işlemi olmadığını gerçekten düşünüp düşünemeyeceğinizden emin değilim . Sabit sayıda işlemci ve lockaçlığı garanti etmeyen ortak bir uygulama için , yukarıdaki işlem (en kötü durumda, herhangi bir işlemci için N_proc * O (1) alır ve bu, O (1) olarak kabul edilebilir. gizli sabitin içine çarpan işlemci sayısı)
David Rodríguez - dribeas

nf(n)f

Hafıza erişimi bunun yaygın bir örneğidir. Çoğu algoritma analizi, bellek erişiminin kullanılan bellekten bağımsız O (1) olduğunu varsayar; gerçek bellek mimarileri (önbellekler vb. ile), N'nin kullanılan bellek olduğu O (log N) ile yaklaşık olarak daha iyidir.
MSalters

İşlemci sayısının sabit olduğu varsayımı oldukça pratik olsa da, bundan kaçınacağım. O zaman sorun, karmaşıklığın tek boyutlu bir şekilde analiz edilemeyeceğidir, çünkü sorunun boyutu hem girdinin boyutunda hem de her ikisi de dikey boyutlarda olan işlemci sayısında büyümeye bağlıdır. C ++ standart kitaplığında belirli bir kapsayıcı varsayarsak (açıkçası zor bir tane seçiyorum) gereksinimlerden biri, tüm öğelerin bitişik bir bellek bloğunda tutulmasıdır.
David Rodríguez - dribeas

Şimdi, vektöre bir eleman eklemek, itfa edilmiş sabit bir zaman işlemidir (önceden tahsis edilmiş bloğa sığmazsa, çağrı kaptaki elemanların sayısı üzerinde doğrusal bir zaman alacaktır, ancak ayrılmış bellek bloğu üstel bir sıralamanın ardından elde edilen itfa edilmiş maliyet sabittir). İplik emniyetli bir konteyner uygularsanız, değişikliği kilitler ve daha sonra gerçekleştirirsiniz, işlemin maliyeti, gerçekten bilmediğim kilitleme maliyetiyle orantılıdır ... ancak ilk yaklaşımda çoğunlukla sabiti
David Rodríguez - dribeas

3

"KOLEKSİYONLAR" ın "kuyruklar, yığınlar, bağlantılı listeler, ağaçlar," anlamına geldiğini düşünüyorum.

Gönderen http://www.cl.cam.ac.uk/research/srg/netos/lock-free/

Dikkatli tasarım ve uygulama sayesinde, kilitleri yönetmeye veya iş parçacıklarını engellemeye gerek kalmadan aynı anda kullanım için güvenli olan veri yapıları oluşturmak mümkündür. Bu engellemeyen veri yapıları, ekstra eşzamanlılığa izin vererek performansı artırabilir ve yerel ayarlarda öncelikli ters çevirme veya dağıtılmış sistemlerde makine ve bağlantı arızalarından kaynaklanan bazı sorunlardan kaçınarak sağlamlığı artırabilir.

Engellemeyen algoritmalarımıza en iyi genel giriş, şu anda sunulmakta olan kilitsiz Eşzamanlı programlama, çok kelimeli karşılaştırma ve değiştirme, kelime tabanlı yazılım işlem belleği ve nesne tabanlı yazılım işlem belleği tasarımlarımızı kapsar.

Eğer "kilitsiz" demek "işletim sisteminin semaforlarını, muteksini, monitörlerini ..." kullanmazsa " Bence (ama bir uzman değilim) her koleksiyonun atomik okuma-yazma- kullanılarak kilitsiz yapılabileceğini düşünüyorum donanım tarafından desteklenmesi gereken ilkeleri değiştirin.

Ö()

Konuyla ilgili kapsamlı belgeler çevrimiçi olarak bulunabilir:

http://www.google.it/search?q=lock+free+algorithm+filetype%3Apdf

(... ve her bir belgenin sonundaki diğer referanslar)

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.