进程的内存空间

1. 文字常量区是在code段中还是data段中?

根据下面的分析,文字常量区是在包含code的text中。

2. 程序文件的大小是否包括BSS段?

在windows中,不包括。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

转载:http://www.perfgeeks.com/?p=770

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Linux内存点滴 用户进程内存空间


经常使用top命令了解进程信息,其中包括内存方面的信息。命令top帮助文档是这么解释各个字段的。
VIRT , Virtual Image (kb)
RES, Resident size (kb)
SHR, Shared Mem size (kb)
%MEM, Memory usage(kb)
SWAP, Swapped size (kb)
CODE, Code size (kb)
DATA, Data+Stack size (kb)
nFLT, Page Fault count
nDRT, Dirty Pages count
尽管有注释,但依然感觉有些晦涩,不知所指何意?

进程内存空间

正在运行的程序,叫进程。每个进程都有完全属于自己的,独立的,不被干扰的内存空间。此空间,被分成几个段(Segment),分别是Text, Data, BSS, Heap, Stack。用户进程内存空间,也是系统内核分配给该进程的VM(虚拟内存),但并不表示这个进程占用了这么多的RAM(物理内存)。这个空间有多大?命令top输出的VIRT值告诉了我们各个进程内存空间的大小(进程内存空间随着程序的执行会增大或者缩小)。你还可以通过/proc//maps,或者pmap –d 了解某个进程内存空间都分布,比如:

#cat /proc/1449/maps
…
0012e000-002a4000 r-xp 00000000 08:07 3539877    /lib/i386-linux-gnu/libc-2.13.so
002a4000-002a6000 r--p 00176000 08:07 3539877    /lib/i386-linux-gnu/libc-2.13.so
002a6000-002a7000 rw-p 00178000 08:07 3539877   /lib/i386-linux-gnu/libc-2.13.so
002a7000-002aa000 rw-p 00000000 00:00 0
…
08048000-0875b000 r-xp 00000000 08:07 4072287    /usr/local/mysql/libexec/mysqld
0875b000-0875d000 r--p 00712000 08:07 4072287    /usr/local/mysql/libexec/mysqld
0875d000-087aa000 rw-p 00714000 08:07 4072287   /usr/local/mysql/libexec/mysqld
…
PS:线性地址,访问权限, offset, 设备号,inode,映射文件

对于上图,补充:在windows中,可执行文件*.exe的大小不包括bss。bss是在启动执行文件之后,由系统初始化为零。


VM分配与释放

“内存总是被进程占用”,这句话换过来可以这么理解:进程总是需要内存。当fork()或者exec()一个进程的时候,系统内核就会分配一定量的VM给进程,作为进程的内存空间。

进程的内存空间大小:Data段的已定义的全局变量、静态变量 + BSS段 + Text段中的字符直接量 + 程序本身的内存映像 + Stack段的局部变量。当然,还可以通过malloc()等函数动态分配内存,向上扩大heap。

动态分配与静态分配,二者最大的区别在于:

1. 前者直到Run-Time的时候才执行动态分配;而后者在compile-time的时候,就已经决定好了分配多少空间Text+Data+BSS+Stack。

2.通过malloc()动态分配的内存,需要程序员手工调用free()释放内存,否则容易导致内存泄露,而静态分配的内存则在进程执行结束后系统释放(Text, Data), 但Stack段中的数据很短暂,函数退出立即被销毁。

我们使用几个示例小程序,加深理解

/* @filename: example-2.c */
#include <stdio.h>
 
int main(int argc, char *argv[])
{
    char arr[] = "hello world";	/* Stack段,rw--- */
    char *p = "hello world";		/* Text段,字符串直接量, r-x--  */
    arr[1] = 'l';
    *(++p) = 'l';	/* 出错了,Text段不能write */
    return 0;
}
PS:变量p,它在Stack段,但它所指的”hello world”是一个字符串直接量,放在Text段。

更多内容可以看以下网页

转载:http://www.perfgeeks.com/?p=770

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值