2010-11-11 27 views
5

Çok az ileti dizisi içeren bir kod yazıyor (şu anda yaklaşık 512, ancak gelecekte daha da yükselebilir). İpliklerin her biri sadece az miktarda işlem gerçekleştirir, bu yüzden sisteme yerleştirilen dişlerin minimumda tutulmasını isterim.Güvenli iplik yığını boyutu?

Yığın boyutunu pthread_attr_setstacksize() kullanarak ayarlıyorum ve izin verilen minimum yığın boyutunu PTHREAD_STACK_MIN'dan alabilirim. Ama sorum şu: İş parçacığı yığın boyutu için PTHREAD_STACK_MIN kullanmak güvenli midir? Ne kadar yığına ihtiyacım olduğunu hesaplamaya nasıl giderim? Hesaplamaya eklemem gereken gizli bir ek yük var mı?

Ayrıca, iş parçacığının sistem üzerindeki yükünü azaltmak için kullanabileceğim başka teknikler var mı?

cevap

4

İplik yığını boyutunu küçültmek ek yükü azaltmaz (CPU, bellek kullanımı veya performans açısından değil). Bu açıdan tek sınırınız, platformunuzdaki iş parçacıklarına verilen toplam kullanılabilir sanal adres alanıdır.

Varsayılan yığın boyutunu, platform aksaklıklar ortaya çıkana kadar kullanacağım (eğer olursa). Ardından sorun oluştuğunda yığın kullanımını en aza indirin. Ancak bunlar, yığına vurmanız gereken ya da başka bir yerde devise thread-dependent allocation olması gerektiğinden, gerçek performans sorunlarına yol açacaktır.

Gizli giderleri dahil olabilir: örneğin VLA, alloca() ya da sadece düz statik otomatik diziler ölçekli ile olduğu gibi yığında büyük diziler, bir

  • Ayırma.
  • Kodlar, şablonlar, fabrika sınıfları vb. Kullanımların sonuçlarını kontrol edemez veya bunlardan haberdar olmadınız. Ancak C++ belirtmediğinizden dolayı, bu sorunun daha az olasıdır.
  • Kitaplık başlıklarından alınan kodlar. Bunlar sürümler arasında değişebilir ve yığınlarını önemli ölçüde değiştirebilir veya hatta iş parçacığı kullanımını değiştirebilir.
  • Özyineleme. Bu, yukarıdaki noktalara da bağlı olarak, boost::bind, variadic şablonlar, çılgın makrolar gibi şeyleri göz önünde bulundurur ve daha sonra tampondaki veya yığıntaki büyük nesneleri kullanarak genel tekrarlamadır.

Yığın boyutunu ayarlama, iş parçacığı önceliklerini değiştirme ve bunları gerektiği gibi askıya alma ve sürdürme işlemine ek olarak, programlayıcıya ve sistem yanıtlanabilirliğine önemli ölçüde yardımcı olacak şekilde yapabilirsiniz. Pthreads, çekişme kapsamını belirlemenize izin verir; LWP ve kapsam programlaması performans özelliklerinde büyük ölçüde farklılık gösterir.

+0

Teşekkürler Matt. Sonrasında yaptığım cevaba en yakın olduğunu düşünüyorum. Birinin "tüm yerel değişkenlerin sizeof() değerini ekleyeceğini, iplik yükü için 42 bayt eklediğini ve sonra da iyi şans için% 10 ekleyeceğini" umuyordum, ancak potansiyel olarak çok daha fazla etken var gibi görünüyor. oyunda. Öncelikler için ipuçları ve askıya alma için teşekkürler. –

+2

@ ltn100: hayır, daha çok "kodunuzu, belirli bir yığın boyutuyla, taşma algılayan bir hata ayıklama bağlamında sınayın. Daha sonra iyi şans için% 10 ekleyin" gibi. –

+2

@ ltn100: Platformunuzda yüksek su işaret yığını kullanımını gerçekten ölçen bir hata ayıklama aracı bulabilirseniz, bu iyi bir şeydir, ancak bunu gerçekten yapmanız gereken platformlar (yığının fiziksel RAM önü olduğundan) zorunlu değildir En iyi hata ayıklama araçlarına sahip olanlar. Ve gerçekten * testlerle dolu olmalısınız. Dinamik olarak bağlandığınız kütüphanelerdeki değişiklikler veya baktıkları ortam değişkenleri veya (tam olarak) haftanın günü gibi küçük şeyler, yüksek su işaretinizi artırabilir. VLA'lardan kaçının, giriş verilerine bağlı olarak herhangi bir tekrardan kaçının. –

7

Çok sayıda iş parçacığının yakınında herhangi bir yerde olmamanız gerekir ve kesinlikle az miktarda işlem yapmak için yeni bir iş parçacığı oluşturmamanız gerekir. Yeni bir iş parçacığı oluşturmalısınız ve eğer mevcut iş parçacığınız tamamen doymuşsa VE iş için daha fazla fiziksel veya mantıksal bakım varsa. Bu, yaklaşık 10 iş parçacığında makul bir geçerli uygulama üzerinde zor bir limit koyar, bu yüzden bir hexacore üzerinde çalıştırılsa bile, sadece 12'ye veya daha fazlasına ihtiyacınız olur. Böyle bir tasarım çok kusurlu, çok miktarda işlem belleği kullanacak ve performansı gerçekten iyileştirmeyecek.

Yığın boyutuyla ilgili olarak, tamamen kod çalıştırmasına bağlı olduğundan, isteğe bağlı bir iş parçacığına ne kadar ihtiyacınız olduğunu hesaplayamazsınız. Ancak, Visual Studio'da, tipik yığın boyutu birkaç megabayttır. Ne kadar yığın boyutunun kullanılacağını öğrenmek için, tüm kodu ve iş parçacığı tarafından yürütülen disassembly'ı göndermelisiniz. Sadece birkaç megabaytta yapıştırın.

+1

+1: Burada

bazı faydalı bağlantılar Ama ipler düzenli IO bağlı olup olmadığını ... –

+0

çekirdek daha konuları isteyebilirsiniz @ Oli Ama 50x değil. –

+4

@C. Ross: Tam olarak ne I/O olduklarına bağlı. Tamam, bu yüzden kaynaklarda daha verimli bir asenkron I/O sistemi oluşturmanın başka yolları da vardır (ve belki de zamanımda daha az verimli olacağım, olay kuyrukları ile ne kadar iyi olduğuma bağlı olarak, 'select' vb.) zamanlarının% 99,8'ini ağ G/Ç'yi bekleyecekler, sonra 500 iş parçacığı istiyorum. Bazen RAM programcılardan daha ucuzdur, bazen değil ;-) –

5

dizisi çerçevesinin gerekli boyut temelde vb kayıtlarını

Sen olmadığını düşünmelisiniz tasarruf senin oto değişkenler, parametrelerin boyutu ve dönüş adrese için bazı ek yükü tahmin etmeye deneyebilirsiniz, kullanmak derleyici bağlıdır Thread Pool'u kullanmanın bir alternatifi olacaktır. Bir iş parçacığının oluşturulması özgür olmadığı için.

+1

İş parçacığı havuzlarının modern uygulamalarda önemli yararları olup olmadığı konusunda şüphelerim var. Artık kimse LinuxThreads kullanmıyor ve artık böyle hacklemiyor. İplik oluşturmanın görece maliyeti konusunda güncel bir referansınız var mı? –

+1

Gerçekten. İş parçacığı oluşturma maliyeti değişebilir, ancak genellikle bu günlerde ucuzdur. Ancak iplik havuzlarına ilişkin noktanın hala geçerli olduğunu düşünüyorum. Düşünmek için yararlı bir araçtırlar, ancak çoğu insanın bunları kullanmak için bir neden bulmaya çalışıyorum. –

İlgili konular