8

我们需要多个程序来调用公共库中的函数。库函数访问和更新公共全局内存。每个程序的函数调用都需要看到这个公共的全局内存。也就是说,即使从另一个程序调用,一个函数调用也需要查看任何先前函数调用的更新。出于兼容性原因,我们对共享库公开的函数必须如何操作有几个设计限制:

  • 全局声明的任何数据项(标准数据类型和对象)必须对所有调用者可见,无论代码在哪个线程中运行。
  • 在函数中本地声明的任何数据项仅在该函数内可见。
  • 任何标准数据类型或任何类的实例都可能出现在本地或全局或两者兼而有之。

一种解决方案是将库的公共全局内存放在命名共享内存中。第一个库调用将创建命名的共享内存并对其进行初始化。随后的程序调用将获取共享内存的地址并将其用作指向全局数据结构的指针。全局声明的对象实例需要在共享内存中动态分配,而本地声明的对象实例可以放置在堆栈或调用线程的本地堆中。问题出现是因为全局内存中的初始化对象可以创建并指向分配(新)额外内存的子对象。这些新的分配也需要在共享内存中并被所有库调用者看到。另一个复杂之处是这些对象,其中包含字符串、文件等,也可以在调用程序中使用。当在调用程序中声明时,对象的内存对调用程序是本地的,而不是共享的。所以对象的代码需要处理这两种情况。在我们看来,该解决方案将要求我们覆盖全局放置 new、常规 new 和 delete 运算符。我们找到了一个内存管理系统的设计,看起来它可以工作,但我们还没有找到任何实际的实现。如果有人知道 Nathan Myers 的内存管理设计的实现(我们找到了一个内存管理系统的设计,看起来它可以工作,但我们还没有找到任何实际的实现。如果有人知道 Nathan Myers 的内存管理设计的实现(我们找到了一个内存管理系统的设计,看起来它可以工作,但我们还没有找到任何实际的实现。如果有人知道 Nathan Myers 的内存管理设计的实现(http://www.cantrip.org/wave12.html?seenIEPage=1)我会很感激它的链接。或者,如果有人知道另一个可以动态分配对象的共享内存管理器,我也很想知道它。我已经检查了 Boost 库和我能找到的所有其他资源,但似乎没有什么能满足我们的需要。我们宁愿不必自己写一个。由于性能和健壮性很重要,因此使用经过验证的代码会很好。提前感谢您的任何想法/帮助。

感谢您提供有关 ATL 和 OSSP 库的建议。我现在正在检查它们,尽管如果目标结果是 Unix,我担心 ATL 太以 Win为中心。

另一件事现在对我们来说似乎很清楚。由于对象可以在执行期间动态创建,内存管理方案必须能够分配额外的共享内存页面。这现在开始看起来像一个成熟的堆替换内存管理器。

4

4 回答 4

1

看看boost.interprocess

于 2009-12-23T15:35:05.363 回答
0

还要研究互斥体和信号量。当两个或更多实体需要共享内存或数据时,需要有一种“流量信号”机制来限制只有一个用户的写访问。

于 2009-12-23T18:03:24.913 回答
0

我相信您已经发现,这是一个非常复杂的问题,并且很难正确实施。从我的经验中得到一些提示。首先,您肯定希望使用信号量同步对共享内存分配的访问。其次,多个进程对共享对象的任何修改也需要受到信号量的保护。最后,在定义对象和数据结构时,您需要考虑从共享内存区域开始的偏移量,而不是绝对指针值(在每个附加进程中,内存通常可以映射到不同的地址,尽管您可以根据需要选择固定的映射地址)。以稳健的方式将它们组合在一起是困难的部分。它'

于 2009-12-23T15:48:51.383 回答
0

OSSP mm - 共享内存分配:

男人 3 毫米

于 2009-12-23T15:28:49.997 回答