我需要存储许多页面对齐的条目,每个条目都是页面大小的;基本上,我需要收集/绑定内存页。我需要能够通过匹配机器字大小的键来检查添加时条目是否已经存在的唯一要求。无法覆盖该条目。如果使用相同的密钥,则必须找到现有条目。
添加/替换条目的功能接收到一些机器字大小的键(32/64位),检查是否有包含相同键的页面对齐条目。如果没有条目,则通过mmap创建该条目,并添加所需的密钥。条目的C声明如下:
struct entry {
uintptr_t key; /* machine-word-sized key */
unsigned char meta[]; /* this space may be used for storing in data structure */
};
呼叫者收到密钥并决定是使用现有条目还是分配新条目。也就是说,必须查找键,并且必须仅收集页面才能循环删除。
我所需要做的就是添加条目并删除所有条目(不施加特定顺序);由于我将每个条目都用作epoll.data.ptr,因此添加条目后甚至不需要快速查找。鉴于每个条目都有一些用于元数据的空间,所以我可以将这些空间中的一些专用于将条目存储在数据结构中所需的有效载荷。
我考虑过使用哈希表。我没有数学或加密背景,因此生成良好的哈希值是一个问题。我尝试查看了几种众所周知的哈希值,但是它们似乎很通用,即意在处理任何数据。但是,我的情况似乎很具体:用户无法直接使用该表,而且条件(页面对齐和页面大小的条目以及单词大小的键)不太可能改变。
问题是:
struct list_head
)。我目前只需要关心4096字节的页面,但是一般情况下更好(例如,某些算法可以在PAGE_SIZE上运行,无论是4K,8K还是其他)。数据结构不假定页面大小也很好(尽管页面对齐是严格的要求,因为所有内存都是通过mmap获得的。)