linux 下用户栈最大值

本文通过实验验证了Linux系统中用户栈的最大值并非存储在可执行程序中,而是在程序启动时由系统变量决定。通过调整ulimit设置,观察到栈大小的变化直接影响了递归函数调用的深度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用户栈最大值可通过ulimit 查看和修改,ubuntu下默认8M ,centos下默认10M

测试环境:

uname -a

Linux VM-107-250-ubuntu 3.13.0-36-generic #63-Ubuntu SMP Wed Sep 3 21:30:45 UTC 2014 i686 i686 i686 GNU/Linux

查看:

ulimit -a 




linux中,栈的最大值没有存储在可执行程序中。


为了证明Linux中进程的栈最大值是否存储在可执行程序中还是在运行时从系统中读取,进行测试。

测试代码:

   #include <iostream>                                                                   
   using namespace std;
   
   void func(int num)
   {
       int a=0;
       cout<<num<<endl;
       while(true)
           func(--num);
   }
 
   int main()
   {
      func(0);
 
   }




第一次执行程序结果:


可见程序执行到174612次左右后发生段错误


下面通过ulimit修改栈大小,

将栈大小修改为默认大小*2=16384:

ulimit -s 16384



修改后的执行结果:


 发现函数运行到349364次左右时才发生段错误,约为修改前的两倍左右。(两次运行期间没有重新生成对执行文件)


结论:linux下进程用户栈的最大值是在程序启动时从系统变量中得到的。

### Linux 用户和内核的大小 在 Linux 系统中,用户和内核的设计是为了支持进程在不同状态下的执行需求。以下是关于它们大小的具体说明: #### 用户的大小 用户的堆区域位于用户空间内存范围内,具体来说,在 32 位系统上,用户空间占据最低的 3GB 虚拟地址范围(从 `0x00000000` 到 `0xBFFFFFFF`)。用户的实际大小可以通过编译时参数或者运行时调整来设置,默认情况下,Linux 的线程库会分配大约 **8MB** 的空间给每个线程或进程[^3]。 然而需要注意的是,这个值并非固定不变,而是可以动态配置。例如,通过 ulimit 命令能够查看当前系统的默认大小限制: ```bash ulimit -s ``` 此命令返回的结果通常是单位为 KB 的数值,比如常见的输出可能是 `8192` 表示每条线程拥有最大约 8 MB 的容量。 #### 内核的大小 对于内核而言,它的设计更加紧凑以节省宝贵的资源。在 ARM 架构下,每一个任务都关联着一个固定的内核区段用于存储当切换至核心模式期间所需的数据结构以及临时变量等内容。依据所引用资料得知,这种特定架构上的内核尺寸设定为了恒定的 **8KB**, 并且按照 \(2^{13}\) 字节边界对齐处理以便硬件访问效率最大化[^2]。 值得注意的一点是尽管这里讨论基于ARM平台情况,但在其他主流处理器体系如X86_64之上同样存在类似的机制只是具体的实现细节可能会有所差异;譬如 X86_64 上一般也会维持较小规模 (典型值也是数K级别),但确切数字取决于版本与选项等因素影响。 综上所述,在标准条件下,Linux 中典型的用户大小约为 8MB 左右,而内核则保持在一个更小得多的数量级——通常只有几个 KB 大小,像 ARM 下就是明确指出过的 8KB 容量。 ```python # 示例 Python 代码展示如何查询当前 shell session 的 stack size limit import subprocess def get_stack_size_limit(): result = subprocess.run(['ulimit', '-s'], stdout=subprocess.PIPE) return int(result.stdout.strip()) current_stack_size_kb = get_stack_size_limit() print(f"Current user stack size limit is {current_stack_size_kb} KB.") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值