内核数据结构之映射

原创 2012年03月30日 23:56:40

映射也称之为关联数组,它是一组唯一键的集合,每个键与特定的值相关。一般支持至少三个操作:

  • Add(key,value)

  • Remove(key)

  • value=Lookup(key)

Linux提供了一个简单而有效的映射数据结构,它不是通用目的的映射,而是为特殊用例设计的:将UID(唯一标识号)映射到一个指针。除了提供三个主要的映射操作,还基于add操作的基础上提供了一个allocate操作。allocate操作不仅将添加一个UID/值对到映射中,还产生了一个UID

idr数据结构用于映射用户空间的UID,例如inotify监视描述符到它们相关的内核数据结构中,如inotify_watch

初始化idr

先静态定义或动态定义一个idr结构,然后调用idr_init():

void idr_init(struct idr *idp);

如:

struct idr id_huh; /* statically define idr structure */

idr_init(&id_huh);/* initialize provided idr structure */


分配一个新的UID

分两步进行,第一步告诉idr需要分配一个新的UID,使得它能在必要时重置后备树的大小,对应的函数为:

int idr_pre_get(struct idr *idp, gfp_t gfp_mask);

第二步,请求新的UID,相应的函数为:

int idr_get_new(struct idr *idp, void *ptr, int *id);


例子如下:

intid;

do{

if(!idr_pre_get(&idr_huh, GFP_KERNEL))

return-ENOSPC;

ret= idr_get_new(&idr_huh, ptr, &id);

}while (ret == -EAGAIN);

int idr_get_new_above(struct idr *idp, void *ptr, int starting_id, int*id);

该函数的工作方式与idr_get_new()一样,不过它保证了新的UID大于或等于starting_id。它确保某个UID不被重用,并且保证了分析的UID在系统运行期间都是唯一的。

intid;

do{

if(!idr_pre_get(&idr_huh, GFP_KERNEL))

return-ENOSPC;

ret= idr_get_new_above(&idr_huh, ptr, next_id, &id);

}while (ret == -EAGAIN);

if(!ret)

next_id = id + 1;

查找一个UID

void*idr_find(struct idr *idp, int id);

structmy_struct *ptr = idr_find(&idr_huh, id);

if(!ptr)

return-EINVAL; /* error */


删除一个UID

void idr_remove(struct idr *idp, int id);


销毁一个udr

void idr_destroy(struct idr *idp);

如果想强制删除所有的UID,使用如下函数:

void idr_remove_all(struct idr *idp);

不过在调用idr_destroy()之前,要先在该idr上调用idr_remove_all(),确保所有的idr内存被释放。



相关文章推荐

c语言实现通用数据结构(五):通用映射(HashMap)

这是在通用链表的基础上实现的映射,关于链表的实现参见:http://blog.csdn.net/swwlqw/article/details/22498833。 注意映射中只存储了key和value...
  • swwlqw
  • swwlqw
  • 2014年03月31日 14:44
  • 4149

数据结构-1-内存映射文件原理详解

内存映射文件,初次听说,不知道它和虚拟内存有什么区别,也不知从何说起。经过一番查询和研究,下面,我先解释一下我对内存映射文件这个词的理解,解释下原理,然后具体说明其用法。这是数据结构一个很偏僻但是很经...

Linux内核数据结构分析

上一篇在分析Linux虚拟文件系统的过程中,我注意到了一个反复出现的数据结构——struct list_head,通过名称就可以确定这是一种链表数据结构,今天我们就以此为切入点,对内核数据结构的特点做...

《Linux内核设计与实现》——内部数据结构

一、链表  1、链表

linux内核源码目录

2015年9月刚入学,就开始学习有关内核源码的知识,那时候定期上课,定期讨论,定期交作业,中间遇到了很多困难,虽然最后还是没有坚持下来,但是看到这些东西的时候,还是觉得很有感觉。来和大家一起分享。 ...

Linux内核之数据结构--队列

前言Linux内核实现了以下常用的内建数据结构,主要有:   链表   队列   映射   二叉树 今天详细学习一下队列的知识,内核中的队列是以字节形式保存数据的,所以获取数据的时候,需要知...

LayaAir引擎学习日志11----LayaAir Android环境的搭建

一、安装JDK 1、JDK下载 打开网站http://java.sun.com,点击右侧的“Java SE”,出现图1-1,点击“JDK Download”即(https://cd...

flash 的 MouseEvent 浅淡(ROLL_OVER 与 MOUSE_OVER 区别)

经常发现有部分flash 开发人员对MouseEvent中的一些事件类型区分不是很清楚,闲来再谈一下flash 中的 MouseEvent 中的ROLL_OVER 和 MOUSE_OVER 的区别,希...

python数据结构学习笔记-2016-10-17-02-映射

python当中的字典类型就是映射,本节主要实现映射这一ADT。        3.2.1 映射ADT        映射是通过关联唯一的键来储存数据记录的容器。这些键组件必须可以相互比较(不能相...

python数据结构与算法 29-3 用哈希表实现映射

实现map抽象数据类型 字曲是python里最有用的数据集合之一,回想一下,字典是一对键值-数据的组合,键值是用来查找相应的数据,我们把这种思想称为“映射” 映射的抽象数据类型定义如下,这是一个无序...
  • ppabcde
  • ppabcde
  • 2014年04月22日 14:41
  • 4098
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:内核数据结构之映射
举报原因:
原因补充:

(最多只允许输入30个字)