$$$$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 读写完了一直不释放,直到内存不足再释放。释放的速