2012-08-02 20 views
16

Mutekslerin arkasındaki fikir, bir kerede bir bellek bölümüne bir iş parçacığının erişmesine izin vermektir. Bir iplik muteksini kilitlerse, ilk kilitlenene kadar diğer kilit girişimleri bloke edilir. Ancak, bu nasıl uygulanır? Kendini kilitlemek için, muteks, kilitlendiğini söyleyen bir yer belirlemelidir. Ama ya ikinci muteks aynı zamanda okuyorsa, ilk yazıyordur. Daha kötüsü, ya ikisi de aynı zamanda muteksini kilitlerlerse? Muteks, önlenmesi amaçlanan aynı soruna boyun eğecekti.Muteks gerçekten nasıl çalışır?

Muteks gerçekten nasıl çalışır?

cevap

10

Düşük düzeyli atomik işlemler. Bunlar aslında donanımda uygulanan mutekslerdir, sadece atomik olarak çok az işlem gerçekleştirebilirsiniz.

aşağıdaki eşdeğer pseudocode göz önünde bulundurun:

mutex global_mutex; 
void InterlockedAdd(int& dest, int value) { 
    scoped_lock lock(mutex); 
    dest += value; 
} 
int InterlockedRead(int& src) { 
    scoped_lock lock(mutex); 
    return src; 
} 
void InterlockedWrite(int& dest, int value) { 
    scoped_lock lock(mutex); 
    dest = value; 
} 

Bu işlevler CPU tarafından talimat olarak uygulanır, ve çeşitli derecelerde parçacıkları arasında tutarlılığı sağlamak. Kesin anlambilim söz konusu CPU'ya bağlıdır. x86 sıralı tutarlılık sunar. Bu, işlemlerin sırayla, bir sırada düzenlenmiş gibi davranması anlamına gelir. Bu açıkça, biraz engellemeyi içerir.

Atomik işlemlerin muteks cinsinden uygulanabileceğini kesin olarak doğrulayabilirsiniz veya tam tersi. Ancak genellikle, atomik ops donanım tarafından sağlanır ve daha sonra işletim sistemi tarafından üstüne uygulanan muteksler ve diğer senkronizasyon primitifleri. Bunun nedeni, tam bir muteks gerektirmeyen bazı algoritmaların bulunması ve "kilitsiz" olarak bilinen şeyin çalışabilmesidir, bu da sadece birkaç iplik arası tutarlılık için atomik işlemlerin kullanılması anlamına gelir.

9

Geçmişte kullanılan basit bir uygulama, CPU seviyesi atomik "kilitleme ve değiştirme" komutunu kullanmaktır. Bu, belirli bir değeri bazı bellek konumlarında bir değerle atomik olarak değiştiren özel bir talimattır. Bir iş parçacığı, bir 1 değeri bellek konumuna takmaya çalışarak böyle bir muteks elde edebilirdi. Değer 0 olarak geri dönerse, iş parçacığı muteks olduğunu varsayar ve devam ederdi. Aksi takdirde, döndürülen değer 1 ise, iş parçacığı, şu anda diğer iş parçacığının mutex'e sahip olduğunu bilir. Bu durumda tekrar denemeye kadar beklerdi. Yukarıdaki basit bir sistemde neler olabileceğinin oldukça basitleştirilmiş bir taslağıdır. Gerçek işletim sistemleri bugünlerde çok daha karmaşık.

+0

Bu soruya cevap vermiyor. İki iş parçacığı aynı anda "okuyup takas" yaparsa ne olur? Sonra her ikisi de 0'a geri dönüyor. – user1146657

+1

@ user1146657: "Kilitle ve değiştir" işleminin amacı, * atomik * olması ve CPU'ların (CPU'ların) herhangi bir zamanda yalnızca bir iş parçacığının bunu yapabilmelerini sağlamasıdır. Yani tanım gereği, iki iş parçacığı * aynı anda yapamaz. CPU, tam olarak bu amaçla çalışmak için özel olarak tasarlanmıştır. –

1

İhtiyacınız olan tek şey atomik olarak yapmak. Atomik karşılaştırma ve değiştirme yönergeleri gibi donanımlar veya sistem çağrıları aracılığıyla işletim sistemi tarafından sağlanabilir. OS etki alanındayken, yalnızca tek bir iş parçacığının mutex'i kilitlemeye çalıştığından emin olmak oldukça kolaydır. Pratikte her iki yaklaşım bir araya getirilmiştir. Örneğin Linux'un futexleri.

2

İşte muteks çalışması gerekenlerin hızlı bir genel bakış, kilitli durumunu temsil bellekte bir tamsayı değeri 1 ya da 0 ile yoktur benim tam makalede How does a mutex work?

  • kısaltılmış hali.
  • Muteks, atomik olarak bu değeri değiştirmeye ve başarılı olup olmadığını bildirmeye yarayan bir compare_and_swap atomik işlevine gereksinim duyar. Bu, bir iş parçacığının aynı anda durumu denetlemesine ve değiştirmesine olanak tanır.
  • İşletim sisteminin, muteks kilitli olması durumunda beklemek için bir işlev sağlaması gerekir. Linux'ta düşük seviyeli fonksiyon futex'dur. Bu iş parçacığı bir sıraya yerleştirir ve ayrıca bellekte tamsayıyı izler.
  • İlgili işlemler, bellekteki değişikliklerin kilitlenmeden önce görülmesini ve kilitlendikten sonra tamamen kullanılabilir olmasını önlemek için veri çitlerini de içerir.
İlgili konular