堆和栈空间大小和作用

部署运行你感兴趣的模型镜像

win系统默认的栈空间是1M(1MiB)大小,而Linux默认下栈空间常见的是8M或10M。不同系统的栈空间默认大小不同是由系统和(或)编译器决定的(编译器占主要作用),而具体的情况要具体的分析。我见过有文章认为x86/x64体系架构的系统默认栈空间大小是1M,而安腾系列默认4M,对此我个人表示不能赞同。栈和堆都是在可用内存空间之中分配的,而硬件上的内存应该是完全一样的,也就是说栈可以分配到硬件内存上的低地址,也可以分配到某个中间段地址或高地址,而不是由硬件支持的;硬件支持的在我的知识中只有寄存器了,寄存器速度是快于内存,但价格要高于内存,它是稀缺的资源,需要特殊考虑的。而堆的速度慢于栈,更多的是跟操作系统设计有关(应该没判断错)。下面是我总结的一些要点了


  1. 一个进程一个堆,一个线程一个栈(这仅是笼统、粗略地从进程线程堆栈的区别上讲的)
  2. win系统默认栈大小是1M,linux常见默认的栈大小是8M或10M(通过ulimit -s查看;不同linux发行版的命令不保证相同)
  3. 所有系统的堆空间上限是接近内存(虚拟内存)的总大小的(一部分被OS占用)
  4.  

Linux系统查看栈空间大小

1.使用ulimit -s查看栈大小,单位是KB

2.使用ulimit -a可以查看当前所有限制情况,其中一列写着stack size即为栈空间大小(此处需要补一张-a图片

3.ulimit 指令参数如下

-H 设置硬资源限制.
-S 设置软资源限制.
-a 显示当前所有的资源限制.
-c size:设置core文件的最大值.单位:blocks
-d size:设置数据段的最大值.单位:kbytes
-f size:设置创建文件的最大值.单位:blocks
-l size:设置在内存中锁定进程的最大值.单位:kbytes
-m size:设置可以使用的常驻内存的最大值.单位:kbytes
-n size:设置内核可以同时打开的文件描述符的最大值.单位:n
-p size:设置管道缓冲区的最大值.单位:kbytes
-s size:设置堆栈的最大值.单位:kbytes
-t size:设置CPU使用时间的最大上限.单位:seconds
-v size:设置虚拟内存的最大值.单位:kbytes
-u <程序数目>  用户最多可开启的程序数目


Linux系统设置栈空间大小

1. ulimit -s 临时改变栈空间大小:ulimit -s 1024,单位是KB

2. 在/etc/rc.local文件加入 ulimit -s 1024 在系统启动时开机设置栈空间大小

3. 修改文件/etc/security/limits.conf改变栈空间大小:

#<domain> <type> <item> <value>

* soft stack 1024


在此推荐一篇文章:关于堆栈的讲解(我见过的最经典的)

保留链接:https://blog.youkuaiyun.com/yingms/article/details/53188974?utm_source=blogxgwz2

您可能感兴趣的与本文相关的镜像

Yolo-v8.3

Yolo-v8.3

Yolo

YOLO(You Only Look Once)是一种流行的物体检测和图像分割模型,由华盛顿大学的Joseph Redmon 和Ali Farhadi 开发。 YOLO 于2015 年推出,因其高速和高精度而广受欢迎

在嵌入式系统(如 **TMS320C6748**、**ARM Cortex-M 系列**等)或通用操作系统(如 Linux、Windows)中,**(heap)(stack)** 是程序运行时非常重要的两块内存区域。 --- ## ✅ 一、(Stack) ### 📌 定义: 是用于函数调用、局部变量、中断处理等的内存区域,由编译器自动管理。 ### 📌 大小设置方式: - **裸机系统(Bare-metal)**:通常在链接脚本(`.cmd` 文件)或启动文件(`c_int00`)中定义大小。 - **RTOS 或操作系统**:每个任务都有自己的栈空间,由任务创建时指定。 ### 📌 常见大小(以 C6748 为例): ```c /* 在链接脚本中定义大小 */ STACK_SIZE = 0x1000; // 4KB ``` ### 📌 示例(Cortex-M 系统): ```s ; 启动文件中定义大小 Stack_Size EQU 0x400 ; 1KB ``` ### ✅ 推荐大小: | 平台 | 推荐大小 | 说明 | |------|------------|------| | C6748 裸机 | 4KB ~ 8KB | 一般用于函数调用中断处理 | | Cortex-M4 | 1KB ~ 4KB | 取决于函数嵌套深度局部变量 | | RTOS 任务 | 512B ~ 4KB | 每个任务独立栈空间 | --- ## ✅ 二、(Heap) ### 📌 定义: 是用于动态内存分配(如 `malloc`、`calloc`)的内存区域,由程序员手动管理。 ### 📌 大小设置方式: - **裸机系统**:在链接脚本中定义大小。 - **操作系统**:由系统内存管理器动态分配。 ### 📌 示例(C6748 链接脚本): ```c /* 大小定义 */ HEAP_SIZE = 0x2000; // 8KB ``` ### ✅ 推荐大小: | 平台 | 推荐大小 | 说明 | |------|------------|------| | C6748 裸机 | 8KB ~ 64KB | 取决于是否使用动态内存分配 | | Cortex-M 系统 | 4KB ~ 32KB | 若使用 malloc,需合理分配 | | Linux 应用程序 | 动态增长 | 由系统自动管理 | | RTOS 系统 | 16KB ~ 几百 KB | 用于任务间通信、内存池等 | --- ## ✅ 三、堆栈大小如何设置? ### 1. **裸机系统**(如 C6748) 在 `.cmd` 链接脚本中: ```c MEMORY { L2RAM: o = 0x10800000, l = 0x80000 } SECTIONS { .stack : { > L2RAM } SIZE(STACK_SIZE) .heap : { > L2RAM } SIZE(HEAP_SIZE) } ``` ### 2. **RTOS 系统**(如 FreeRTOS) ```c xTaskCreate(task_func, "Task1", 200, NULL, 1, NULL); // 第二个参数是大小(单位:字) // 200 字 = 800 字节(Cortex-M 中每个字是 4 字节) ``` --- ## ✅ 四、如何判断是否溢出? ### ✅ 溢出检测方法: - 使用编译器选项(如 GCC 的 `-fstack-protector`) - 在底部设置“金丝雀”值,运行时检测是否被破坏 - 使用调试器查看指针是否越界 ### ✅ 溢出检测方法: - 使用内存分析工具(如 Valgrind、AddressSanitizer) - 使用内存池管理(RTOS 中常用) - 手动检查 `malloc` 返回值是否为 NULL --- ## ✅ 五、总结 | 项目 | 推荐大小 | 说明 | |------|----------|------| | 大小 | 1KB ~ 8KB(裸机),512B ~ 4KB(RTOS任务) | 影响函数调用深度中断嵌套 | | 大小 | 8KB ~ 64KB(裸机),动态增长(Linux) | 决定能否使用动态内存分配 | | 设置方式 | 链接脚本(裸机)、任务创建参数(RTOS) | 不同平台配置方式不同 | | 溢出风险 | 溢出导致崩溃,溢出导致内存泄漏 | 需要进行充分测试检测 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值