Chinaunix首页 | 论坛 | 博客
  • 博客访问: 229058
  • 博文数量: 40
  • 博客积分: 2025
  • 博客等级: 大尉
  • 技术积分: 531
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-25 17:47
文章分类

全部博文(40)

文章存档

2010年(8)

2009年(32)

我的朋友

分类: LINUX

2010-04-20 21:51:24

作者: good bai 

进程的内存布局见下图,这是转载来的图,我觉着比较形象的表示出了进程在内存的布局情况(引用地址:
) 
==================================================================== 

----------------- 
高地址 | | ---> 命令行参数和环境变量 (只读) 
----------------- 
| 栈 | 
|- - - - - - - -| 
| | | | 
| \ / | 
| | 
| | 
| / \ | 
| | | | 
|- - - - - - - -| 
| 堆 | 
|---------------| 
| 未初始化的变量| 
| (bss) | ---> 由 exec 初始化为零 
|---------------| 
| 初始化后的变量| \ 
|---------------| | 
| text(数据区)| | 由 exec 从程序中读取 
     | | / 
|---------------| 
低地址    | 代码区 | 
|---------------| 

==================================================================== 
内存分配分为三种方式: 
1 静态分配 
主要包括,全局变量,函数,和静态对象等(此应该对应与上图中的数据段???)。 

2 动态堆上分配 
主要是malloc方式分配,有程序员代码操作来实现,灵活性高,申请大小不受限制(可用范围内)。当有请求内存分配时,系统会以一定算法(比如教科书中讲的。。。),在可用内存记录链表中查找到合适可用内存块并分配给用户,同时更新记录链表的信息。这种方式分配的内存必需得手动释放,否则可能会导致内存泄漏。 
特点:相比栈上分配,速度要慢一些。 

3 临时栈上分配 
栈上存放函数调用的上下文数据信息:该函数的返回地址,某些寄存器的内容,将被首先存储到栈段。然后这个被调用的函数再为它的自动变量和临时变量在栈段上分配空间。这就是C如何实现函数的递归调用。每次一个递归函数调用其本身,一个新的栈框架(stack frame)就会被使用,这样这个新实例栈里的一组变量就不会和该函数的另一个实例栈里面的变量互相干扰。(我们常说的函数调用栈即是此,在函数调用时把当前的执行环境信息入栈,返回时从新取回信息以便可以继续执行),栈上数据遵守先进后出的规则,因为他是从高地址空间开始向低分配内存,而取数据则按正常进行。 
特点:分配速度快,系统自动回收,但一般大小有限,且过程程序员不可支配。 

附:不同线程在执行时拥有不同的栈空间,那么说线程拥有自己独立的栈空间了。

阅读(1839) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~