为什么这个函数在我的主机上运行良好,但在虚拟机上却无法正常工作?(GetPhysicallyInstalledSystemMemory)

3
我有以下代码,可以(正确地)给出我计算机上安装的总内存(注意,不是总物理内存,总物理内存会比安装的内存略小):
using System.Runtime.InteropServices;

        [DllImport("kernel32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool GetPhysicallyInstalledSystemMemory(out long TotalMemoryInKilobytes);

        public float getInstalledRAM()
        {
            long memKb;
            GetPhysicallyInstalledSystemMemory(out memKb);
            return float.Parse((memKb / 1024 / 1024).ToString());
        }

然而,当我在测试虚拟机上运行它时,它给出的值比应该的少了1GB(不知道数量是否重要,但最终结果是它给了我一个错误的值)。有可能的原因是什么?


我的电脑有8,00GB,它报告的是8,00GB;虚拟机有8,00GB,但它报告的是7,00GB。 - S. M.
在虚拟机中,Windows 版本是 8 还是 7?您可以通过检查“控制面板\所有控制面板项\系统”来获取虚拟机内的此信息。 - user47589
它与8GB相符。 - S. M.
好的。我想排除这可能是PEBCAK的情况。根据文档,报告的值不包括为驱动程序等保留的内存。 "操作系统可用的内存量可能小于计算机中物理安装的内存量,因为BIOS和一些驱动程序可能会将内存保留为内存映射设备的I/O区域,使内存对操作系统和应用程序不可用。" 可能是这个原因吗? - user47589
我认为这段摘录指的是前面提到的段落中的 GlobalMemoryStatusEx 函数,而这个函数应该包括通常无法访问的内存,否则我们将使用 ComputerInfo 类中的 TotalPhysicalMemory 属性。不过我的理解可能有误。"通过 GetPhysicallyInstalledSystemMemory 函数检索到的物理内存量必须等于或大于 GlobalMemoryStatusEx 函数报告的内存量;" 这意味着它应该包括那些不可用的内存部分。 - S. M.
显示剩余2条评论
1个回答

2

Windows通常会四舍五入总可用内存。您在VM下看到的结果可能只是由于整数算术截断了两个除法结果。

尝试强制使用双精度算术,至少通过1024.0进行一次除法,看看错误是否仍然存在。


谢谢,这解决了我的问题。 - S. M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接