linux程序内存空间基本布局

    

Linux C语言程序典型的内存布局如下:




程序内存布局主要组成部分:

 

(1)代码段(.text segment):代码段通常是用来存放程序执行代码的一块内存区域,该区域的大小在程序运行前就已经确定,而且一般属于只读的,有些架构是可写的,允许修改程序。程序段是程序代码在内存中的映射,一个程序可以在内存中有多个副本。

(2)初始化的数据段(.data segment):通常拿来存储静态变量和全局变量。该数据段在exec函数启动该程序时从源文件中读入,属于静态内存分配。

(3)未初始化的数据段(.bss segment:通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。Bssblock started by symbol的简称。

(4)堆(heap:堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减,当进程调用malloc/free等函数分配内存时,新分配的内存就被动态添加到堆上,或释放内存从堆中被剔除。

(5)栈(stack:栈主要存放着一般的局部变量(不包括静态局部变量),还有函数调用时传入的参数及返回值。栈具有先进后出的特点,一般用栈来保存/恢复调用现场,而动态动态内存分配,需要由程序员去分配、释放。

 

堆和栈的主要区别:

 

从申请的方式来看,栈由系统自动分配,堆需要程序员自己去申请,并且需要指明申请的大小。

申请后的系统响应不同。

栈只需要剩余空间大于所申请的空间,系统将为程序提供内存,否则将报异常,提示栈溢出。

堆首先会知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历链表,寻找第一个空间中大于所申请的堆节点,然后将该节点从空闲链表中删除,并将该节点的空间分配给程序。其次,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样代码中delete语句或者free才能正确释放内存空间。最后,由于找到的堆节点的大小不一定正好等于申请的大小,系统会自动地将多余的那部分重新放入空闲链表中去。

 

申请大小的限制不同。

 

栈是向低地址扩展的,是一块连续的内存区域,顶的地址和栈的最大容量是系统预先设置好的。Linux下的栈大小是个常数,如果申请的空间超过栈的所剩余的空间时,就是报overflow,栈溢出。因此,栈的大小是有限的,用ulimit -a可以看到栈的大小限制。如下,栈的大小为1024010M

-bash-3.2$ ulimit -a

core file size          (blocks, -c) 0

data seg size           (kbytes, -d) unlimited

scheduling priority             (-e) 0

file size               (blocks, -f) unlimited

pending signals                 (-i) 532480

max locked memory       (kbytes, -l) 32

max memory size         (kbytes, -m) unlimited

open files                      (-n) 1024

pipe size            (512 bytes, -p) 8

POSIX message queues     (bytes, -q) 819200

real-time priority              (-r) 0

stack size              (kbytes, -s) 10240

cpu time               (seconds, -t) unlimited

max user processes              (-u) 532480

virtual memory          (kbytes, -v) unlimited

file locks                      (-x) unlimited

-bash-3.2$ 

 

 

  当然,可以通过ulimit -s修改栈的大小。

 

堆的地址是向高地址扩展的,是不连续的内存区域,因为系统是用链表来存储空闲内存地址的,自然是不连续的,而且链表的遍历方向是由低到高的,堆的大小受限于计算机系统中有效的虚拟内存,因此,堆可以申请的内存比栈多的多。

 

4  从申请效率来看。栈由系统自动分配,速度较快,但程序员无法控制,堆由new或者malloc来分配,速度较慢,也容易产生内存碎片,由程序员控制。









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值