linux进程的堆栈空间_代码段(指令,只读)、数据段(静态变量,全局变量)、堆栈段(局部变量)、栈【转】
转自:http://blog.csdn.net/gongweijiao/article/details/8207333
原文参见:http://blog.163.com/xychenbaihu@yeah/blog/static/132229655201215115845553/
一)概述
.堆栈是一个用户空间的内存区域,进程使用堆栈作为临时存储。
.堆栈中存放的是函数中的局部变量,在函数的生命周期中可以将变量压入堆栈,编译器需要确保堆栈指针在函数退出前恢复到初始位置,也就是说,内存是自动分配和释放的,C/C++把存储在堆栈中的局部变量当作automatic存储,并使用auto关键字,这是局部变量的默认存储方式,所以现在没有人用auto关键词.
.与动态存储(auto)相对映的静态存储(static),也就是用static定义的局部变量,它不用堆栈来存储,而是使用数据段来存储(也就是说它的生命周期在整个程序运行期间)。
.堆栈的基地址位于用户空间的最高虚拟地址附近,并从那里向下延伸。
.一个进程开始时,堆栈的最大值就不能改变,如果占用的空间超过了堆栈大小,那么就会导致堆栈溢出。
二)进程的内存组织形式
进程被分为三个区域:文本、数据和堆栈。
1)文本区域:
文本区域也叫做代码段,是由程序确定的,
它包括代码(指令)和只读数据,该区域通常被标记为只读,任何对其写入的操作会导致段错误.
2)数据区域(静态内存分配(static)):
数据区域也叫做数据段,
它包括已初始化和未初始化的数据,静态变量存储在这个区域中,它的大小可以用系统调用brk(2)来改变。
详细了解数据区域:
分成初始化为非零的数据区、BSS和堆(Heap)三个区域。
初始化非零数据区域一般存放静态非零数据和全局的非零数据,属于静态内存分配(全局变量,static修饰的变量);
BSS(Block Started by Symbol)区域(都初始化为0了)一般存放未初始化的全局数据(默认值为0)和未初始化的静态数据(默认值为0),属于静态内存分配(全局变量、static修饰的变量);
堆区域一般存放运行时动态分配的内存空间,其大小不固定,可动态扩张或缩减。当调用malloc等函数分配内存时,新分配的内存被动态添加到堆上;当调用free等函数释放内存时,被释放内存从堆中被剔除。
代码段和数据段之间有明确的分隔,
但是数据段和堆栈段之间没有,而且栈是向下增长,堆是向上增长的,因此理论上堆和栈会“增长到一起”,操作系统的内存管理功能需要防止这样的错误发生。
3)堆栈区域(动态内存分配auto,默认,所以不用关键字auto):
堆栈区域也叫堆栈段,
它用于给局部变量动态分配空间,同样函数传递参数和函数返回值也要用到堆栈.
堆栈也可向下增长(向内存低地址)也可以向上增长,这依赖于具体的实现,
通常都是向下增长的,而SP(堆栈指针)也是指向堆栈的最后地址.
4)内存的分配区域:
根据前面所述,堆栈是位于最高虚拟地址附近,而数据段则位于堆栈段之后,最后是代码段。
也就是:
低地址 代码段 或 高地址 堆栈段
数据段 数据段
高地址 堆栈段 低地址 代码段
三)堆栈着色
当两个线程或进程使用相同的堆栈虚拟地址时,它们会争夺同一个cache行,导致竞争和降级行为.
堆栈着色的技术使每一个进程的基址都不相同,通过随机分配堆栈基址,多个进程会使用不同的cache行来避免.
四)堆栈的限制
堆栈空间的最大值是由setrlimit系统调用确定的,也可以通过bash内建的ulimit命令来设定和查看.
例如:
查看当前可使用的最大堆栈(以KB为单位)
ulimit -s
8192 //栈的大小默认是8M
设定为最大的使用堆栈为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中.
linux进程的堆栈空间_代码段(指令,只读)、数据段(静态变量,全局变量)、堆栈段(局部变量)、栈【转】的更多相关文章
- 【原创】xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(三)--实时与非实时数据交互
版权声明:本文为本文为博主原创文章,转载请注明出处.如有问题,欢迎指正.博客地址:https://www.cnblogs.com/wsg1100/ 目录 1.概述 1.概述 [原创]实时IPC概述 [ ...
- java中堆栈(stack)和堆(heap)(还在问静态变量放哪里,局部变量放哪里,静态区在哪里.....进来)
(1)内存分配的策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编 译时就可以给 ...
- 3.2 java中堆栈(stack)和堆(heap)(还在问静态变量放哪里,局部变量放哪里,静态区在哪里.....进来)
(1)内存分配的策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编 译时就可以给 ...
- 构造代码块、this关键字、静态变量、静态代码块、主函数
一.构造代码块: 作用:给对象进行初始化. 特点:对象一经运行就执行(与变量声明时赋初值同级别,此处注意 非法前向引用) 优先于构造函数的执行. 与构造函数的区别: 构造代码块是给所有对象统一初始化. ...
- java子父类初始化顺序 (1)父类静态代码块(2)父类静态变量初始化(3)子类静态代码块(4)子类静态变量初始化(5)main(6)有对象开辟空间都为0(7)父类显示初始化(8)父类构造(9)子类显示初始化(10)子类构造
标题 静态代码块与静态成员变量还要看代码的先后顺序 看程序,说出结果 结果为: x=0 看程序,说出结果 结果如下: 补充 : 静态代码块:static{ } 在JVM加载时即执行,先于主方法执行,用 ...
- linux 进程创建clone、fork与vfork
目录: 1.clone.fork与vfork介绍 2.fork说明 3.vfork说明 4.clone说明5.fork,vfork,clone的区别 内容: 1.clone.fork与vfork介绍 ...
- Linux 进程必知必会
上一篇文章只是简单的描述了一下 Linux 基本概念,通过几个例子来说明 Linux 基本应用程序,然后以 Linux 基本内核构造来结尾.那么本篇文章我们就深入理解一下 Linux 内核来理解 Li ...
- linux学习之八---Linux进程基础知识
一.linux进程 linux是一个多用户多任务的操作系统. 多用户是指多个用户能够在同一时间使用计算机. 多任务是指linux能够同一时候运行几个任务. 进程简单来说就是执行中的程序,Linux系统 ...
- 【原创】访问Linux进程文件表导致系统异常复位的排查记录
前提知识: Linux内核.Linux 进程和文件数据结构.vmcore解析.汇编语言 问题背景: 这个问题出自项目的一个安全模块,主要功能是确定某进程是否有权限访问其正在访问的文件. 实现功能时,需 ...
随机推荐
- svn使用svnsync实现双机热备
前提条件: 主:10.11.100.205从:10.11.100.50 源目录:http://10.11.100.205/svn/rep-ops目标目录:http://10.11.100.50/svn ...
- Power-BI 关于2016年7月份深圳一手房房价分析报表 腾讯课堂开课啦
上周我们的公开课讲了全国房地产投资开发的情况,通过对时间.区域等多维度的分析,透析了全国房地产开发的投资情况.这周呢,我们就全国一线城市的房价,选取了深圳作为分析对象,对深圳一手房房价进行一 ...
- shell软件工具设计的原则_转
随着时间的流逝,人们开发出了一套设计与编写软件工具的原则.在本书用来解决问题的程序中,你将会看到这些原则的应用示例.好的软件工具应该具备下列特点:一次做好一件事在很多方面,这都是最重要的原则.若程序只 ...
- Java- 基本封装
package test.studet_manager; public class Student { static int num = 100; // 编号-->唯一的 private int ...
- ios之无限图片轮播器的实现
首先实现思路:整个collectionView中只有2个cell.中间始终显示第二个cell. 滚动:向前滚动当前cell的脚标为0,向后滚动当前的cell脚标为2.利用当前cell的脚标减去1,得到 ...
- Fix the “No Private Key” Error Message
This article will show you how to correct the “No Private Key” error message in Windows Internet Inf ...
- Python xml
第一部分:读 ######## ## # -*- coding:utf-8 -*- """ * User: not me * Date: 11-11-9 * Time: ...
- 学习OpenCV——OpenMP
转自:http://www.cnblogs.com/yangyangcv/archive/2012/03/23/2413335.html openMP的一点使用经验 最近在看多核编程.简单来说,由 ...
- 推荐几个sql server牛人的博客
Aaron Bertrand http://sqlblog.com/blogs/aaron_bertrand/ Brent Ozar www.brentozar.com/ Buck Woody htt ...
- Postgres数据库基本介绍
最近一直在做一个和PostgreSQL数据库相关的项目,把自己在这个过程中学习的知识记录下来.关于PostgreSQL数据库网上已经有太多的相关介绍了,为了博文的系统性还是先看一下维基百科对Postg ...