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