Chinaunix首页 | 论坛 | 博客
  • 博客访问: 893683
  • 博文数量: 299
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2493
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-21 10:07
个人简介

Linux后台服务器编程。

文章分类

全部博文(299)

文章存档

2015年(2)

2014年(297)

分类: LINUX

2014-07-04 16:37:20

每一个进程都有自己的一个进程堆栈空间。在Linux界面执行一个执行码时,Shell进程会fork一个子进程,再调用exec系统调用在子进程中执行该执行码。

exec系统调用执行新程序时会把命令行参数和环境变量表传递给main函数,它们在整个进程堆栈空间中的位置如下图12-7所示。

 


    

        


    

12-7 进程堆栈空间图

下面是对图12-7进程堆栈空间各段的具体说明:

    代码段(文本段):保存程序的执行码。在进程并发时,代码段是共享的且只读的,在存储器中只需有一个副本。

    数据段:此段又称为初始化数据段,它包含了程序中已初始化的全局变量、全局静态变量、局部静态变量。

例如,函数外定义的变量并赋值:int  count=30 ;

此变量count存放在数据段中。

    bss段:通常此段又称为未初始化数据段,它包含了程序中未初始化的全局变量、全局静态变量、局部静态变量,程序执行前操作系统将此段初始化为0

例如,函数外定义的变量但没有赋值:long sum[1000] ;

此变量存放在bss段中。

    栈:程序执行前静态分配的内存空间,栈的大小可在编译时指定,Linux环境下默认为8M。栈段是存放程序执行时局部变量、函数调用信息、中断现场保留信息的空间。程序执行时,CPU堆栈段指针会在栈顶根据执行情况进行上下移动。

    堆:程序执行时,按照程序需要动态分配的内存空间。malloccallocrealloc函数分配的空间都在堆上分配。


申请后系统的响应  
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢  出。  
堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,  会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表  中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的  首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。  另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部  分重新放入空闲链表中。

申请大小的限制

  

栈:在

Windows

,

栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意

  

思是栈顶的地址和栈的最大容量是系统预先规定好的,在

WINDOWS

下,栈的大小是

2M

(也

  

的说是

1M

,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将

  

提示

overflow

。因此,能从栈获得的空间较小。

  

堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储

  

的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小

  

受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。


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