是否有设置进程堆栈/堆内存分配的功能?

时间:2010-06-19 20:15:13

标签: c memory operating-system

我知道这是一个操作系统功能。但有没有办法通过C增加你的整体堆栈或堆大小? sbrk()用来改变数据段的大小吧?这是否意味着堆栈和堆?

2 个答案:

答案 0 :(得分:3)

你提到sbrk(),所以我假设你的意思是Unix / Linux。 sbrk()将改变数据段的大小,但通常堆栈与数据段位于不同的内存空间,以防止人们覆盖堆栈并做恶事。通常,在使用shell中的ulimit启动程序运行之前,您将设置堆栈大小。

注意:不推荐使用sbrk()而使用malloc()

Open Unix规范定义了(和Linux实现)getrlimit()setrlimit()函数,它们还允许您使用系统限制。

答案 1 :(得分:1)

虚拟内存操作系统(使用带MMU的CPU时)会在需要时自动增加数据/堆栈段,最多可达到最大值。在POSIX系统上,可以使用setrlimit()配置最大值,如W. Craig Trader所说。 POSIX为限制定义了RLIMIT_DATA,RLIMIT_STACK和RLIMIT_AS。

malloc()在内部使用brk()来扩展/收缩数据段,或使用mmap()/ munmap()来请求/释放内存映射。当CPU试图访问分配的堆栈下面的内存时,堆栈会增长。

在没有MMU的系统(例如uClinux)上,可执行文件格式通常具有堆栈大小的字段(例如,查看BFLT文件格式)。