[−][src]Module allocator_suite::allocators::binary_search_trees
There are various kinds of binary search tree available suitable for storing a free list of free blocks.
Normally, these use nodes allocated from a heap, with fields for pointers to a key and a value.
As we know unused blocks of memory are free, we can re-use these as nodes.
We can then dispense with the value - it is the pointer to the node itself, that being the free block - and with the key (which is the same as the pointer to the node itself, too).
All binary search tree nodes need pointers to a lefthand (or lesser) node and righthand (or greater) node.
We can compress these pointers by using a u32
relative offset which is scaled down by the minimum size of a free block (eg if a node had to be 8 bytes, the relative offset would be scaled by 8, giving a maximum relative offset of 4Gb x 8 => 32Gb).
The minimum size of a free block is dictated by the size of the fields required to represent a binary search tree node.
For effectiveness, a free block size must be a power of two.
Of the types of tree we know of, the following are probably most suitable for allocating and deallocating free blocks:-
- A red-black tree;
- A left-leaning red-black tree (Sedgwick);
- An AA (Arne Andersson) tree;
- An AVL (Adelson-Velsky and Landis) tree.
- Scapegoat tree.
There are trade-offs in choosing one to use:-
- Whilst AA tree ands AVL trees perform better generally for look-ups than Red-Black tree, they usually are worse for deletions and insertions;
- Deletions and insertions are a major part of the operations of free list (indeed, if splitting free blocks into smaller ones is at all common, they are the dominant operation);
- An AA tree requires an additional 4 - 8 bytes to hold an integer 'level`;
- A Red-Black tree requires an additional bit to hold a color combined with a
parent
pointer.
Modules
binary_search_tree_with_cached_knowledge_of_first_child | |
binary_search_trees_with_cached_knowledge_of_first_child | |
prelude |