快速业务通道

详解Linux进程与堆栈空间

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-15

  一)概述

  .堆栈是一个用户空间的内存区域,进程使用堆栈作为临时存储.

  .堆栈中存放的是函数中的局部变量,在函数的生命周期中可以将变量压入堆栈,编译器需要确保堆栈指针在函数退出前恢复到初始位置,也就是说,内存是自动分配和释放的.

  .C/C 把存储在堆栈中的局部变量当作automatic存储,并使用auto关键字,这是局部变量的默认存储方式,现在没有人用auto关键词.

  .与动态存储相对映的静态存储,也就是用static定义的局部变量,它不用堆栈来存储,而是使用数据段来存储.

  .堆栈的基地址位于用户空间的最高虚拟地址附近,并从那里向下延伸.

  .一个进程开始时,堆栈的最大值就不能改变,如果占用的空间超过了堆栈大小,那么就会导致堆栈溢出.

  二)进程的内存组织形式

  进程被分为三个区域:文本,数据和堆栈.

  1)文本区域:

  文本区域也叫做代码段,是由程序确定的,它包括代码(指令)和只读数据,该区域通常被标记为只读,任何对其写入的操作会导致段错误.

  2)数据区域:

  数据区域也叫做数据段,它包括已初始化和未初始化的数据,静态变量存储在这个区域中,它的大小可以用系统调用brk(2)来改变.

  3)堆栈区域:

  堆栈区域也叫堆栈段,它用于给局部变量动态分配空间,同样函数传递参数和函数返回值也要用到堆栈.

  堆栈也可向下增长(向内存低地址)也可以向上增长,这依赖于具体的实现,通常都是向下增长的,而SP(堆栈指针)也是指向堆栈的地址.

  4)内存的分配区域:

  根据前面所述,堆栈是位于最高虚拟地址附近,而数据段则位于堆栈段之后,是代码段.

  三)堆栈着色

  当两个线程或进程使用相同的堆栈虚拟地址时,它们会争夺同一个cache行,导致竞争和降级行为.

  堆栈着色的技术使每一个进程的基址都不相同,通过随机分配堆栈基址,多个进程会使用不同的cache行来避免.

  四)堆栈的限制

  堆栈空间的最大值是由setrlimit系统调用确定的,也可以通过bash内建的ulimit命令来设定和查看.

  例如:

  查看当前可使用的最大堆栈(以KB为单位)

  以下是代码片段:

  ulimit -s

  8192

  设定为最大的使用堆栈为15KB

  以下是代码片段:

  ulimit -s 15

  此时执行ls将会得到一个段错误.

  以下是代码片段:

  ls -l /etc/

  total 1040

  Segmentation fault

  通过用strace跟踪ls命令,将发现有如下的系统调用

  以下是代码片段:

  getrlimit(RLIMIT_STACK, {rlim_cur=15*1024, rlim_max=15*1024}) = 0

  说明当前可用的堆栈空间,已经不足以运行strace命令了.

  五)常驻内存和锁定内存

  常驻内存专指存储在RAM中的内存部分,不包括存储在交换区和未存储的进程的内存.

  锁定内存是常驻内存的子集,它指被进程明确地锁定到RAM的虚拟内存中,不能用于交换,并一直常驻于RAM中.

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号