Windows 虚拟内存分配

Windows 虚拟内存分配,windows,memory-management,Windows,Memory Management,当我需要分配超出系统内存限制的虚拟内存时,我的选项是什么 分页文件是无限的(受可用磁盘空间限制),所以为什么我不能使用它来分配超出物理内存限制或操作系统内存限制的内存?为什么他们用地址空间的边界来限制虚拟内存?我知道CPU可以处理物理内存,但为什么当我访问部分虚拟内存时,操作系统不能为我处理这个问题呢?操作系统会为您处理这个问题。您不必考虑物理内存何时被充分利用,因为虚拟内存系统对您隐藏了这一点。应用程序地址空间的限制是分配用于在体系结构中存储内存地址的位数的结果 编辑回复:评论 我认为您可能混

当我需要分配超出系统内存限制的虚拟内存时,我的选项是什么


分页文件是无限的(受可用磁盘空间限制),所以为什么我不能使用它来分配超出物理内存限制或操作系统内存限制的内存?为什么他们用地址空间的边界来限制虚拟内存?我知道CPU可以处理物理内存,但为什么当我访问部分虚拟内存时,操作系统不能为我处理这个问题呢?

操作系统会为您处理这个问题。您不必考虑物理内存何时被充分利用,因为虚拟内存系统对您隐藏了这一点。应用程序地址空间的限制是分配用于在体系结构中存储内存地址的位数的结果

编辑回复:评论


我认为您可能混淆了给定进程可用的内存量与操作系统管理的虚拟内存总量,这是进程之间共享的。所有进程提交的虚拟内存总量都有限制,但此提交限制与单个进程的地址空间限制不同。总提交限制大致为物理内存量+页面文件大小。因此,您可以调整页面文件大小以增加或减少该数字。

操作系统会为您解决这一问题。您不必考虑物理内存何时被充分利用,因为虚拟内存系统对您隐藏了这一点。应用程序地址空间的限制是分配用于在体系结构中存储内存地址的位数的结果

编辑回复:评论


我认为您可能混淆了给定进程可用的内存量与操作系统管理的虚拟内存总量,这是进程之间共享的。所有进程提交的虚拟内存总量都有限制,但此提交限制与单个进程的地址空间限制不同。总提交限制大致为物理内存量+页面文件大小。因此,可以调整页面文件大小以增加或减少该数字。

b屏幕有直接的答案。我只想补充一点,如果你在Windows上工作,那么著名的马克·鲁西诺维奇(MarkRussinovich)在这里有一篇关于虚拟内存的非常详细且写得很好的文章:

bshiels有直接的答案。我只想补充一点,如果你在Windows上工作,那么著名的马克·鲁西诺维奇(MarkRussinovich)在这里有一篇关于虚拟内存的非常详细且写得很好的文章:

虚拟内存和地址空间是两个独立的概念。内存分页是另一回事

地址空间的大小仅限于可寻址的范围位置。这是CPU及其运行模式的限制。例如,在具有32 GB内存的64位系统上运行的典型32位应用程序仍然具有32位地址空间。更多可用存储的事实并没有改变32位程序只使用32位地址的事实(为了简单起见,忽略PAE的存在)

虚拟内存实际上只是操作系统可以控制虚拟内存页和物理内存页之间的一组映射的概念


内存分页允许操作系统将其设置为某些虚拟页存储在磁盘上而不是物理内存中。这可以允许分配比系统上物理内存更多的虚拟内存。

虚拟内存和地址空间是两个独立的概念。内存分页是另一回事

地址空间的大小仅限于可寻址的范围位置。这是CPU及其运行模式的限制。例如,在具有32 GB内存的64位系统上运行的典型32位应用程序仍然具有32位地址空间。更多可用存储的事实并没有改变32位程序只使用32位地址的事实(为了简单起见,忽略PAE的存在)

虚拟内存实际上只是操作系统可以控制虚拟内存页和物理内存页之间的一组映射的概念


内存分页允许操作系统将其设置为某些虚拟页存储在磁盘上而不是物理内存中。这可以允许分配比系统上物理内存更多的虚拟内存。

但是当我分配所有物理内存时,为什么分配不超过虚拟内存中的分配呢。为什么32位(或64位)限制了我?为什么页面交换不适用于进程的分配?它确实超出了这一范围。如果您的机器有512MB的RAM,您仍然可以在32位应用程序中分配约2GB的内存。如果你的机器有12GB的RAM,你仍然只能在32位应用程序中分配2GB的内存。那么,对于一个进程,我如何强制一些物理内存分页到磁盘(而不释放内存)以使该部分可供分配?是否有任何api函数用于此?目前,我正在使用VirtualAlloc。VirtualAlloc是一种非常低级的API,只应在非常罕见的情况下使用。除非您真的知道自己在做什么,否则应该使用HeapAlloc或普通的新旧/malloc。这个答案可能会给你一些信息:总之,除非使用内存映射文件,否则虚拟内存不可能超过系统限制(32位上的2或3Gb…),对吗?但是当我分配所有物理内存时,为什么分配不超过虚拟内存中的限制。为什么32位(或64位)限制了我?为什么页面交换不适用于进程的分配?它确实超出了这一范围。如果您的机器有512MB的RAM,您仍然可以在32位应用程序中分配约2GB的内存。如果您有一台内存为12GB的机器,您仍然只能分配~2GB的内存