代码之家  ›  专栏  ›  技术社区  ›  Clark Gaebel

在Linux上全局设置程序的默认堆栈大小

  •  4
  • Clark Gaebel  · 技术社区  · 15 年前

    我现在的解决方案是限制线程的堆栈大小。然而,我不知道如何做到这一点便携。只是为了上下文,我使用Boost.Thread来满足我的线程需求。我可以接受一点“如果地狱”,但我想先知道如何轻松地做到这一点。

    // windows_stack_limiter.c
    int limit_stack_size()
    {
        // Windows impl.
        return 0;
    }
    
    // posix_stack_limiter.c
    int limit_stack_size()
    {
        // Linux impl.
        return 0;
    }
    
    // stack_limiter.cpp
    int limit_stack_size();
    static volatile int placeholder = limit_stack_size();
    

    如何充实这些功能?或者,我只是做错了吗?记住,我无法控制实际的线程创建(在Windows上没有新的参数来创建线程),因为我使用的是Boost.thread。

    3 回复  |  直到 15 年前
        1
  •  6
  •   Amardeep AC9MF    15 年前

    你不需要这么做。机器的物理内存仅在按需页故障系统需要时使用。即使线程堆栈明显大于您正在使用的数量,额外的大小也在虚拟地址空间中,不会占用物理RAM。

    如果物理RAM以这样的速度被占用,那么一台典型的机器在只有几十个进程运行的情况下就会耗尽内存。你可以从一个 ps -Al 比这个多很多的同时执行。

        2
  •  1
  •   Aaron Graham    10 年前

    我在32位系统(尤其是MIPS)上也遇到过类似的问题,这些系统运行的是具有数百个线程的大型应用程序。大型默认堆栈不会占用物理内存,但虚拟内存也可能是一种稀缺资源。有几种方法可以解决这个问题:

    • 在程序中使用setrlimit。我没做过这个,但我怀疑它会起作用。
        3
  •  0
  •   Slartibartfast    15 年前

    首先,你不需要改变这一点,除非你得到的SEGV从达到这个限制(看见 man setrlimit

    /etc/security/limits.conf (更改默认值)或通过运行 ulimit -s <stack size in kilobytes> 在退出shell之前更改值。