具有32位地址空间的进程如何有效地访问大量内存?

时间:2013-07-31 18:04:17

标签: c

我们有一个32位地址空间的进程需要访问比直接寻址更多的内存。此过程的大多数源代码都无法更改。我们可以更改用于管理数据访问的模块。这些模块的接口可能包含64位数据,用于标识要访问的内存。

我们目前有一个实现,其中接口模块使用进程间通信与64位进程来传输数据到64位进程的地址空间。

有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

很少有平台支持混合32位和64位代码。如果您需要超过2或3 GB的地址空间,您的选项是:

  • 将整个应用程序重新编译为64位或

  • 使用内存映射文件来分页和输出大块数据。

重新编译很容易。在32位程序中访问超过2或3 GB的内存是 hard

请注意,将32位应用程序重新编译为64位应用程序不需要更改代码或功能,除非您的代码具有不可移植的构造,否则可能会出现一些错误。比如:

size_t round_to_16(size_t x)
{
    return x & ~15; // BUG in 64-bit code, should be ~(size_t) 15
}

答案 1 :(得分:1)

如各种评论所述,情况如下:

  • 有一个32位进程,其中一小部分可以更改。其余的基本上是预编译的,不能更改。
  • 当前小部分与64位进程通信,以在64位地址空间和32位进程的地址空间之间传输所选数据。
  • 你寻求替代方案,可能会有更高的表现。

进程间通信通常很快。除非:

,否则可能没有更快的方法
  • 您的系统具有用于加速内存传输的专用硬件,或
  • 您的系统具有重新映射内存的方法(更多信息如下)。

Unix具有shmatmmap等调用,允许进程附加到共享内存段,并将其地址空间的部分映射到共享内存段中的偏移量。这些调用可能支持将32位地址空间的部分映射到大型物理地址空间中存在的大型共享内存段。

例如,调用mmap获取地址空间中映射地址的void *参数和共享内存段中偏移量的off_t参数。可以想象,即使off_t仅是32位指针,void *类型也可以是64位类型。我没有调查过这个。

可以想象重新映射内存比通过复制操作传输内存更快,因为它可能只涉及更改虚拟地址映射而不是物理移动数据。