Neden modern Linux'ta, varsayılan yığın boyutu çok büyük - 8MB (bazı dağıtımlarda 10 bile)


10

Örneğin, OSX'te, 512k'dan bile daha az.

Uygulamanın özyineleme kullanmadığını ve çok sayıda yığın değişkeni ayırmadığını göz önünde bulundurarak önerilen herhangi bir boyut var mı ?
Sorunun çok geniş olduğunu ve büyük ölçüde kullanıma bağlı olduğunu biliyorum, ama yine de sormak istedim, çünkü bu büyük sayının arkasında gizli / dahili / sistem nedeni olup olmadığını merak ediyordum .


Uygulamamda yığın boyutunu 512 KiB olarak değiştirmeyi düşündüğüm için merak ediyordum - bu hala bunun için çok sayıda gibi görünüyor, ancak 8MiB'den çok daha küçük - ve işlemin sanal belleğinde önemli ölçüde azalmaya yol açacağım. çok fazla iş parçacığı var (G / Ç).

Ayrıca , bunun gerçekten acıtmadığını da iyi açıklıyorum : pthreads için varsayılan yığın boyutu


32 bit CPU mu kullanıyorsunuz? X86_64 CPU'lar 128 terabayta kadar (kullanıcı alanında) sanal adres alanı sunar ve bu 8 MB'lık yığınlar için yeterlidir.
Johan Myréen

@ JohanMyréen - hayır, x64 öyle. Bu büyük bir mesele değil, sadece merak ediyordum, bunu yapmak için gerçek bir neden yok (şu anda).
Kiril Kirov

2019 ve 8 MiB'de çok fazla bellek var mı? Ben öyle düşünmüyorum. Büyük bir varsayılan yığın boyutuna sahip olmak, programları özyineleme ile yazmayı çok kolaylaştırır. Windows'da varsayılan yığın boyutunun sadece 1MiB olduğunu bilmek çok şaşırdım!
oldherl

Yanıtlar:


15

Diğerlerinin söylediği gibi ve sorunuzda sağladığınız bağlantıda belirtildiği gibi, 8MiB yığınına sahip olmak hiçbir şeye zarar vermez (adres alanı tüketmek dışında - önemli olmayan 64 bit bir sistemde).

Linux 8MiB yığınlarını çok uzun zamandır kullandı; değişiklik, 1995 yılının Temmuz ayında çekirdeğin 1.3.7 sürümünde tanıtıldı . O zamanlar bir sınır getirerek sunuldu, daha önce bir tane yoktu:

Yığını bir aklı başında varsayılanla sınırlayın: Kök gerektiğinde bu sınırı her zaman artırabilir. 8MB makul görünüyor.

Linux'ta, yığın sınırı, yığın sınırının dörtte biri ile sınırlı olan program bağımsız değişkenlerinin ve ortamın boyutunu da etkiler ; çekirdek, argümanlar ve ortam için en az 32 sayfa uygular.

İş parçacıkları için, yığın sınırı ( RLIMIT_STACK) sınırsızsa, pthread_createyeni iş parçacıklarının yığınlarına kendi sınırlarını uygular - ve çoğu mimaride, bu 8 MB'den azdır.


1
Vay ilginç. Yakın zamanda tanıtıldığını düşündüm. Ben yaklaşık 200 iş parçacığı var (bu başka bir uzun konu, bu yüzden sadece şimdilik görmezden gelelim) ve topkorkunç VIRT sonuçlarında gösterir. Biraz daha derine inmekle birlikte, bu sanal adres alanının çoğunluğu yığın boyutundan değil, iş parçacığı (bellek) alanlarından alınır, bu nedenle yığın boyutunu düşürmek sanal belleği önemli ölçüde azaltmaz. Neden 8MiB ve neden bu kadar çok merak ettim.
Kiril Kirov

"8 MB" , iş parçacığı kullanmaya karar verirse her iş parçacığının yığınının 8 MB'a çıkabileceği anlamına gelir . Ancak, bellek gerçekten kullanılana kadar fiziksel bellek ayrılmaz. 200 iş parçanız her biri 512 KB kullanıyorsa, 1,6 GB değil 100 MB fiziksel ram kullanırsınız.
Guntram Blohm

Değiştirmiyorsanız, içindeki RES sütunu topsize "bu işlemin gerçekte hangi belleği kullanıyor" sorusuna VIRT'den çok daha iyi bir cevap verir.
kbolino

1
@Guntram OP bunun farkındadır, soruya bakınız.
Stephen Kitt

1

8MB, yığının sanal boyutudur. Uygulamanız şu anda fiziksel olarak ayrılandan daha fazla yığın kullanmaya çalıştığında bir sayfa hatası oluşacaktır. Çekirdeğin sayfa hatası işleyicisi daha sonra fiziksel bir sayfa ayıracak ve uygulamanız devam edecektir.

Tam açıklama için bkz. Https://unix.stackexchange.com/a/280865/21212 .

Bu nedenle, yığın boyutunuzu azaltmanın uygulamanızın fiziksel bellek kullanımını azaltmada bir etkisi olmamalıdır .


1
Bu cevabı soruma zaten bağladım. Ben de bunun farkında olduğumu yazdım, ama bu aslında soruyu cevaplamıyor. Neyse teşekkürler
Kiril Kirov

Sorunun önermelerini tekrar gözden geçirmeniz gerektiğini düşünüyorum ve bu (olmayan) cevap nedenini gösteriyor. Sanal bellek gerçek bellek değildir. Yığın boyutu 800 MB olabilir ve uygulamanız 8 MB'tan fazla yığın karesi oluşturmadığı sürece gerçek bellek kullanımını etkilemez.
kbolino
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.