2012-06-05 34 views
7

I madde 1.7.3 ile ilgilenen edilmiştir:C++ 11 bellek modeli bellek kopmasını ve çakışmalarını engelliyor mu? C++ 11 bir taslak okuma

bir bellek konumu skalar tip bir amacı ya da bitişik bit alanları tüm sahip sıfır olmayan genişlik maksimal dizisi, ya olduğu . ... İki iş parçacığı (1.10) birbiriyle etkileşime girmeden ayrı bellek konumlarını güncelleyebilir ve bunlara erişebilir. Bu fıkra gibi donanımla ilgili yarış koşullarından koruyor mu

:

  • hafıza iki otobüs işlemleri (bellek yırtılma) güncellenir unaligned veri erişim? Bir sistem bellek birimi içinde farklı nesnelerin olduğu, örn. 32 bitlik bir sözcükte iki 16 bit imzalı tam sayı ve ayrı nesnelerin her bağımsız güncelleştirmesi tüm bellek biriminin yazılmasını gerektirir (bellek çakışması)?
+0

olası yinelenen içerir [Bellek modeli siparişi ve görünürlük?] (http://stackoverflow.com/questions/7461484/memory-model-ordering- ve-görünürlük) –

+0

@HansPassant:. benim hızlı okuma gelen bu soru parçacıkları arasında paylaşılan bir nesnenin görünürlüğünü daha fazla ilgilidir görünüyor i güncelleyerek farklı nesnelerin neden bellek çakışmaları hakkında burada soruyorum – TheJuice

cevap

5

ikinci nokta ile ilgili olarak, hiçbir ırk olacağı standart garanti. Bu garantinin mevcut derleyicilerde uygulanmadığı söylendi ve bazı mimarilerde uygulanması imkansız bile olabilirdi. İkinci nokta garanti eğer program herhangi yarış durumu içermiyorsa birinci nokta ile ilgili olarak

, ve daha sonra doğal sonucu bu ya bir yarış durumu olmayacak olmasıdır. Yani birden çok iş parçacığı (aynı değişkeni erişmek eğer farklı alt sözcük yerlere yazar standart garanti güvende olduğunu, o zaman bir yarış durumu olabilir tek durum bu kelimenin üzerinde bölünmüş, ya da daha edilir öncül göz önüne alındığında, bir Muhtemelen bunun için sorunlu, önbellek hatları arasında).

Yine bu sert ya uygulamak hatta imkansız olabilir. Eğer hizasız referans noktanız bir önbellek çizgisine denk geliyorsa, o zaman kodun doğruluğunu garantilemek için büyük bir maliyet getirmeden neredeyse imkansız olacaktır. Bu ve diğer nedenler için (örneğin, ham performans, iki önbellek çizgisine dokunan bir nesneye yazma, belleğe 32 bayt yazmayı içeren bir nesneye yazma) ve diğer herhangi bir iş parçacığına dokunmaktan kaçınmanız gerekir. önbellek hatları, aynı zamanda önbelleklerini senkronizasyonu maliyetini ve ...

1

İki ipler (ama fıkra yalnızca ayrı bellek konumları için geçerlidir) aynı bellek yerine, yalnızca görünür bellek yırtılma karşı koruma sağlamaz.

sizin örneğe göre, bellek çatışma karşı korumak için görünür. Bunu başarmanın en olası yolu, bir kerede 32 bitten daha az yazamayan bir sistemde 32 bit char olur ve sonra iki ayrı nesne bir "sistem bellek birimi" ni hiçbir zaman paylaşamazdı. (Tek yolu, iki 16-bit tamsayı char bitfields olarak 32 bit olan bir sistemde bitişik olabilir.)

+0

konu için biraz daha karmaşıktır Multithreading, sadece 8/32 bayt değil L1 önbellekten yazılanlar, önbellek büyüklüğünde tanecikli olarak yapılır.Geçerli derleyiciler genellikle bir blokta X'den (16 bayt burada intel için ortak bir sayıdır) bayttan daha az yazamazlar. Öte yandan, işlemciler, bunun bir sorun olmadığını garanti etmek (veya denemek) için, örneğin önbellek çizgisini kirli olarak işaretlemek ve diğer işlemcileri ona yazmadan önce veya daha karmaşık eşitleme algoritmalarında yeniden yüklemeye zorlamak için garanti etmek için kullanırlar. –

+2

@dribeas: ISA seviyesinde daha küçük bölgeler güncellenebilir. İşlemcinin bir veri yolu kilidi alması veya bunu başarmak için önbellek tutarlılık algoritmaları kullanması bir uygulama detayıdır. Önemli olan, ISA'nın bir yazılım muteksinin maliyeti olmaksızın daha küçük bölgelerin atomik güncellemesi için ilkelleri sağlamasıdır. –

+0

Evet ... ve hayır. Hizalanmamış erişim sorunu, işlemciden önbelleğe yazmanın boyutundan değil, ancak yazının aslında bir önbellek sınırını geçebileceği gerçeğidir. Tek bir önbellek çizgisine yazılırken önbellek tutarlılık algoritması tarafından işlenirken, bu algoritmaların yazma işleminin farklı önbellek çizgilerinin atomikliğini simüle edebildiğinden emin değilim (yani donanımın önbellek çizgilerini kilitlemesi, yazması ve bırakması gerekir. çizgilerin kirlendiği gibi çizgiler ... ya da algoritma ne olursa olsun * her iki * çizgisi de aynı anda * –