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

C 具有32位地址空间的进程如何高效地访问大量内存?,c,C,我们有一个32位地址空间的进程,它需要访问比直接寻址更多的内存。无法更改此进程的大多数源代码。我们可以更改用于管理数据访问的模块。这些模块的接口可以包括标识要访问的内存的64位数据段 我们目前有一个实现,其中接口模块使用与64位进程的进程间通信,在该64位进程的地址空间之间传输数据 有更好的方法吗?很少有平台支持混合32位和64位代码。如果您需要超过2或3 GB的地址空间,您可以选择: 将整个应用程序重新编译为64位,或 使用内存映射文件分页进出大块数据 重新编译很容易。在32位程序中访问超

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

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


有更好的方法吗?

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

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

  • 使用内存映射文件分页进出大块数据

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

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

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

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

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

  • 使用内存映射文件分页进出大块数据

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

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

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

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

  • 有一个32位进程,其中一小部分可以更改。其余部分基本上是预编译的,不能更改
  • 小部分当前与64位进程通信,以在64位地址空间和32位进程的地址空间之间传输所选数据
  • 您可能会寻找性能更高的替代方案
进程间通信通常很快。可能没有更快的方法,除非:

  • 您的系统有专门的硬件用于加速内存传输,或者
  • 您的系统具有重新映射内存的方法(详见下文)
Unix具有诸如
shmat
mmap
之类的调用,这些调用允许进程附加到共享内存段,并将其部分地址空间映射到共享内存段内的偏移量。这样的调用可能支持将32位地址空间的部分映射到存在于大型物理地址空间中的大型共享内存段

例如,调用
mmap
void*
参数用于映射进程地址空间中的地址,并将
off\t
参数用于映射到共享内存段中的偏移量。可以想象,
off\t
类型可以是64位类型,即使
void*
只是一个32位指针。我没有对此进行调查


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

如各种注释所述,情况如下:

  • 有一个32位进程,其中一小部分可以更改。其余部分基本上是预编译的,不能更改
  • 小部分当前与64位进程通信,以在64位地址空间和32位进程的地址空间之间传输所选数据
  • 您可能会寻找性能更高的替代方案
进程间通信通常很快。可能没有更快的方法,除非:

  • 您的系统有专门的硬件用于加速内存传输,或者
  • 您的系统具有重新映射内存的方法(详见下文)
Unix具有诸如
shmat
mmap
之类的调用,这些调用允许进程附加到共享内存段,并将其部分地址空间映射到共享内存段内的偏移量。这样的调用可能支持将32位地址空间的部分映射到存在于大型物理地址空间中的大型共享内存段

例如,调用
mmap
void*
参数用于映射进程地址空间中的地址,并将
off\t
参数用于映射到共享内存段中的偏移量。可以想象,
off\t
类型可以是64位类型,即使
void*
只是一个32位指针。我没有对此进行调查


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

So。。您希望您的32位应用程序能够访问64位地址空间吗?嗯。。。有什么理由不只是制作一个64位应用程序吗?你需要重新表述你的问题。不清楚您是在谈论32位和64位寻址模型之间的代码可移植性,还是您以某种方式将使用64位模型视为允许您在32位空间中进行更多寻址。或者您是否希望以某种方式实现分页/覆盖系统,以便以某种方式从1G空间获得更多“寻址能力”?要做到这一点,你需要跳出普通的指针,使用一个dope向量或类似的工具。@WhozCraig你正确地理解了我的问题,我不能制作一个64位的应用程序,这是一个限制,你有没有看到在32位空间中实现这一点的方法only@HotLicks我说的是32位和64位寻址之间的代码可移植性