- Radix Tree(基树)
在页缓存管理中的使用:
页缓存管理中会使用到基树,address_space结构体中包含一个radix tree基树成员,因为每次内核在进行I/O操作前都会检索页高速缓存,也就是address_space结构体,为了提高检索效率,采用基树来管理和检索页高速缓存,会极大提高效率。在2.6以前的内核版本中,页缓存并不是通过基树来检索,而是通过维护一个全局散列表进行检索,相对与基树,基树相对于这种情况是更大优势。
struct address_space {
..
struct radix_tree_root page_tree; /* radix tree of all pages */
...
};
- LRU链表
在页管理中的使用:
struct page {
...
struct list_head lru;
...
};
内存回收使用一个LRU链表来管理,每个页page结构体都会加入到LRU链表。
- RB Tree(红黑二叉树)
1.用户空间虚拟内存区管理中的使用
在vm_area_struct中会使用红黑树:
struct vm_area_struct {
/* linked list of VM areas per task, sorted by address */
struct vm_area_struct *vm_next, *vm_prev;
struct rb_node vm_rb;
};
vm_area_struct中包含红黑树和链表,两种方式来管理vm_area_struct对象,链表用于遍历,而红黑树用于查找,优化了查找效率。
2.在调度器中的使用
CFS调度器中用于管理进程,按照vruntime进行排序,会使用到红黑树来进行管理。
struct rb_root_cached {
struct rb_root rb_root;
struct rb_node *rb_leftmost;
};
struct cfs_rq {
...
struct rb_root_cached tasks_timeline;
...
};
一个runqueue运行队列中会有一个红黑树用来管理运行队列中的进程,其中会按照vruntime来排序,最左变的叶子节点vruntime最少。
- hash链表
在很早的内核版本O(1)调度器中会使用hash链表管理进程。