在C中的内存Map文件区域中定义变量,以使用mmap存储内存树

fcg9iug3  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(92)

背景:

假设我有一个内存中的b树(不是b+树),它的节点声明如下:

struct node
{
int* keys;
struct node** children;
int currentNumOfKeys;
char isLeaf;
}

目前为止我理解的是:

我读过使用**mmap()**可以只将内存区域Map到一个文件中并存储数据,忘记所有关于持久化的内容,下次加载程序时,所有指针都是有效的!假设你要么把文件Map到完全相同的起始地址,要么对指针使用相对偏移量!

问题:

现在,如果我想利用这一点,我如何在Map区域内初始化一个结构体对象?
通常情况下,使用像struct node* root = (struct node*)malloc( sizeof(struct node) );这样的东西会给我给予任意的内存地址,无论OS想要什么。
我想要这样的东西:
1-初始化Map区域中树的第一个节点
2-将我的struct node** children更改为int children[MAX_DEGREE]>,这样我就可以存储子节点从这个根节点的偏移量
3-初始化并存储Map区域中的下一个节点,以某种方式,下次程序启动时,Map文件重新创建树,而无需对其进行排序

注意事项:

1.在每一步中,我都希望避免使用交换文件来弥补内存不足或将数据以各种方式复制到磁盘中(显然除了Map文件)。
1.我会将struct node** children;更改为类似int children[MAX_DEGREE];的内容,以存储每个子节点相对于根节点的相对偏移量。

编辑的问题更集中于一个问题/问题

vnjpjtjt

vnjpjtjt1#

mmap的问题是它可以被任何附加到共享内存的程序看到。

program1    shm    program2
            XXX
&XXX ->     &XXX   this is program1's &XXX
                   In program2, &xxx is different

一种解决方法是使用带索引的数组而不是指针。所以与其

struct node
{
   struct node* first_child;
   struct node* next_node;
   ... some data;
};

使用类似于

struct node
{
    unsigned short ix_next_node;
    unsigned short ix_first_child;
    ... some data
};

如果需要向后导航,则需要上一个节点和父节点。假设没有超过65534个节点。保留值65535表示没有节点。这样就不需要children[MAX_DGREE],因为它实际上是一个单链表。所以如果树看起来像

+-- 0
|   +-- 4
|   |   +-- 6
|   |   +-- 7
|   |
|   +-- 5
|
+-- 1
|   +-- 2
|
+-- 3

父节点、上一个节点、下一个节点和子节点将是

Index parent prev  next  first
0     65535  65535 1     4
1     65535  0     3     65545
2     1      65545 65535 65535
3     65535  1     65535 65535
4     0      65535 5     65535
5     0      4     65535 65535
6     4      65535 7     65535
7     4      6     65535 65535

你现在需要做的就是写一个程序来实现它。

相关问题