|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
初学阶段只要把上课时候学习过的命令练熟就可以了.单靠学习各种命令而成为高手是不可能的。
历程XXX占用了几内存?这是个常常被问到,也常常被答错的成绩。Linux历程的内存分派是个对照庞大的话题,而Linux上的工具常常把这个成绩太过复杂化,因而引出很多曲解和狐疑。起首把ps,top这类工具抛弃,然后看这么一个复杂程序: [root@pczoupczou]#cat./prog.c
#include<stdio.h>
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#defineONEM(1024*1024)
intfunc()
{
chars[16*ONEM];
char*p;
p=malloc(32*ONEM);
pause();
return0;
}
intmain()
{
printf("pid:%d
",getpid());
func();
return0;
}
个中func()这个函数分派了32MB的内存,和16MB的仓库。
运转一下这个prog程序,prog会停在pause()的地位,看看ps怎样说:
USERPID%CPU%MEMVSZRSSTTYSTATSTARTTIMECOMMAND
root42380.00.052396352pts/0S21:290:00./prog
VSZ指的是历程内存空间的巨细,这里是52396KB;
RSS指的是驻留物理内存中的内存巨细,这里是352KB。
一样平常体系办理员晓得VSZ其实不代表历程真正用到的内存,由于有些空间会仅在页表中挂个名,也就是说只是假造存在着,只要真正用到的时分内核才会把假造页面和真实的物理页面映照起来。好比,prog.c顶用malloc()分派的32MB内存,因为程序中并没有效到这些内存,没有物理内存被分派,也就不该算到历程的帐上。
历程的内存利用情形对照庞大,这是由于:
历程所请求的内存纷歧定真正会被用到
真正用到了的内存也纷歧定是只要该历程本人在用(好比静态共享库)
以是酒足饭饱结帐的时分,饭店打出的帐单中常常毛病百出,不是计进了没上的菜,就是一个菜算了两份钱。而ps给出的就是如许的“懵懂”帐单,不足为据。
算分明帐的独一举措是把每一个菜都细心过一遍,看看有无上,有无反复。上面的帐单要分明多了:
Virtualmemory:52396KB
EffectiveVM:52120KB
Mapped:352KB
Effectivemapped:76.6KB
Soleuse:72KB
Perfilememoryuse
ld-2.3.4.so:VM94208B,M90112B,S8192B
prog:VM8192B,M8192B,S8192B
libc-2.3.4.so:VM1180KB,M221184B,S16384B
能够看出,固然假造地点空间是52396KB,实践映照(a.k.a.分派)的空间是352KB,这和ps给出的了局分歧。再看"EffectiveMapped"这个值,仅为76.6KB。这个值的盘算办法是:
无效的实践利用内存=该历程独有的内存+共享的内存A/共享A的历程数量+共享的内存B/共享B的历程数量+...
好比关于一个kde使用程序kontact,它用的Qt库的假造地点空间为7M,而实践映照的空间有4.5M,也就是说真正给Qt分派物理内存巨细为4.5M。假定有10个KDE使用正在运转,那末记到kontact帐上的就不该该是4.5M,而是A-A以后的0.45M。这么清算计帐固然其实不非常正确,但"EffectiveMapped"已足以申明历程所占用内存的实践巨细了。
OK,最初用这个办法给体系中一切历程都“结下帐”:
12下一页
功能实在太强了,在配合exec参数或者通过管道重定向到xargs命令和grep命令,可以完成非常复杂的操作,如果同样的操作用图形界面的工具来完成,恐怕要多花十几陪的时间。 |
|