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
相似问题