这一部分的具体应用不太清楚,书上介绍的也很简单,等后续遇到具体的应用场合后需要进一步学习!
映射
映射是一个由唯一键组成的集合,每个键关联一个特定的值,包含三个操作:
哈希表是一种映射,但是并非所有的映射都通过哈希表实现,更多的是通过自平衡二叉搜索树来存储数据。
c++中的std:map也是通过的自平衡二叉搜索树实现。
linux提供了简单有效的映射数据结构,因为多是完成自己的特有目的:映射一个唯一的标识数(UID)到一个指针,除了三个标准的映射操作,还在add的基础上实现了allocate操作,不但向map中加入了键值对,还可产生UID。idr数据结构用于映射用户空间的UID
初始化一个idr
定义或动态分配一个idr数据结构,然后调用idr_init();
struct idr id_huh;
idr_init(&id_huh);
分配一个新的UID
因为需要允许调整初始大小-设计在无锁情况下分配内存的场景
调整后备树大小 idr_pre_get(idp,gfp_mask)
该函数在需要时进行UID的分配工作:调整由idp指向的idr大小
获取新的UID idr_get_new(idp,ptr,id)
使用idp所指向的idr分配新的UID,并关联至指针ptr上。
指定获得的最小UID idr_get_new_above(idp,ptr,starting_id,id)
允许idr的使用者确保UID不会被重用
查找UID
idr_find(idp,id)
调用成功返回关联指针,否则返回空指针
如果使用idr_get_new或idr_get_new_above将空指针映射给UID,那么该函数在成功时也返回NULL,就无法区分成功还是失败,所以不要将UID映射到空指针。
删除UID
idr_remove(idp,id)
撤销UID
idr_destroy(idp)
如果成功只释放idr中未使用的内存,并不释放当前分配给UID使用的内存