内存管理和使用分配
2016-02-03 08:55
330 查看
今天是16年2月28号,快过年了,今天闲来无事开了下内核方面的代码,以及一些脚本,突然很想弄懂内存是怎么管理的,怎么分区的。
这里我凭自己的理解做了下笔记。
应用程序主要分为三个段,data,text,bss
应用程序未运行的静态状态下: text(存放用户代码) ,bss ,data
应用程序在运行状态下:堆,栈,text,bss,data;
堆和栈只有在应用程序在运行状态下才存在。
应用程序的内存主要分为两个部分: 1.存放数据的数据段 2.存放代码的代码段
在Linux 系统下数据段又增加了全局初始化数据区,包含程序中被明确定义的全局变量,静态变量,和常量。
int a= 10(全局静态变量)
static int pf=100;(局部静态变量)
例如像 int i;存放在Bss区(未初始变量区)程序编译后未初始的变量会由内核初始化为0或NULL;
栈:是一个由编译器分配释放的区域,用于存放函数的参数和局部变量。当调用函数时,被调用的函数的参数和返回值会被分配到内存分配的栈区,
当被调用的函数返回时,在栈区的参数返回值,自动变量,以及临时变量会被释放。这也是很好的解释了C语言函数参数如果不是指针的话,函数返回的时候
用户是无法得到其真实的值。(栈先进后出)
堆:一般位于栈和Bss之间,用来动态分配内存,一般由程序员管理;程序员利用操作系统提供的分配和释放函数使用堆区的内存,
内存管理函数malloc(),free();这个要程序员自己手动申请和释放。
程序的内存区域
并不是所有的变量时时刻刻都是可知的。一些变量在整个程序中都是可见的,它们称为全局变量。一些变量只能在一个函数中可知,称为局部变量。要了解变量的这些属性,应先弄清程序在内存中的分布区域,见图5-2。
程序在内存中的区域
一个程序将操作系统分配给其运行的内存块分为4个区域:
(1)代码区,存放程序的代码,即程序中的各个函数代码块。
(2)全局数据区,存放程序的全局数据和静态数据。
(3)堆区,存放程序的动态数据。
(4)栈区,存放程序的局部数据,即各个函数中的数据。
---------------------------------------------------------------
栈区是普通的栈数据结构,遵循LIFO后进先出的规则,局部变量安排在那里是ASM时就规定的,这样可以在一个函数结束后平衡堆栈,操作简单,效率高
堆(动态区)在这里应当叫堆栈(不要和数据结构中的堆搞混)是程序在编译时产生的一块用于产生动态内存分配使用的块,操作比较栈要麻烦许多,在分配时要判断最优的地址(防止产生无用的内存碎片(由于屡次的NEW和DELETE产生的夹在两块使用中内存中的空余小内存(不容易被分配))),分配和回收时的效率比栈低多了
---------------------------------------------------------------
栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活;而栈是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率 >有一定降低。栈是系统数据结构,对于进程/线程是唯一的;堆是函数库内部数据结构,不一定唯一。不同堆分配的内存无法互相操作。栈空间分静态分配和动态分配两种。静态分配是编译器完成的,比如自动变量(auto)的分配。动态分配由alloca函数完成。栈的动态分配无需释放(是自动的),也就没有释放函数。为可移植>的程序起见,栈的动态分配操作是不被鼓励的!堆空间的分配总是动态的,虽然程序结束时所有的数据空间都会被释放回系统,但是精确的申请内存/ 释放内存匹>配是良好程序的基本要素。
这里我凭自己的理解做了下笔记。
应用程序主要分为三个段,data,text,bss
应用程序未运行的静态状态下: text(存放用户代码) ,bss ,data
应用程序在运行状态下:堆,栈,text,bss,data;
堆和栈只有在应用程序在运行状态下才存在。
应用程序的内存主要分为两个部分: 1.存放数据的数据段 2.存放代码的代码段
在Linux 系统下数据段又增加了全局初始化数据区,包含程序中被明确定义的全局变量,静态变量,和常量。
int a= 10(全局静态变量)
static int pf=100;(局部静态变量)
例如像 int i;存放在Bss区(未初始变量区)程序编译后未初始的变量会由内核初始化为0或NULL;
栈:是一个由编译器分配释放的区域,用于存放函数的参数和局部变量。当调用函数时,被调用的函数的参数和返回值会被分配到内存分配的栈区,
当被调用的函数返回时,在栈区的参数返回值,自动变量,以及临时变量会被释放。这也是很好的解释了C语言函数参数如果不是指针的话,函数返回的时候
用户是无法得到其真实的值。(栈先进后出)
堆:一般位于栈和Bss之间,用来动态分配内存,一般由程序员管理;程序员利用操作系统提供的分配和释放函数使用堆区的内存,
内存管理函数malloc(),free();这个要程序员自己手动申请和释放。
程序的内存区域
并不是所有的变量时时刻刻都是可知的。一些变量在整个程序中都是可见的,它们称为全局变量。一些变量只能在一个函数中可知,称为局部变量。要了解变量的这些属性,应先弄清程序在内存中的分布区域,见图5-2。
程序在内存中的区域
一个程序将操作系统分配给其运行的内存块分为4个区域:
(1)代码区,存放程序的代码,即程序中的各个函数代码块。
(2)全局数据区,存放程序的全局数据和静态数据。
(3)堆区,存放程序的动态数据。
(4)栈区,存放程序的局部数据,即各个函数中的数据。
---------------------------------------------------------------
栈区是普通的栈数据结构,遵循LIFO后进先出的规则,局部变量安排在那里是ASM时就规定的,这样可以在一个函数结束后平衡堆栈,操作简单,效率高
堆(动态区)在这里应当叫堆栈(不要和数据结构中的堆搞混)是程序在编译时产生的一块用于产生动态内存分配使用的块,操作比较栈要麻烦许多,在分配时要判断最优的地址(防止产生无用的内存碎片(由于屡次的NEW和DELETE产生的夹在两块使用中内存中的空余小内存(不容易被分配))),分配和回收时的效率比栈低多了
---------------------------------------------------------------
栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活;而栈是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率 >有一定降低。栈是系统数据结构,对于进程/线程是唯一的;堆是函数库内部数据结构,不一定唯一。不同堆分配的内存无法互相操作。栈空间分静态分配和动态分配两种。静态分配是编译器完成的,比如自动变量(auto)的分配。动态分配由alloca函数完成。栈的动态分配无需释放(是自动的),也就没有释放函数。为可移植>的程序起见,栈的动态分配操作是不被鼓励的!堆空间的分配总是动态的,虽然程序结束时所有的数据空间都会被释放回系统,但是精确的申请内存/ 释放内存匹>配是良好程序的基本要素。
相关文章推荐
- 10.1 标准用法
- 安装XShell 5出现msvcp110.dll错误
- Errors running builder 'DeploymentBuilder' on project '工程名'
- 9.11 子查询因子化
- 9.10.6 索引
- android: 发送自定义广播
- javascript实现在网页中运行本地程序的方法
- 9.10.3 物化视图
- 【点分治】BZOJ 1468:Tree
- 对phpexcel的若干补充
- [.net 面向对象程序设计进阶] (23) 团队开发利器(二)优秀的版本控制工具SVN(上)
- 9.10.2 谓语前推
- javascript document.compatMode
- Elasticsearch
- 三级折叠菜单和二级折叠菜单....无限级树形菜单
- 9.9 空值
- 9.8 查找表
- Java结构型设计模式中的适配器模式与桥接模式解析
- 9.7 迭代
- android: 接收系统广播