(转)Linux进程与它的堆栈空间

一、概述
堆栈是一个用户空间的内存区域,进程使用[color=red][b]堆栈[/b][/color]作为[color=red][b]临时存储[/b][/color]。
堆栈中存放的是函数中的局部变量,在函数的生命周期中可将变量压入堆栈,编译器需确保堆栈指针在函数退出前恢复到初始位置,即是说,内存是自动分配和释放的。
C/C++把存储在堆栈中的局部变量当作automatic存储,并使用auto关键字,这是局部变量的默认存储方式,所以现在没人用auto关键词。
与动态存储相对应的[color=red][b]静态存储[/b][/color],即用static定义的局部变量,不用堆栈来存储,而是使用[color=red][b]数据段[/b][/color]。
堆栈的基地址位于用户空间的最高虚拟地址附近,并从那里向下延伸。
一个进程开始,堆栈的最大值就不能改变,如果占用的空间超过了堆栈大小,就导致堆栈溢出。
 
二、进程的内存组织形式
进程被分为三个区域:[color=red][b]文本[/b][/color]、[color=red][b]数据[/b][/color]和[color=red][b]堆栈[/b][/color]
1) 文本区域
文本区域也叫做[color=red][b]代码段[/b][/color],由程序确定,包括代码(指令)和只读数据。该区域通常被标记为只读,任何对其写入的操作会导致段错误。
2) 数据区域
数据区域也叫做[color=red][b]数据段[/b][/color],包括已初始化和未初始化的数据,静态变量存储在这个区域中。
3) 堆栈区域
堆栈区域也叫[color=red][b]堆栈段[/b][/color],它用于给局部变量动态分配空间,同样函数传递参数和函数返回值也要用到堆栈。
堆栈也可向下增长(向内存低地址)也可以向上增长,依赖于具体的实现。通常是向下增长,而SP(堆栈指针)也是指向堆栈的最后地址。
4) 内存的分配区域
通常[color=red][b]堆栈[/b][/color]位于最高虚拟地址附近,而数据段位于[color=red][b]堆栈段[/b][/color]之后,最后是[color=red][b]代码段[/b][/color]。

三、堆栈着色
当两个线程或进程使用相同的堆栈虚拟地址时,它们会争夺同一个cache行,导致竞争和降级行为。
堆栈着色的技术使每一个进程的基址都不相同,通过随机分配堆栈基址,多个进程会使用不同的cache行来避免。

四、常驻内存和锁定内存
常驻内存专指存储在RAM中的内存部分,不包括存储在交换区和未存储的进程的内存。
锁定内存是常驻内存的子集,它指被进程明确地锁定到RAM的虚拟内存中,不能用于交换,并一直常驻于RAM中。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值