哪种数据结构在共享内存方案和快速查找中效果最佳

时间:2015-05-25 11:00:51

标签: c dll data-structures shared-libraries shared-memory

我仍处于项目的概念阶段。然而,开始代码实现。子任务就是:

2进程将从常用的DLL请求数据。该DLL将这些数据存储在内存中的缓冲区中。如果我只是实例化DLL中的结构并在其中存储数据,那么每个流程实例将具有单独的结构,并且数据将不常见。所以我需要一个共享内存实现。现在我的另一个要求是在数据中快速查找时间。我不确定如何在共享内存空间中存储AVL树。互联网上是否有可以存储在共享内存空间中的AVL树/ Hashmap的实现?此外,这是解决问题的正确方法吗?或者我应该完全使用其他东西吗?

TIA!

2 个答案:

答案 0 :(得分:0)

这是否是正确的方法取决于各种因素,例如数据产生的成本,过程是否需要相互通信有关数据等等。本答案的其余部分假定您确实需要共享内存中的查找结构。

您可以使用任何数据结构,前提是您可以为共享内存空间中的数据和数据结构的内部分配存储。这通常意味着您将无法使用malloc,因为每个进程的堆通常都是私有的。您将需要自己的自定义分配器。

假设您选择了AVL树。这是一个实现它们的库:https://github.com/fbuihuu/libtree。看起来在这个库中,“内部”AVL节点数据被侵入存储在“对象”中。 Intrusive 表示您在声明对象struct时保留库使用的字段。因此,只要您在共享内存中为对象分配空间,使用自定义分配器,并在那里为根树struct分配空间,整个树应该可以被多个进程访问。您只需确保共享内存本身映射到每个进程中的相同地址范围。

如果您使用非侵入式AVL实现,意味着每个节点由内部struct表示,然后指向包含您的数据的单独struct,则库或您的实现必须允许您以某种方式为内部struct指定分配器,以便确保在共享内存中分配空间。

至于如何编写自定义分配器,这实际上取决于您的使用情况和系统。您需要考虑是否需要“调整”共享内存区域的大小,系统是否允许您这样做,是否只在区域内分配固定宽度的块,或者您需要支持任意长度的块,是否可以将数据结构分布在多个共享内存区域,进程如何同步和通信等等。如果你走这条路,你应该问一个关于这个主题的新问题。请务必提及您正在使用的系统(Windows?)以及您的约束条件。

修改

只是为了进一步阻止你这样做,除非有必要:例如,如果您的数据生成成本很高,但是一旦数据可用,您不关心这些进程是否构建了自己的独立查找结构,然后,您可以让DLL将数据写入共享内存中的简单环形缓冲区,其余代码从那里获取。构建两个AVL树并不是一个问题,除非它们非常大。

另外,如果您只关心并发性,并且对于有两个进程并不重要,那么您可以将它们作为一个进程的两个线程。

答案 1 :(得分:0)

对于Windows,Microsoft推荐的函数会为每个进程返回可能不同的指针值到共享内存。这意味着在共享内存中,必须使用偏移(从共享内存的开始)而不是指针。例如,在链表中,存在下一个偏移而不是下一个指针。您可能希望创建宏以将偏移转换为指针,并指向偏移指针。