Mengapa di Linux modern, ukuran tumpukan standar sangat besar - 8MB (bahkan 10 pada beberapa distribusi)

10

Misalnya, di OSX, bahkan kurang dari 512k.

Apakah ada ukuran yang disarankan, mengingat, bahwa aplikasi tidak menggunakan rekursi dan tidak mengalokasikan banyak variabel stack ?
Saya tahu pertanyaannya terlalu luas dan sangat tergantung pada penggunaannya, tetapi masih ingin bertanya, karena saya bertanya-tanya apakah ada alasan tersembunyi / internal / sistem di balik jumlah yang sangat besar ini.


Saya bertanya-tanya, ketika saya berniat untuk mengubah ukuran tumpukan menjadi 512 KiB di aplikasi saya - ini masih terdengar seperti jumlah yang sangat besar untuk ini, tetapi ini jauh lebih kecil dari 8MiB - dan akan menyebabkan memori virtual proses tersebut menurun secara signifikan, karena saya punya banyak utas (I / O).

Saya juga tahu ini tidak terlalu menyakitkan, dijelaskan di sini : Ukuran tumpukan default untuk pthreads

Kiril Kirov
sumber
Apakah Anda menggunakan CPU 32-bit? CPU X86_64 menawarkan ruang alamat virtual hingga 128 terabyte (dalam ruang pengguna), yang seharusnya cukup untuk banyak tumpukan 8 MB.
Johan Myréen
@ JohanMyréen - tidak, x64 itu. Ini bukan masalah besar, saya hanya ingin tahu, tidak ada alasan nyata untuk melakukan itu (saat ini).
Kiril Kirov
Pada 2019 dan 8 MiB banyak memori? Saya kira tidak. Memiliki ukuran tumpukan standar yang besar membuatnya sangat mudah untuk menulis program dengan rekursi. Saya sangat terkejut mengetahui ukuran tumpukan standar pada Windows hanya 1MiB!
oldherl

Jawaban:

15

Seperti yang orang lain katakan, dan seperti yang disebutkan dalam tautan yang Anda berikan dalam pertanyaan Anda, memiliki tumpukan 8MiB tidak melukai apa pun (selain mengkonsumsi ruang alamat - pada sistem 64-bit yang tidak masalah).

Linux telah menggunakan tumpukan 8MiB untuk waktu yang sangat lama; perubahan diperkenalkan pada versi 1.3.7 dari kernel, pada Juli 1995. Saat itu disajikan sebagai pengantar batas, sebelumnya tidak ada satu:

Batasi tumpukan dengan beberapa default waras: root selalu dapat meningkatkan batas ini jika diperlukan .. 8MB tampaknya masuk akal.

Di Linux, batas tumpukan juga memengaruhi ukuran argumen program dan lingkungan, yang dibatasi hingga seperempat batas tumpukan ; kernel memberlakukan minimal 32 halaman untuk argumen dan lingkungan.

Untuk utas, jika batas tumpukan ( RLIMIT_STACK) tidak terbatas, pthread_createterapkan batasnya sendiri untuk tumpukan utas baru - dan pada kebanyakan arsitektur, itu kurang dari 8MiB.

Stephen Kitt
sumber
1
Wow, menarik. Saya pikir itu baru saja diperkenalkan. Saya memiliki sekitar 200 utas (itu topik panjang lainnya, jadi mari kita abaikan saja untuk saat ini) dan topditampilkan dalam hasil VIRT yang menakutkan. Meskipun, menggali sedikit lebih dalam, sebagian besar ruang alamat virtual ini diambil dari arena per thread (memori), bukan dari ukuran tumpukan, jadi menurunkan ukuran tumpukan tidak akan secara drastis mengurangi memori virtual. Saya hanya ingin tahu mengapa 8MiB dan mengapa begitu banyak.
Kiril Kirov
"8 MB" berarti setiap tumpukan utas dapat tumbuh hingga 8 MB jika utas memutuskan untuk menggunakannya. Tetapi memori fisik tidak akan dialokasikan sampai memori benar-benar digunakan. Jika 200 utas Anda masing-masing menggunakan 512 KB, Anda akan menggunakan ram fisik 100 MB, bukan 1,6 GB.
Guntram Blohm mendukung Monica
Jika Anda tidak bertukar, maka kolom RES di topmemberi Anda jawaban yang jauh lebih baik untuk "apa memori proses ini sebenarnya menggunakan" daripada VIRT.
kbolino
1
@Guntram OP sangat menyadari hal itu, lihat tautan di pertanyaan.
Stephen Kitt
1

8MB adalah ukuran virtual tumpukan. Kesalahan halaman akan terjadi ketika aplikasi Anda mencoba menggunakan lebih banyak tumpukan daripada yang saat ini dialokasikan secara fisik. Penangan kesalahan halaman kernel kemudian akan mengalokasikan halaman fisik dan kemudian aplikasi Anda akan melanjutkan.

Lihat https://unix.stackexchange.com/a/280865/21212 untuk penjelasan lengkap.

Jadi mengurangi ukuran tumpukan Anda seharusnya tidak berpengaruh dalam mengurangi penggunaan memori fisik aplikasi Anda.

Colin 't Hart
sumber
1
Saya sudah menghubungkan jawaban ini dalam pertanyaan saya. Saya juga menulis, bahwa saya sadar akan hal ini, tetapi ini sebenarnya tidak menjawab pertanyaan. Terima kasih
Kiril Kirov
Saya pikir Anda perlu meninjau kembali premis-premis pertanyaan, dan jawaban (non-) ini menunjukkan mengapa. Memori virtual bukan memori nyata. Ukuran tumpukan bisa 800MB dan tidak akan memengaruhi penggunaan memori yang sebenarnya, kecuali jika aplikasi Anda membuat lebih dari 8MB bingkai tumpukan.
kbolino