Pthreads için varsayılan yığın boyutu


24

Anladığım kadarıyla, Linux'ta bir pthread için varsayılan yığın boyutu 16K'dır. 64-bit Ubuntu kurulumumda garip sonuçlar alıyorum.

$ ulimit -s
8192

Ayrıca:

pthread_attr_init(&attr);
pthread_attr_getstacksize(&attr, &stacksize);
printf("Thread stack size = %d bytes \n", stacksize);

Prints
    Thread stack size = 8388608 bytes

Yığın boyutunun "8388608" olmadığından eminim. Neyin yanlış olabilir?


7
Bence 8388608 / 1024 = 8192.
cuonglm

6
Her bir iş parçacığı çekirdek yığınları için 16k düşünüyorum . Kullanıcı alanı yığın hafızasından tamamen ayrı bir sorun. çekirdek yığınları küçüktür çünkü sayfalama yapılamaz veya tembel olarak tahsis edilemez ve fiziksel bellekte bitişik sayfalar olması gerekir. elinux.org/Kernel_Small_Stacks . Çok fazla sayıda toplam iş parçacığına sahip olmak, adres boşluğunun sınırlı olduğu, özellikle 32-bit için varsayılan olarak 8k yığınlarıyla i386 için bir sorun olabilir.
Peter Cordes

Yanıtlar:


21
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);

Bu stacksizenitelik, oluşturulan iş parçacığı yığını için ayrılan minimum yığın boyutunu (bayt olarak) tanımlamalıdır.

Örneğinizde, yığın boyutu, Eşleşen ulimit -s So komutunun döndürdüğü şekilde, 8 MB'a karşılık gelen 8388608 bayta ayarlanmıştır .

Gönderen pthread_create()açıklaması:

On Linux / x86-32 , yeni iş parçacığı için varsayılan yığın boyutu 2 megabayt . NPTL iş parçacığı uygulamasında, programın başlatıldığı sırada RLIMIT_STACK yazılım kaynağı sınırı "sınırsız" dışında bir değere sahipse, yeni iş parçacıklarının varsayılan yığın boyutunu belirler. Kullanma pthread_attr_setstacksize (3), yığın boyutu özelliği açık varsayılan dışında bir yığın boyutu elde etmek amacıyla, bir iplik oluşturmak için kullanılan attr bağımsız değişken olarak ayarlanabilir.

Böylece iplik yığını boyutu, yukarıdaki set işlevi veya ulimitsistem özelliği ile ayarlanabilir . Bahsettiğiniz 16k için, hangi platformda gördüğünüz ve / veya bunun için herhangi bir sistem limiti ayarlanmış olup olmadığı açık değildir.

Bununla ilgili bazı ilginç örnekler için pthread_create sayfasına ve buraya bakın .


47

Aslında, sanal yığın boyutu olan 8388608 bayt (8 MB). Elbette, bunun doğru olamayacağı sonucuna varmak doğaldır, çünkü bu, her bir iş parçacığı için bir miktar KB'nin% 99'u muhtemelen ihtiyaç duydukları her zaman yığını için tüketmesi çok saçma bir bellek miktarıdır.

İyi haber şu ki konu başlığınız sadece ihtiyaç duyduğu fiziksel hafıza miktarını kullanıyor . Bu, işletim sisteminizin işlemcinizdeki donanım Bellek Yönetim Birimi'ni (MMU) kullanmasından elde edilen sihirli güçlerden biridir. İşte olanlar:

  1. İşletim sistemi, iş parçanız için MMU sayfa tablolarını ayarlayarak yığınıza 8 MB sanal bellek ayırır. Bu, yalnızca sayfa tablosu girişlerini tutmak için çok az RAM gerektirir.

  2. İş parçanız çalışır ve henüz kendisine atanmış fiziksel bir sayfa içermeyen yığın üzerinde sanal bir adrese erişmeye çalıştığında, "sayfa hatası" adı verilen bir donanım istisnası MMU tarafından tetiklenir.

  3. CPU çekirdeği, ayrıcalıklı bir çalıştırma moduna (kendi yığınına sahip olan) geçerek ve çekirdeğin içindeki sayfa hatası istisna işleyici işlevini çağırarak sayfa hatası istisnasına yanıt verir.

  4. Çekirdek, bu sanal bellek sayfasına bir fiziksel RAM sayfası ayırır ve kullanıcı alanı başlığına geri döner.

Kullanıcı alanı iş parçacığı bu işin hiçbirini görmez. Bakış açısından, sadece yığını boyunca sanki yığını kullanır. Bu arada, istif, iplik ihtiyaçlarını karşılamak için otomatik olarak büyür (veya olmaz).

MMU, günümüzün bilgisayar sistemlerinin donanımının önemli bir parçasıdır. Özellikle, sistemdeki birçok "sihir" den sorumludur, bu yüzden MMU’nun ne yaptığı ve genel olarak sanal bellek hakkında daha fazla şey öğrenmenizi tavsiye ederim. Ayrıca, uygulamanız performans açısından hassas ve önemli miktarda veriyle ilgileniyorsa, TLB'nin (MMU sayfa tablosu önbelleği) nasıl çalıştığını ve TLB isabet oranınızı en üst düzeye çıkarmak için verilerinizi veya algoritmalarınızı nasıl yeniden yapılandırabileceğinizi anlamalısınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.