【问题标题】:Is there a function to set a process stack/heap memory allocation?是否有设置进程堆栈/堆内存分配的功能?
【发布时间】:2011-03-05 20:38:05
【问题描述】:

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

【问题讨论】:

    标签: c memory operating-system


    【解决方案1】:

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

    注意:不推荐使用 sbrk(),取而代之的是 malloc()

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

    【讨论】:

    • getrlimit()setrlimit()ulimit 实际上用来调整限制的。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-09-11
      • 2011-05-28
      • 2016-12-14
      • 2018-07-24
      • 1970-01-01
      • 2014-10-03
      • 2011-10-09
      • 2020-09-02
      相关资源
      最近更新 更多