草庐IT

Windows 32 位虚拟内存页面映射问题

coder 2024-06-09 原文

我正在从这里学习 Windows 32 位虚拟内存页面映射,

(我的目标是现代 Windows 版本,例如 Vista、Win 7、Server 2003/2008 32 位版本。)

http://blogs.msdn.com/ericlippert/archive/2009/06/08/out-of-memory-does-not-refer-to-physical-memory.aspx

两个困惑,

  1. 用户空间虚拟内存空间通常限制为2G,但物理磁盘页面存储可能远大于2G。由于磁盘页面的数量多于虚拟内存页面的数量,因此理论上可以将多个磁盘页面映射到一个虚拟地址页面。如果用户请求访问某个虚拟地址,如果多个磁盘页面映射到一个虚拟地址页面,内存管理器如何知道应该访问哪个磁盘页面?

  2. 不知道为什么会有byte[]数组必须使用连续的虚拟内存空间这样的限制。我认为理论上即使我们只分配500M的虚拟空间地址,我们也可以重新使用这样的虚拟空间地址来继续映射/取消映射磁盘页面文件来消耗我们想要的,甚至超过2G。

有什么想法吗?

最佳答案

字节(或任何其他)数组必须使用连续的地址空间,在本例中是连续的虚拟 地址空间。 这是一个可以使碎片化成为问题的区域,并且实际上会因内存虚拟化而加剧。由于此类系统中固有的各种“重定向”以及使其高效的性能考虑导致实际分配物理地址空间映射到 block 中的虚拟地址空间(通常是页面)。

因此请求 10 字节的虚拟地址空间 block 实际上可能会导致整个 4K 页面被保留和映射。由于页面中的物理内存必须是连续的,这会导致整个 4K 的虚拟地址空间被“阻塞”。
可以在一个页面中放置多个小分配(优秀的内存管理器会尝试实现这一点),但实际上已经保留了超出严格要求的地址空间。考虑在页的开头分配一个字节,然后是 4K - 2 个字节,然后是另一个字节。这会(有效地)占据整个页面。
考虑中间分配是否不再需要,因此被释放。在'top'和'tail'值被释放或移动到别处之前,虚拟地址空间中已经创建了一个间隙,该间隙只能由小于 4K-1 字节的内容填充。 如果发生足够多的此类事情,虚拟地址空间中的连续区域收缩速度比实际实际使用内存收缩速度快得多。

你是正确的,因为没有什么能阻止你,用户,将你的(限制在 32 位区域)地址空间映射到 CPU/OS 支持的更大的磁盘或内存空间。一些芯片通过类似 PAE 的机制使物理地址空间超过 4GB 成为可能。 .

Windows 本身提供了一个 API 来处理“更改地址空间的映射以获得不同的‘窗口’到更广泛的池中”的大多数方面(通过 PAE、运行 WoW64、磁盘或混合)。这叫做 AWE .但是像这样的机制已经存在多年(因为那些记得使用 conventional memorysegmented memory 的 EMS 时代的人。

即使没有 CPU 和操作系统的支持,您仍然可以通过各种技术自己手动完成(见下文)。

Windows 中的许多更复杂的方面都由非常有趣的 Raymond Chen 处理。

关于Windows 32 位虚拟内存页面映射问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1297797/

有关Windows 32 位虚拟内存页面映射问题的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  3. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  4. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  5. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  6. ruby - Fast-stemmer 安装问题 - 2

    由于fast-stemmer的问题,我很难安装我想要的任何ruby​​gem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=

  7. ruby-on-rails - Ruby 中的内存模型 - 2

    ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

  8. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  9. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  10. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

随机推荐