SORU
11 HAZİRAN 2011, CUMARTESİ


C 11 standart bellek modelini tanıttı. Bu ne anlama geliyor? Ve nasıl C programlama etkileyecek mi?

C 11 standart bellek modelini tanıttı, ama tam olarak ne anlama geliyor? Ve nasıl C programlama etkileyecek mi?

Herb Sutter here o, diyor

Bellek model bir C kodu anlamına gelir şimdi çağırmak için standart bir kütüphane bulunmaktadır derleyici yapan ne olursa olsun ve hangi platformda çalışıyor. Nasıl kontrol etmek için standart bir yol var farklı konuları konuşmak işlemci bellek.

"Ne zaman bölme bahsediyorsun [code] farklı çekirdekleri arasında bu standart, bahsediyoruz bellek modeli. Gidiyoruz bu bozmadan optimize aşağıdaki varsayımlar insanlar gidiyor kod yapmak için," Sutter " dedi.

Evet, ben eminimezberlemekbu ve benzeri paragraflar online olarak yaptım benim kendi bellek modeli doğduklarından beri :P) ve hatta post olarak cevap sorular sordu Diğerleri, ama dürüst olmak gerekirse, bilmiyorum tam olarak anlamak bu.

Yani, ne ben temelde bilmek ister, C programcıları geliştirmek için kullanılan bir çok iş parçacıklı uygulamaları daha önce, bu yüzden ne farkeder eğer onun POSIX evreleri, veya Windows iş parçacığı veya C 11 konuları? Avantajları nelerdir? Düşük seviyeli ayrıntıları anlamak istiyorum.

Ben de sık sık bu ikisini birlikte görmek gibi C 11 bellek modeli bir şekilde C 11 ilgili bu duygu Çoklu-işlem desteği alın. Eğer değilse, tam olarak nasıl? Neden ilgili?

Çoklu iç işleyişini, bellek modeli genel olarak ne anlama geldiğini bilmiyorum, lütfen bana bu kavramları anlamanıza yardımcı olur. :-)

CEVAP
12 HAZİRAN 2011, Pazar


İlk olarak, Dil bir Avukat gibi düşünmeyi öğrenmelisin.

C belirtimi, belirli bir derleyici, işletim sistemi için referans veya CPU yapmaz. Bir başvuru yaparsoyut makinegerçek sistemlerin bir genelleme. Dil Avukatı dünyada programcı iş soyut makine için kod yazmak için; derleyici bu işi somut bir makinede kod etmektir. Bugün ya da 50 yıl sonra spec katı kodlama, kod ve uyumlu C derleyicisi ile herhangi bir sistemde değişiklik yapmadan derlemek çalışacağı belli olabilir.

C 98/C 03 şartnamede soyut makine temelde tek iş parçacıklı. Mümkün olduğunca çok iş parçacıklı C kodu "spec açısından. tamamen taşınabilir yazmak için değil yani Spec bile hakkında hiçbir şey söylemiyoratom oranıhafıza yükler ve depolar yasiparişhangi yükler ve depolar olmasına, asla birbirini kapsamayan nesneler gibi şeyler akla gelebilir.

Tabii ki, özellikle beton sistemleri pthreads ya da pencere gibi ... pratikte çok iş parçacıklı kod yazabilirsiniz. Ama yokstandartyaz için bir çok iş parçacıklı C 98/kod için C 03.

C 11'de soyut makine çok iş parçacıklı tasarım gereğidir. Aynı zamanda iyi tanımlanmışbellek model; diğer bir deyişle, derleyici ne yazıyor ve bellek erişimini gelince yapamazsınız.

Global değişkenler bir çift erişilen örnek olarak, aynı anda iki iş parçacıkları tarafından:

           Global
           int x, y;

Thread 1            Thread 2
x = 17;             cout << y << " ";
y = 37;             cout << x << endl;

İplik 2 çıkış ne olabilir?

C altında 98/C 03, bu bile Tanımsız Davranış değildir; kendisi soruanlamsızstandart bir şey olarak düşünmek değil "çünkü". iplik

C altında 11 sonuç yükler ve depolar genel olarak atom olması gerekmez çünkü Tanımsız davranıştır. Kendiliğinden bir gelişme gibi görünüyor... değil, değil.

Ama C ile 11, Bu yazabilirsiniz:

           Global
           atomic<int> x, y;

Thread 1                 Thread 2
x.store(17);             cout << y.load() << " ";
y.store(37);             cout << x.load() << endl;

Şimdi işler çok daha ilginç bir hal alacak. Her şeyden önce, davranış iştetanımlanmış. 2 iş parçacığı olabilir şimdi baskı 0 0 (eğer çalıştırmadan önce İplik 1), 37 17 (Eğer çalıştıktan sonra iş Parçacığı 1) veya 0 17 (Eğer çalıştıktan sonra iş Parçacığı 1 atar x ama önce atar y).

Baskı edemiyor ne C 11 atomik yükü/depolar için varsayılan modunu zorlamak için çünkü 9**sıralı tutarlılık. Bu yükler ve depolar "konuları arasında operasyon sistemi seviyor ancak aralanmış ise her konu içinde yazdığın sırada oldu." gibi olmalı. Bayar varsayılan davranış sağlaratom oranıvesiparişyükler ve depolar için.

Şimdi, modern bir CPU, sıralı tutarlılık sağlanması pahalı olabilir. Özellikle, derleyici her erişim arasında tam gelişmiş bellek engelleri yayma olasılığı. Ama eğer algoritma katlanabiliyor sırası yükler ve depolar; Yani, eğer bunu gerektirir katına çıkar ama sıralama; Yani, eğer tahammül 37 0 olarak çıktı, bu programı, sonra şunu yaz:

           Global
           atomic<int> x, y;

Thread 1                            Thread 2
x.store(17,memory_order_relaxed);   cout << y.load(memory_order_relaxed) << " ";
y.store(37,memory_order_relaxed);   cout << x.load(memory_order_relaxed) << endl;

Daha modern İŞLEMCİ, daha büyük olasılıkla bu önceki örnekte daha hızlı olacak.

Eğer sadece belirli yükler ve depolar tutmak gerekir son olarak, eğer, yazabilirsiniz:

           Global
           atomic<int> x, y;

Thread 1                            Thread 2
x.store(17,memory_order_release);   cout << y.load(memory_order_acquire) << " ";
y.store(37,memory_order_release);   cout << x.load(memory_order_acquire) << endl;

Bu 37 0 artık mümkün çıktı ... geri bize emretti yükler ve depolar için alır ama bu kadar az yükü ile geliyor. (Bu önemsiz bir örnek, sonuç tam anlamıyla aynı sıralı tutarlılık; daha büyük bir programda olmaz.)

Eğer sadece görmek istediğiniz çıktıları 0 0 37 17, eğer tabii ki, sadece orijinal kodu etrafında bir dışlama sarabilirsiniz. Ama eğer bu kadar okudum, zaten nasıl çalıştığını biliyorum, Ve bu cevap zaten niyetim daha uzun eminim :-).

Yani, sonuç olarak. Uyumu harika, ve C 11 onları standartlaştıran. Ama bazen performansı artırmak için daha düşük düzeyde temel öğeler (örneğin, klasik double-checked locking pattern) istiyorsun. Yeni standart uyumu ve durum değişkenleri gibi üst düzey araçlar sağlar, ve aynı zamanda atom türleri ve bellek bariyer çeşitli lezzetleri gibi düşük seviyeli araçlar sağlar. Şimdi yazabilirsiniz gelişmiş, yüksek performanslı eşzamanlı rutinleri tamamen içinde dil tarafından belirtilen standart ve emin olun kodu derlemek ve çalıştırmak değişmeden hem bugünün sistemleri ve yarın.

Bir uzman olmadığınız sürece dürüst olmak gerekirse, ve düşük seviyeli ciddi bir kod üzerinde çalışıyor olsa da, muhtemelen uyumu ve durum değişkenleri için devam etmelisin. Benim de niyetim buydu.

Daha bu malzeme için, this blog post bkz.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Damian Winter

    Damian Winte

    27 ŞUBAT 2007
  • Louis C.K.

    Louis C.K.

    18 HAZİRAN 2006
  • SomeOne Pro

    SomeOne Pro

    25 EKİM 2013