如果我的操作系统是 64 位,那么我的 32 位应用程序可以使用 64 位内存(> 3.5GB)吗?
答案1
如果应用程序支持 AWE,那么它们可以使用超过 4Gb 的地址空间,但效率不如 64 位应用程序。如果启用了 PAE 并且进程能够使用它,那么 32 位 Windows 变体下的 32 位进程甚至可以访问超过 32 位地址空间允许的范围。
单个 32 位进程(不支持 AWE)通常限制为 3Gb(其虚拟地址空间的第一个 Gb 保留用于内核相关操作)但如果你正在运行多个进程,那么他们将能够使用更多总共 (每个可以使用最多 3Gb,总内存允许),因为它们的虚拟地址空间是不是共享。
按进程进行限制在类 Unix 环境中更有帮助,因为在类 Unix 环境中服务往往基于进程而不是基于线程(一个进程中的多个线程共享进程资源,因此共享单个 3Gb 虚拟地址空间),这在 Windows 下更常见(在 Windows 中启动一个新进程非常昂贵,因此线程是首选,在大多数 Unix 环境下,启动一个新进程并不比启动一个新线程消耗更多资源)。对于只运行 SQL Server 的机器来说,它没有多大帮助,因为它只有一个进程,因此会达到 3Gb 的限制(某些版本可以配置为支持 AWE,但不是全部,并且该功能计划在下一个主要版本中删除)。
32 位进程总共可以使用超过 3Gb 的内存,操作系统还可以使用任何未使用的内存进行磁盘缓存,因此可能不会造成浪费,假设进程不会以告诉操作系统不要这样做的方式打开文件。
答案2
如果应用程序使用异戊烯醇,那么是的(尽管这不限于 64 位操作系统)。如果没有它,进程仍然被限制在 4GB 地址空间内。
答案3
有点,取决于你的意思。
假设 Windows...
如果操作系统是 64 位的,则 32 位进程默认获得 2 GB 的用户地址虚拟地址空间。如果 .exe 文件的 PE 标头标有 IMAGE_FILE_LARGE_ADDRESS_AWARE 标志,则该进程将获得 4 GB 的用户可寻址虚拟地址空间。无论哪种情况,内核的虚拟地址空间与 64 位进程相同,因为它在所有进程之间共享。另外值得注意的是,未设置 IMAGE_FILE_LARGE_ADDRESS_AWARE 标志的 64 位进程也只能访问 2 GB 的用户虚拟地址空间。
您所听到的有关特殊启动标志、3 GB、/3GB 开关或 /userva 等内容均与 32 位操作系统有关,并不适用于 64 位 Windows。
微软的Windows 版本的内存限制页。
@David Spillett 的回答还涉及另一点:多个进程,全部限制在 2 GB 的用户空间内,如果可用的话,仍然可以使用大量 RAM,文件缓存也可以。
答案4
32 位操作系统上的 32 位进程具有 4GB 地址空间,其中 2GB 由操作系统保留,2GB 可供进程使用。
可以指定给操作系统的开关 (/3GB),将为操作系统保留的量更改为仅 1GB,并允许进程拥有 3GB,但前提是进程在可执行文件的标志中声明自己是大地址感知的。
在 64 位操作系统上,如果 32 位进程能够感知大地址,则它将获得 4GB,否则将获得 2GB。
所有这些都适用于非 AWE 感知进程。如果进程能够使用 AWE,那么正如其他人所说,它可以使用较大的地址空间,但效率低于 64 位进程。
PAE 允许 32 位操作系统使用超过 4GB 的 RAM,但是,它存在兼容性问题并且在 XP 中的一个服务包中被禁用,因此它仅在服务器操作系统版本上可用。