&&&&&&&共享内存&&&&32 位的程序能把这 6G 数据都读取到吗
确认一下,以后正式环境是不是也是这个情况。
问个问题,有一台linux 64位(Linux version 2.6.32-71,centos)的机器,里面申请了 6G 的共享内存,共享内存里面装载了多个文件。
现在有一批 32 位的应用程序,需要放到64位上的机器运行,现在需要单个32位程序需要挂载
6G共享内存里面,读取里面的数据,单个进程最大挂载 1.6G 的数据。问题来了:
这些 32 位的程序能把这 6G 数据都读取到吗??是否能突破 32 位程序 4G 内存的限制。
[解决办法]
一次读取的话,问题是地址不够用啊。
分次读取还靠谱。
[解决办法]
32位程序所能访问的内存在4GB以下,共享内存6GB的话应该需要专门分区进行管理。
[解决办法]
不要做32位代码修改为64位代码或64位代码修改为32位代码的无用功。
也不要做用32位代码直接调用64位代码库或用64位代码直接调用32位代码库这样复杂、这样容易出错的傻事。
只需让32/64位代码的输入输出重定向到文本文件,或修改32/64位代码让其通过文本文件输入输出。
即可很方便地让32位、64位两种代码之间协调工作。
[解决办法]
假设内存有超过4G的数据,你用什么表示超过4G的地址呢?32位的指针只能表示4G以内的地址啊。
[解决办法]
在不同的映射中,同一个虚拟地址对应的是不同的物理地址。通过多次映射就可以访问超过 4G 的物理地址。
http://zh.wikipedia.org/wiki/%E7%89%A9%E7%90%86%E5%9C%B0%E5%9D%80%E6%89%A9%E5%B1%95
对于需要超过4GB内存的应用软件来说,除了一般的PAE支持,还需要操作系统提供另外的特殊的技术。在Windows上,这种技术叫做Address Windowing Extensions(AWE)。而在类Unix的系统上则有多种技术在使用,例如使用mmap()按需要把一部分文件映射到地址空间;但是,这还没有成为一个标准。
[解决办法]
分次映射是可以的,文件还不如socket读取
[解决办法]
如果6G被映射成为一个共享内存,应该是不行的。
不过可以尝试,把6G内存分成4个1.5G,映射成4个共享区。
每个32位程序只访问其中一个共享区。