免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: snow_insky

对Linux堆内存释放的总结 [复制链接]

论坛徽章:
0
发表于 2006-01-05 11:40 |显示全部楼层
good job!@_@

论坛徽章:
0
发表于 2006-01-05 17:27 |显示全部楼层

用户进程栈空间的设置

最近看了一些文章,关系到用户栈的设置,顺便在这里发给大家!

目前用户态栈是放在3G空间的下面,默认的情况下是8M,我们可以通过一些方法来改变栈的位置。
如:
你写一个函数,在该函数中声明一个静态变量static stack[8M], 然后移动栈指针asm ("movl %0, %%esp\n" : : "a" (stack + sizeof(stack)));我们就得到了一个新的堆栈。

呵呵大家可以试试!

论坛徽章:
0
发表于 2006-01-06 14:32 |显示全部楼层
请教个问题, 我写了个程序,发现每次分配10K内存后,显示堆内存数量(VmData)增加8K或12K(cat /proc/pid/status ),12K可以理解,为什么有时候会是8K?而且8K和12K不是交错增加的,有时malloc 10K好几次,但都是增加8K。

论坛徽章:
0
发表于 2006-01-06 14:58 |显示全部楼层
10K,是2页半。物理分配按页。

12K, 3 PAGES
下次,分8K即可,加上上次空闲的半PAGE

原帖由 zhhhuang 于 2006-1-6 14:32 发表
请教个问题, 我写了个程序,发现每次分配10K内存后,显示堆内存数量(VmData)增加8K或12K(cat /proc/pid/status ),12K可以理解,为什么有时候会是8K?而且8K和12K不是交错增加的,有时malloc 10K好几次,但都 ...

论坛徽章:
0
发表于 2006-01-06 15:33 |显示全部楼层
有时malloc 10K好几次,但都是增加8K?

论坛徽章:
0
发表于 2006-01-06 15:44 |显示全部楼层
呵呵,这难道不是正常的吗? 思一克    已经说得很清楚了啊

物理页面是按照4K的页管理的,为了效率,我们的虚拟地址空间也是按照4K大小为单位的页进行管理的,你第一次分配10K,它应该会增加12K,然后你再分配10K的时候,由于有2K的空闲,它只需增加8K就能满足你的需求了啊!

干嘛,还不满意,认为内核亏待你了???呵呵,开玩笑!

论坛徽章:
0
发表于 2006-01-08 12:02 |显示全部楼层
如果在系统内存耗尽的情况下,GLIBC会不会对进程没有使用并且也没有归还系统的内存块进行操作?
我在服务器上面看到的情况是,系统内存一直消耗到剩余8M左右就不会在消耗了!但所有进程的内存使用量之和要小于在TOP中看到的被使用的内存总数,是不是楼主说的原因呀,那么到剩余8M以后会发生什么事情呀,期待中

论坛徽章:
0
发表于 2006-01-08 12:17 |显示全部楼层
原帖由 zhangjiakouzf 于 2006-1-8 12:02 发表
如果在系统内存耗尽的情况下,GLIBC会不会对进程没有使用并且也没有归还系统的内存块进行操作?
我在服务器上面看到的情况是,系统内存一直消耗到剩余8M左右就不会在消耗了!但所有进程的内存使用量之和要小于在TO ...


首先,由于linux用了cow技术,所以内存透支是允许存在的。
如果系统内存真正耗尽,下面要做的事就不是glibc能做的了。内核有一个OOM killer,在内存耗尽的时候会挑选一个进程杀死,来获得内存。不过现在的系统内存大多很大,所以OOM killer的作用不大。

论坛徽章:
0
发表于 2006-01-08 20:47 |显示全部楼层
原帖由 zhangjiakouzf 于 2006-1-8 12:02 发表
如果在系统内存耗尽的情况下,GLIBC会不会对进程没有使用并且也没有归还系统的内存块进行操作?
我在服务器上面看到的情况是,系统内存一直消耗到剩余8M左右就不会在消耗了!但所有进程的内存使用量之和要小于在TO ...


首先:要说明的是,你用top观察的结果是不准确的,因为有共享库的存在,所以你可能重复计算;
其次:glibc是不会帮忙系统处理内存紧张情况的,因为它也只不过是一个共享库而已,所不同的是,它是所有应用程序都需要的(当然,你也可以通过一定的方式,来让你的应用程序不使用glibc)
再次:你所看到的进程消耗的内存小于top的观察值是因为,你需要加上buffer和cache的值,才能基本等于top中所观察到的内存使用量。


不知道这些解释,你能不能明白,如果不行,我们再继续,呵呵!

下次我会说明free命令的内容的含义!

论坛徽章:
0
发表于 2006-01-08 20:56 |显示全部楼层
还有一点忘记说了,你的系统空闲内存停留在8M左右,是因为,你的buffer和cache已经达到了一定的值,不需要再增加了,所以你会发现它停在那里。

还有,你执行如下命令: cat /proc/sys/vm/kswapd,你会看到你的系统保留的空闲内存的阀值,具体涵义,你可以搜索一下它的涵义。

richardhesidu :并不是如你所说,所有的系统都有很多内存,你没有考虑到嵌入式系统的应用。我们的产品实现很多功能,但只有32M内存,呵呵,难啊!我们正在做内存优化,所以做了好多工作,并会逐步拿出来和大家分享。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP