netty中的位运算

netty buffer模块

PoolChunk.allocateNode

如果需要分配的内存大于等于pageSize的时候,netty会采用伙伴算法,该函数是使用伙伴算法在memory chunk中找到合适的空闲内存。
PoolChunk类中的byte[] memoryMap字段,是用数组实现满二叉树,来记录memory chunk的内存使用情况。注:根节点的下标为1.在这里插入图片描述
memoryMap代表该节点能够分配的最大内存,每次分配内存后,被分配的节点标记为不可分配的同时,还会更新父节点的值,因为子节点的内存是属于父节点的,子节点被分配后,父节点拥有的空闲内存及单次最大可分配内存会跟着变化。
int allocateNode(int d) d代表分配的内存大小在第几层节点。
查找的过程中会涉及到2个位操作

查找兄弟节点

id ^= 1(id代表二叉树节点在数组中的索引)
使用数组表示满二叉树时,节点n的子节点的索引分别为2n,2n+1.
(2n) ^ 1 = 2n +1
( 2n + 1) ^ 1 = 2n

判断查找的节点是否是第d层

int initial = - (1 << d);
(id & initial) == 0 (id代表二叉树节点在数组中的索引,节点的层次小于d时,该表达式为true)
initial = 11111111111110000…(d - 1个零)。
节点的层次小于d时,在数组中的索引值为000000000xxxx (d-1个x,x取值0或1)。
这样id & initial 肯定等于0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值