【发布时间】:2011-03-05 20:38:05
【问题描述】:
我知道这是一个操作系统功能。但是有没有办法通过 C 增加你的整体堆栈或堆大小? sbrk() 是用来改变数据段的大小的吗?这是否意味着堆栈和堆?
【问题讨论】:
标签: c memory operating-system
我知道这是一个操作系统功能。但是有没有办法通过 C 增加你的整体堆栈或堆大小? sbrk() 是用来改变数据段的大小的吗?这是否意味着堆栈和堆?
【问题讨论】:
标签: c memory operating-system
您提到了sbrk(),所以我假设您的意思是 Unix/Linux。 sbrk() 会改变数据段的大小,但通常堆栈与数据段位于不同的内存空间,以防止人们覆盖堆栈并做坏事。通常,您将在您的 shell 中使用 ulimit 开始运行程序之前设置您的堆栈大小。
注意:不推荐使用 sbrk(),取而代之的是 malloc()。
Open Unix 规范定义(并且 Linux 实现了)getrlimit() 和 setrlimit() 函数,它们还允许您使用系统限制。
【讨论】:
getrlimit() 和 setrlimit() 是 ulimit 实际上用来调整限制的。
虚拟内存操作系统(使用带有 MMU 的 CPU 时)会在需要时自动增长数据/堆栈段,直至达到最大值。正如 W. Craig Trader 所说,在 POSIX 系统上,可以使用 setrlimit() 配置最大值。 POSIX 为限制定义了 RLIMIT_DATA、RLIMIT_STACK 和 RLIMIT_AS。
malloc() 在内部使用 brk() 来增大/缩小数据段,或 mmap()/munmap() 来请求/释放内存映射。当 CPU 尝试访问分配的堆栈下方的内存时,堆栈就会增长。
在没有 MMU 的系统(例如 uClinux)上,可执行文件格式通常有一个堆栈大小字段(例如,看看 BFLT 文件格式)。
【讨论】: