PAE(Physical Address Extension)于1994年在CPU中引入。这允许32位处理器访问64 GB内存而不是4 GB。从2.3.23开始,Linux内核为此提供支持。假设我正在启动其中一个内核,并希望用C编写一个可以访问超过3 GB内存的应用程序(为什么3 GB?See this)。
如何访问超过3 GB的内存?当然,我可以分叉多个过程;每个人都可以访问3 GB,并可以相互通信。但对于大多数用例而言,这不是一个现实的解决方案。还有哪些其他选择?
显然,在大多数情况下,最好的解决方案是简单地在64位模式下启动,但我的问题是严格关于如何在支持PAE的32位运行的应用程序中使用4 GB以上的物理内存内核。
答案 0 :(得分:9)
你不直接 - 只要你在32位上运行,每个进程都将受到内核构建的VM拆分(2GB,3GB,或者如果你有一个打补丁的内核) 4GB / 4GB拆分,4GB)。
让流程处理更多数据并将其保留在RAM中的最简单方法之一是创建shmfs
,然后将数据放在fs上的文件中,使用普通的seek / read访问它们/ write原语,或者使用mmap
将它们一次映射到内存中(这基本上等同于进行自己的分页)。但无论你做什么,它都需要比使用前3GB更多的工作。
答案 1 :(得分:6)
或者您可以根据需要启动memcached的所有实例,直到映射完所有物理内存。每个memcached实例都可以在32位机器上使用3GiB。
然后通过APIs and language bindings为memcached访问内存。根据应用程序的不同,它可能几乎与直接在64位平台上工作一样快。对于某些应用程序,您可以获得创建可伸缩程序的额外好处。没有多少主板可以处理超过64GiB的内存,但使用memcached,您可以轻松访问尽可能多的内存,而且可以支付。
编辑注意,这种方法当然也适用于Windows,或任何可以运行memcached的平台。
答案 2 :(得分:3)
在Unix上,通过使用mmap / munmap来访问用户空间中超过32位可寻址内存的一种方法,如果/当您想要访问当前未使用的内存子集时。有点像手动分页。另一种方法(更简单)是通过在多个进程中使用不同的内存子集来隐式利用内存(如果您的代码有多进程原型)。
mmap方法基本上与商品128程序员用于银行转换的技巧相同。在这些后期的64天内,64位支持如此容易获得,甚至没有多少理由可以考虑它;)
几年前,我很乐意从我们的产品中删除所有可怕的PAE代码。
答案 3 :(得分:3)
PAE是硬件的地址总线的扩展,以及一些页面表修改来处理它。它并没有改变指针仍然是32位的事实,在一个进程中限制你到4G的地址空间。老实说,在现代世界中,编写需要超过2G(windows)或3G(linux)地址空间的应用程序的正确方法是简单地以64位平台为目标。
答案 4 :(得分:2)
你不能有指向>的指针4G的地址空间,所以你必须做很多技巧。
应该可以通过使用mmap映射大文件的位来在不同的物理页面之间切换地址空间块;您可以随时通过另一次调用mmap来更改映射,以将偏移量更改为文件(以OS页面大小的倍数)。
然而,这是一种非常讨厌的技术,应该避免。你有什么计划使用内存?当然有一种更简单的方法吗?
答案 5 :(得分:0)
显然,在大多数情况下,最好的解决方案是简单地在64位模式下启动,但我的问题是严格关于如何在支持PAE的32位运行的应用程序中使用4 GB以上的物理内存内核。
你没什么需要做的。只有内核需要寻址物理内存,并且PAE知道如何处理4 GB以上的物理内存。该应用程序将自动使用4 GB以上的内存,没有任何问题。