您的位置:首页 > 其它

内存管理和使用分配

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函数完成。栈的动态分配无需释放(是自动的),也就没有释放函数。为可移植>的程序起见,栈的动态分配操作是不被鼓励的!堆空间的分配总是动态的,虽然程序结束时所有的数据空间都会被释放回系统,但是精确的申请内存/ 释放内存匹>配是良好程序的基本要素。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: