在linux上,这纯粹是一种资源限制,用于限制失控的进程在消耗有害资源量之前将其杀死。在我的debian系统上,以下代码
#include <sys/resource.h>
#include <stdio.h>
int main() {
struct rlimit limits;
getrlimit(RLIMIT_STACK, &limits);
printf(" soft limit = 0x%016lx\n", limits.rlim_cur);
printf(" hard limit = 0x%016lx\n", limits.rlim_max);
printf("RLIM_INFINITY = 0x%016lx\n", RLIM_INFINITY);
}
产生输出
soft limit = 0x0000000000800000
hard limit = 0xffffffffffffffff
RLIM_INFINITY = 0xffffffffffffffff
请注意,硬限制设置为RLIM_INFINITY
:允许进程将其软限制提高到任意数量。但是,只要程序员没有理由认为程序确实需要异常数量的堆栈内存,则当该进程超过8 MB的堆栈大小时,该进程将被终止。
由于这个限制,一个失控的进程(意外的无限递归)在开始消耗大量内存之前就被杀死了很长时间,以致系统被迫开始交换。这可以使崩溃的进程和崩溃的服务器有所不同。但是,它并不限制合法需要大堆栈的程序,它们只需要将软限制设置为适当的值即可。
从技术上讲,堆栈确实会动态增长:当soft-limit设置为8 MB时,这并不意味着实际上已映射了此内存量。这将是相当浪费的,因为大多数程序永远都无法接近其各自的软限制。相反,内核将检测堆栈下方的访问,并仅根据需要映射到内存页面中。因此,对堆栈大小的唯一真正限制是64位系统上的可用内存(理论上讲,地址空间的碎片化是16 zebibyte地址空间大小)。