今天是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();这个要程序员自己手动申请和释放。
(1)代码区,存放程序的代码,即程序中的各个函数代码块。
(2)全局数据区,存放程序的全局数据和静态数据。
(3)堆区,存放程序的动态数据。
(4)栈区,存放程序的局部数据,即各个函数中的数据。
---------------------------------------------------------------
栈区是普通的栈数据结构,遵循LIFO后进先出的规则,局部变量安排在那里是ASM时就规定的,这样可以在一个函数结束后平衡堆栈,操作简单,效率高
堆(动态区)在这里应当叫堆栈(不要和数据结构中的堆搞混)是程序在编译时产生的一块用于产生动态内存分配使用的块,操作比较栈要麻烦许多,在分配时要判断最优的地址(防止产生无用的内存碎片(由于屡次的NEW和DELETE产生的夹在两块使用中内存中的空余小内存(不容易被分配))),分配和回收时的效率比栈低多了
---------------------------------------------------------------
栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活;而栈是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率 >有一定降低。栈是系统数据结构,对于进程/线程是唯一的;堆是函数库内部数据结构,不一定唯一。不同堆分配的内存无法互相操作。栈空间分静态分配和动态分配两种。静态分配是编译器完成的,比如自动变量(auto)的分配。动态分配由alloca函数完成。栈的动态分配无需释放(是自动的),也就没有释放函数。为可移植>的程序起见,栈的动态分配操作是不被鼓励的!堆空间的分配总是动态的,虽然程序结束时所有的数据空间都会被释放回系统,但是精确的申请内存/ 释放内存匹>配是良好程序的基本要素。