getrlimit (2) memiliki definisi berikut di halaman manual:
RLIMIT_AS Ukuran maksimum memori virtual proses (ruang alamat) dalam byte. Batas ini memengaruhi panggilan ke brk (2), mmap (2) dan mremap (2), yang gagal dengan kesalahan ENOMEM setelah melampaui batas ini. Juga ekspansi tumpukan otomatis akan gagal (dan menghasilkan SIGSEGV yang membunuh proses jika tidak ada tumpukan alternatif yang tersedia melalui sigaltstack (2)). Karena nilainya panjang, pada mesin dengan panjang 32-bit baik batas ini paling banyak 2 GiB, atau sumber daya ini tidak terbatas.
Apa yang dimaksud dengan "ekspansi tumpukan otomatis" di sini? Apakah tumpukan di lingkungan Linux / UNIX tumbuh sesuai kebutuhan? Jika ya, bagaimana mekanisme tepatnya?
ulimit -s
).Mekanisme yang tepat diberikan di sini, di Linux: dalam menangani kesalahan halaman pada pemetaan anonim, Anda memeriksa untuk melihat apakah itu "alokasi yang tumbuh" yang harus Anda kembangkan seperti tumpukan. Jika catatan area VM mengatakan Anda harus, maka Anda menyesuaikan alamat mulai untuk memperluas tumpukan.
Ketika kesalahan halaman terjadi, tergantung pada alamat, itu dapat diperbaiki (dan kesalahan diatasi) melalui ekspansi stack. Perilaku "tumbuh ke bawah karena suatu kesalahan" untuk memori virtual ini dapat diminta oleh program pengguna yang sewenang-wenang dengan
MAP_GROWSDOWN
bendera diteruskan kemmap
syscall.Anda dapat dipusingkan dengan mekanisme ini di program pengguna juga:
Ketika diminta, Anda menemukan pid dari program (melalui
ps
) dan melihat/proc/$THAT_PID/maps
untuk melihat bagaimana daerah asli telah tumbuh.sumber