SORU
27 Mart 2010, CUMARTESİ


Kilidi serbest Çoklu-işlem gerçek bir iş parçacığı için uzmanlar

Jon Skeet bir soruya verdiği answer ve bu bahsetti: bir kitap okuyordum

İlgilendiğim kadarıyla, kilidi serbest çoklu iş parçacığı olan biri değilim gerçek bir iş parçacığı uzmanlar için.

Onun değil ilk kez duyuyorum bunu, ama bu benim için çok az insan bahsediyorsun sen de yap eğer ilgileniyorsanız öğrenme yazmayı kilidi serbest Çoklu-işlem kodu.

Yani benim soru parçacığı hakkında olabildiğince, özellikle kilit-ücretsiz çoklu iş parçacığı kod yazmayı öğrenmeye başlar ve bazı iyi kaynaklar nelerdir vb öğrenmenin dışında.

Şerefe

CEVAP
27 Mart 2010, CUMARTESİ


Geçerli "kilit-ücretsiz" uygulamaları aynı desen çoğu zaman izleyin:

  • bazı devlet okumak ve bir kopyasını yapmak*
  • kopyala değiştir*
  • kilitli bir çalışma yapın
  • eğer başarısız olursa yeniden deneyin

(*isteğe bağlı: veri yapısı algoritma/) bağlıdır

Son biraz ürkütücü bir sayaç kilidi için benzer. Aslında, spinlock bir temel. :)
@Bu nobugz katılıyorum: kilitli işlem kilidi serbest Çoklu-işlem dominated by the cache and memory-coherency tasks it must carry out. kullanılan maliyet

Ne ancak "ücretsiz kilitle", "kilit" çok ince taneli . bir veri yapısı kazanmak. Bu iki eşzamanlı iş parçacığı aynı erişim şansı azalır "" (memory location). kilit

Çoğu zaman tedavi yerine özel kilitler - kalmamasıdır hile bir dizideki tüm öğeleri veya bir bağlantılı liste tüm düğümler örneğin "spin-lock". Okuma ve son okuma beri güncelleme olsaydı orada hiçbir güncellemeyi deneyin değiştirin. Eğer olsaydı, seni yeniden deneyin.
Bu senin yapar "" (pardon, olmayan-kilitleme :) çok ince taneli, ek bellek veya kaynak gereksinimleri tanıtan olmadan. kilitleme
Daha ince taneli bekler yapma olasılığı azalır. Mümkün olduğunca ayrıntılı olarak ek kaynak ihtiyaçları tanıtımı yapmadan kulağa hoş geliyor, değil mi?

Eğlencenin en ancak ensuring correct load/store ordering gelebilir.
Bir sezgi aksine, İşlemci/bellek / yazar okur yeniden düzenlemek için ücretsiz - çok akıllı, bu arada onlar: sabit bir zaman tek bir iş parçacığı bu gözlem olacak. Ancak çoklu iş parçacığı birden fazla çekirdek üzerinde yapmaya başladığınızda sorunları içine çalışacaktır. Sezgilerinizi yıkmak: bir yönerge kodunuzu daha önce sırf bunun için daha çok erken olacak anlamına gelmez. CPU arızalı talimatları işleyebilir ve özellikle bellek erişir talimatlar için şu ana bellek gecikme gizlemek ve onların önbellek daha iyi kullanmak için yapmak gibi.

Şimdi, dikkat sezgi karşı bir dizi kod değil akış "yukarıdan aşağıya", yerine çalışır gibi ortada sırası hiç - ve çağrılabilir "şeytanın Bahçesi". Yeniden sıralama gerçekleşecek ne gibi kesin bir cevap vermek olanaksız olduğuna inanıyorum. Bunun yerine, her zaman açısından konuşuyormaysvemightsvekutularve en kötüsü için hazırlayın. "Oh, CPUolabilirbu yaz önce yeniden okudum, çok iyi bir hafıza bariyer sağ burada, bu nokta koymak için."

Konularda bile bu gerçeği ile karmaşıkmaysvemightsİŞLEMCİ mimarisi farklılık gösterebilir.olabilirbir şey olan bu durum, örneğingarantili olmasını değilbir mimariolabilirbaşka bir.


Almak için "kilit-ücretsiz" Çoklu-işlem değil, anlamalısın bellek modelleri.
Bellek modeli ve garanti doğru gittikçe önemsiz this story, whereby Intel and AMD made some corrections to the documentation of MFENCE causing some stir-up among JVM developers gösterildiği gibi değildir. Olarak çıktı, geliştiriciler baştan dayandığı belgelere ilk etapta bu kadar hassas değildi.

Kilitler .NET sonuç bir örtük bellek bariyer, güvenli kullanarak onları (çoğu zaman... örneğin bakınız bu Joe Duffy - Brad Abrams - Vance Morrison greatness geç başlatma, kilit, uçucular ve hafıza engeller. :) (Bu sayfadaki bağlantıları takip edin.)

Ek bir avantaj olarak, 8**. :)

Ayrıca bir" Vance Morrison: What Every Dev Must Know About Multithreaded Apps. "ihtiyar ama goldie var

...ve tabii ki, @Eric sözü Joe Duffy konu ile ilgili kesin bir bilgi edinin.

İyi bir STM ayrıntılı olarak alır kilitleme yakın olabilir ve muhtemelen yakın el yapımı bir uygulama ile ya da vasatın altında bir performans sağlayacaktır. Bunlardan biri BAYAN DevLabs projects STM.NET

Değil .NET-sadece bağnaz, Doug Lea did some great work in JSR-166.
Cliff Click Java olarak lock-çizgi - dayanmaz .hash tabloları çok değişik bir bakış açısı var NET eşzamanlı hash tabloları ve 750 için iyi CPU ölçek gibi görünüyor.

Eğer Linux topraklarına girişim için korkuyorsanız, aşağıdaki makale daha iyi bir kavrayış sağlar geçerli bellek mimarileri iç içine ve nasıl önbellek satırı paylaşımı performans yok: What every programmer should know about memory.

@Ben MPI hakkında birçok Yorum Yaptı: tüm samimiyetimle MPI bazı alanlarda Parlatıcı kabul edersiniz. MPI dayalı bir çözüm konusunda neden daha kolay, uygulamak için daha kolay ve daha az hata eğilimli akıllı olmaya çalışan o yarı pişmiş bir kilitleme uygulaması daha iyi olabilir. (Ancak - öznel olarak - ayrıca STM dayalı bir çözüm için doğrudur.) Ayrıca ışık yılı daha doğru düzgün yazmayı olduğuna bahse girerimdağıtılmışörneğin uygulama çok başarılı örneklerini verdiğimiz gibi Ayrık,.

MPI, ancak bir yeniden çalıştırdığınızda, kendi maliyetleri ve kendi derdine düştüçoklu çekirdek sistem tek. E. g. eğer x, synchronization of process scheduling and message queues etrafında çözülmesi gereken sorunlar vardır.
Ayrıca, kendi özünde, MPI sistemler genellikle kooperatif bir tür uygulamak N:M scheduling "hafif işler". Bu örneğin hafif işler arasında kaçınılmaz bir bağıntı anahtarı var demektir. Bu doğru değildir bir "klasik içerik anahtarı" ama daha çok bir kullanım alanı çalışma ve yapılabilir hızlı ancak hiç sanmıyorum olabilir getirdi altında 20-200 cycles an interlocked operation takes. Kullanıcı modu bağlam anahtarlama certainly slower bile Intel McRT kütüphanede. N:hafif ile M planlama süreçleri yeni bir şey değil. LWPs orada uzun süre Solaris vardı. Terk edilmişler. NT lifleri vardı. Çoğunlukla bir kalıntı artık. "Sizi uyarıyorum. aktivasyonu edildi Terk edilmişler. Linux N konuyla ilgili kendi düşünüyordum:M parçacığı. Şimdi biraz ölü gibi görünüyor.
Örneğin McRT from Intel veya en son User-Mode Scheduling Microsoft ConCRT ile birlikte. zaman zaman yeni yarışmacının vardır:
En düşük düzeyde, onlar ne N:M MPI zamanlayıcı yok. Eğer X - ya da herhangi bir MPI sistemi, büyük ölçüde istismar ederek SMU sistemleri yararı olabilir yeni UMS.

Sanırım OP soruya değil faziletlerine ve öznel değişkenler için/karşı herhangi bir çözüm, ama olsaydı cevap bu, sanırım yapısına bağlı görev: yapı düşük seviye, yüksek performans temel veri yapısı üzerinde çalışan birtek sistemileçok çekirdeğiya da düşük-kilit/"kilit-ücretsiz" teknik ya da bir STM getirebilecek en iyi sonuçlar açısından performans ve muhtemelen yendi MPI çözüm her zaman performans açısından bile yukarıdaki kırışıklık çözdüklerini örneğin Ayrık.
Tek bir sistem üzerinde çalışan herhangi bir şeyi orta derecede daha karmaşık bir yapı için, belki de iri taneli kilitleme ya da eğer klasik performans büyük bir endişe, bir STM olduğunu seçerdim.
Dağıtılmış bir sistem inşası için, MPI sistemi muhtemelen doğal bir seçim olacaktır.
.NET as well MPI implementations olarak aktif gibi görünüyor olsa da) olduğunu unutmayın.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Hallucination Land

    Hallucinatio

    14 Ocak 2011
  • Kenneth Håkonsen

    Kenneth Håk

    13 Mart 2011
  • RomanAtwood

    RomanAtwood

    18 Kasım 2009