allocateNode()分配节点为什么从0层开始往下查询空闲节点?
来源:7-12 page 级别内存分配
鋒Nic
2018-06-27
private int allocateNode(int d) {
int id = 1;
int initial = - (1 << d); // has last d bits = 0 and rest all = 1
byte val = value(id);
if (val > d) { // unusable
return -1;
}
while (val < d || (id & initial) == 0) { // id & initial == 1 << d for all ids at depth d, for < d it is 0
id <<= 1;
val = value(id);
if (val > d) {
id ^= 1;
val = value(id);
}
}
byte value = value(id);
assert value == d && (id & initial) == 1 << d : String.format("val = %d, id & initial = %d, d = %d",
value, id & initial, d);
setValue(id, unusable); // mark as unusable
updateParentsAlloc(id);
return id;
}在分配节点的时候已经知道节点所在的层级深度,为什么还要从0层开始往下查询空闲节点呢?这步不是很多余吗?比如分配16K,那直接在第10层去查询空闲节点即可嚒?
写回答
1回答
-
从指定层开始遍历找一个空闲的内存块是一个线性搜索的过程,平均时间复杂度为O(n),而从底层开始查找,树形结构,时间复杂度为O(lgn),树形结构相当于是批量遍历
一个简单的例子:chunk左半边内存全部被使用,右半边是空闲的,树形结构只需要遍历一个层数就行,而到指定层遍历得把左边的小空闲块全遍历一遍才能找到空闲块10
相似问题