ksm合并的一般是用户分配的内存(能不能用在内核页面我还不清楚)关键的是它只能合并私有的匿名页面。想了解更多的有关页面的分类可以查看man mmap如果想让自己分配的頁面可以被ksm优化,那就必须显示声明出来方法是使用madvise接口,一般是:madvise(addr, length, MADV_MERGEABLE); addr是内存地址length是长度,MADV_MERGEABLE就是表示要让内存可以被ksm优化声明之后,內核就会把这段内存加入到ksm的扫描列表里面
我们重点来看看使用madvise之后内核对内存的检查,这样我们就能更深入地知道ksm的适用范围
真正將内存加入ksm扫描列表的是__ksm_enter,在此之前有很长的检查代码从检查代码里我们可以看到,对于共享的或io或是大页内存将不做进一步处理的
其实从man madvise中我们可以得到更明确的说明:
这给我们一个比较明确的提示,一旦你分配的内存是共享的或者是大页ksm就跟你无缘了。