linux进程的内存分配内存空间,【十问Linux虚拟内存管理】第三问:malloc 分配多大的内存,就占用多大的物理内存空间吗?...

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

第三问来啦!

3

malloc分配多大的内存,

就占用多大的物理内存空间吗?

我们知道, malloc 分配的的内存是虚拟地址空间,而虚拟地址空间和物理地址空间使用进程页表进行映射,那么分配了空间就是占用物理内存空间了吗?

首先,进程使用多少内存可通过 ps aux 命令 查看,其中关键的两信息(第五、六列)为:

1. VSZ , virtual memory size ,表示进程总共使用的虚拟地址空间大小,包括进程地址空间的代码段、数据段、堆、文件映射区域、栈、内核空间等所有虚拟地址使用的总和,单位是 K

2. RSS , resident set size ,表示进程实际使用的物理内存空间, RSS 总小于 VSZ。

可通过一个例子说明这个问题:

0818b9ca8b590ca3270a3433284dd417.png

该代码扩展了上一个例子 print_info 能力,处理打印变量信息,同时通过 ps aux 命令获得当前进程的 VSZ 和 RSS 值。并且程序 malloc 一块内存后,会 memset 内存的若干 k 内容。

执行结果为:

Address of non_set_var(32k) 0x502010,  now heap top is 0x52b000

mysql    12183  0.0  0.0   2692   452 pts/3    S+   20:29   0:00 ./test_vsz

Address of set_1k_var(64k) 0x50a020,  now heap top is 0x52b000

mysql    12183  0.0  0.0   2692   456 pts/3    S+   20:29   0:00 ./test_vsz

Address of set_5k_var(127k) 0x51a030,  now heap top is 0x55a000

mysql    12183  0.0  0.0   2880   464 pts/3    S+   20:29   0:00 ./test_vsz

Address of set_7k_var(64k) 0x539c40,  now heap top is 0x55a000

mysql    12183  0.0  0.0   2880   472 pts/3    S+   20:29   0:00 ./test_vsz

由以上结果知:

1. VSZ 并不是每次 malloc 后都增长,是与上一节说的堆顶没发生变化有关,因为可重用堆顶内剩余的空间,这样的 malloc 是很轻量快速的。

2. 但如果 VSZ 发生变化,基本与分配内存量相当,因为 VSZ 是计算虚拟地址空间总大小。

3. RSS 的增量很少,是因为 malloc 分配的内存并不就马上分配实际存储空间,只有第一次使用,如第一次 memset 后才会分配。

4. 由于每个物理内存页面大小是 4k ,不管 memset 其中的 1k 还是 5k 、 7k ,实际占用物理内存总是 4k 的倍数。所以 RSS 的增量总是 4k 的倍数。

5. 因此,不是 malloc 后就马上占用实际内存,而是第一次使用时发现虚存对应的物理页面未分配,产生缺页中断,才真正分配物理页面,同时更新进程页面的映射关系。这也是 Linux 虚拟内存管理的核心概念之一。

往期回顾

0818b9ca8b590ca3270a3433284dd417.png

看到这里的小伙伴最优秀

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

文章来源:网络

原文链接:http://blog.csdn.net/tengxy_

cloud/article/details/53067396

如有侵权,及时通知,我们会尽快处理

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值