Slab之着色

1. 未着色的slab

1.1 cache特性

cache 示意图
图片来源于:
计算机缓存Cache以及Cache Line详解

如果 s bits也就是index,一样的话,有可能在一个cache line。
cache图2
说明:红色框就是index数据位,block 0和block 1中000的index都是指向0行的cache line。

图片来源于:
cache结构与原理

1.2 未着色的slab

slab1
如果未着色:
slab的第i个obj地址=slab->s_mem+0osize=slab->s_mem+iosize

这样:
slab1的第i个obj地址=slab1->s_mem+ i * osize
slab2的第i个obj地址=slab2->s_mem+ i * osize

如果是内部slab则,
slab1->s_mem: 物理页框地址(低12位为0)+slab及对象描述符大小(dsize)
slab2->s_mem是物理页框地址(低12位为0)+slab及对象描述符大小(dsize)
说明:
正常,slab及对象描述符大小,小于4K,这样slab1->s_mem+i * osize和slab2->s_mem+i * osize低12位一样;也就是slab1的第i个obj地址和slab2的第i个obj的低12位一样。

如果是外部slab则,
slab1->s_mem是物理页框地址(低12位为0)+slab及对象描述符大小(dsize=0)
slab2->s_mem是物理页框地址(低12位为0)+slab及对象描述符大小(dsize=0)
说明:
这样slab1->s_mem+iosize和slab2->s_mem+iosize低12位一样;也就是slab1的第i个obj地址和slab2的第i个obj的低12位一样。

说明:
slab1的第i个obj地址和slab2的第i个obj的低12位一样。

1.3 总结

slab1的第i个obj地址和slab2的第i个obj的低12位一样;如果 cache机制的index在低12位;这样slab1的第i个obj和slab2的第i个obj指向同一个cache line。
这样有很可能导致不同SLAB中相同对象号的对象放入CPU硬件高速缓存时会处于同一行,当我们交替操作这两个对象时,CPU的cache就会交替换入换出,效率就非常差。

2. 怎么着色 1

着色方法:

slab1->s_mem=slab开始地址+col*aln+dsize ; col的值变化。

说明:
1)多余的边角料,没有一个对象大小的内存free,分成两部分,一部分colaln(着色域)放在slab的开始;另外一部分是free-colaln(着色补偿域),放在slab的末尾。
2)这样着色域大小从 0-free/aln,一共free/aln+1个。每个slab取一个着色值。
显然slab总数小于等于free/aln=1,可以避免不同的slab第i个对象落入同一个cache line。
slab中第i个object地址=colaln+slab->s_mem+iosize。
3)显然slab总数大于free/aln+1,还会有不同的slab第i个对象落入同一个cache line。

代码实现

以后分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值