Linux内存管理之slab机制(概述)

通过前面所有代码的分析和总结,已经把各个部分熟悉了一遍,在此对Linux内核中slab机制做最后的总结。

伙伴系统算法采用页作为基本内存区,这适合于大块内存的请求。对于小内存区的申请,比如说几十或几百个字节,我们用slab机制。

相关阅读:与

[cpp]

其中,kmalloc使用的对象按照大小分属不同的cache,32、64、128、……,每种大小对应两个cache节点,一个用于DMA,一个用于普通分配。通过kmalloc分配的对象叫作通用数据对象。

可见通用数据cache是按照大小进行划分的,结构不同的对象,只要大小在同一个级别内,它们就会在同一个generalcache中。专用cache指系统为特定结构创建的对象,比如structfile,此类cache中的对象来源于同一个结构。

2,slab对象管理器

Slab结构如下

[cpp]

关于slab管理对象的整体框架以及slab管理对象与对象、页面之间的联系在前面的slab创建一文中已经总结的很清楚了。

3,slab着色

CPU访问内存时使用哪个cacheline是通过低地址的若干位确定的,比如cacheline大小为32,那么是从bit5开始的若干位。因此相距很远的内存地址,如果这些位的地址相同,,还是会被映射到同一个cacheline。Slabcache中存放的是相同大小的对象,如果没有着色区,那么同一个cache内,不同slab中具有相同slab内部偏移的对象,其低地址的若干位是相同的,映射到同一个cacheline。如图所示。

如此一来,访问cacheline冲突的对象时,就会出现cachemiss,不停的在cacheline和内存之间来回切换,与此同时,其他的cacheline可能无所事事,严重影响了cache的效率。解决这一问题的方法是通过着色区使对象的slab内偏移各不相同,从而避免cacheline冲突。

着色貌似很好的解决了问题,实质不然,当slab数目不多时,着色工作的很好,当slab数目很多时,着色发生了循环,仍然存在cacheline冲突的问题。

“过去酒逢知已千杯少,现在酒逢千杯知已少”。

Linux内存管理之slab机制(概述)

相关文章:

你感兴趣的文章:

标签云: