Linux内存计数详解

     发现linux的内存管理计数上讲的东西和windows讲的有很大差异。下面具体列举下几种计数、查看方式和含义。
  total mem,可以用top free查看出来。
  free mem,可以用top free vmstat查看出来。
  used mem,可以用top free查看出来.
  buffer mem,可以用top free vmstat查看出来。
  shared mem,可以用free查看出来。
  swap mem,可以用top查看出来。
  swap used,可以用top vmstat查看出来。
  cached mem,可以用top free vmstat查看出来。
  active mem,可以用free vmstat -a查看出来,即cached used。
  inactive mem,可以用free vmstat -a查看出来,即cached free。
  其中total mem是除去系统外的可用内存,系统大约占1M多。然后分配给free mem和used mem。used mem又包括了内核表使用(例如GDT),程序使用,buffer,cached。所以
  cached mem=active mem+inactive mem
  total mem=free mem+used mem
  used mem=内核表使用+程序使用物理内存+buffer mem+cached mem
  略去内核表使用,这个式子可以变形成这样:
  程序使用总内存=swap used+程序使用物理内存
  =swap used+used mem-buffer mem-cached mem
  =total mem-free mem+swap used-buffer mem-cached mem
  根据所有系统内存管理的恒等式:
  程序使用总内存+一次可申请内存=total mem+swap used
  我们可以计算出:
  一次可申请内存=free mem+buffer mem+cached mem(事实上要略小于这个值)
  程序使用的部分swap出去部分,占用total部分,剩下的就是一次可以申请的最大值。多次申请造成这个值太小就继续向swap里面交换。
  首先解释buffer和cached区别。通俗的讲,buffer中放的是对象数据结构,而cached中放的是无结构的块数据。cached可以缓冲任何标准的块设备,而不用管是什么东西。其中涉及写通和写回的概念,大家自己看去吧。
  然后是程序使用物理内存的概念。程序的总内存等于交换出去的部分加上程序使用物理内存。而程序使用的总内存和各个程序的内存占用是什么关系呢?这个又要涉及共用页面的问题。
  windows 中也有类似概念,如果两个页面内容相同,那么在内存中保留一份就可以了。这个是动态链接库/动态共享库的理论基础。所以所有进程的shared mem只有一份copy。进程使用的Data+Stack是数据空间,code是代码空间,两者和减去shared mem是私有空间,也就是俗称的进程内存占用。将所有内存占用求和加上shared mem的和,就得到了程序的总内存。
  Linux 的cached和windows的一个很大差异在于,windows的磁盘缓存是读写缓存队列。写入操作和预读取操作在队列中排序。完了就释放了,主要用于平缓读写瓶颈。读取预测机制才是增加命中的重头。linux的cached读写完了一直不释放,直到内存不足再释放。释放的速度来说应该是没有问题的,毕竟数据已经写入了,只差一个数据结构标志位修改而已。这种机制主要对应高命中率,如果重复使用相同文件(应该说是相同块设备的相同offset)。那么缓存机制永远只要读一次,写入次数也远远小于应当的写入次数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值