轮询系统内存

时间:2018-02-13 10:34:19

标签: c# memory

我正在尝试查询运行我的应用程序的计算机上的RAM。我尝试了许多获取此信息的不同方法,并得到了一些奇怪的结果。下面您将看到我尝试过的不同方法,并在MessageBox.Show调用上方对结果进行了评论。

第三个是返回KB,我注意到这是安装内存和前两个获得物理内存的方法。这是正确的,并考虑到不同的结果?

我已经检查了许多不同的方法来轮询我的系统上的RAM; msinfo32.exe,dxdiag,CPU-Z,任务管理器,控制面板\系统。所有这些都列出了8GB的内存,除了dxdiag,更具体地说是8192MB RAM。

我的疑问就是这个。我如何证实任何/所有这些方法的结果?由于数字不匹配,我无法确认第三种方法比前两种方法更准确。我知道我可能会做一些愚蠢的事情,比如转换不正确但在Google的“bytes / kb to gb”转换器中仔细检查自己已经缓解了这一点。

using Microsoft.VisualBasic.Devices;

    ...
    ulong installedMemory = 0;
    MEMORYSTATUSEX memStatus = new MEMORYSTATUSEX();
    if (GlobalMemoryStatusEx(memStatus))
    {
        installedMemory = memStatus.ullTotalPhys;
    }

    //8542273536
    MessageBox.Show(installedMemory.ToString());
    //8542273536
    MessageBox.Show(GetTotalMemoryInBytes().ToString());
    GetPhysicallyInstalledSystemMemory(out long memKb);
    //8388608
    MessageBox.Show(memKb.ToString());
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
private class MEMORYSTATUSEX
{
    public uint dwLength;
    public uint dwMemoryLoad;
    public ulong ullTotalPhys;
    public ulong ullAvailPhys;
    public ulong ullTotalPageFile;
    public ulong ullAvailPageFile;
    public ulong ullTotalVirtual;
    public ulong ullAvailVirtual;
    public ulong ullAvailExtendedVirtual;
    public MEMORYSTATUSEX()
    {
        this.dwLength = (uint)Marshal.SizeOf(this);
    }
}

[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool GlobalMemoryStatusEx([In, Out] MEMORYSTATUSEX lpBuffer);
static ulong GetTotalMemoryInBytes()
{
    return new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory;
}
[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetPhysicallyInstalledSystemMemory(out long TotalMemoryInKilobytes);

附加信息

我正在将运行我的应用程序的每台计算机的处理时间和内存(以及其他信息)记录到中央数据库,以便我可以交叉检查此信息,并查看不同的计算机规格如何影响处理时间。

1 个答案:

答案 0 :(得分:1)

GlobalMemoryStatusEx的返回值排除了少量无法使用的内存,因为它映射到硬件(如集成图形控制器和DMA范围)。 GetPhysicallyInstalledSystemMemory只是提供安装的所有RAM的大小,无论其是否可用于操作系统,以防止愤怒的客户返回计算机,因为他们没有获得所有广告字节。但是不要相信我的话,相信docs

  

GetPhysicallyInstalledSystemMemory函数检索金额   从计算机的SMBIOS固件中物理安装的RAM   表。这可能与报告的数量不同   GlobalMemoryStatusEx函数,用于设置ullTotalPhys成员   MEMORYSTATUSEX结构到物理内存量   可供操作系统使用。记忆量   可用于操作系统的数量可以少于   内存物理安装在电脑上,因为BIOS和一些   驱动程序可以将内存保留为内存映射设备的I / O区域,   使内存对操作系统不可用   应用

换句话说,两个结果都是正确的:您安装了8个GiB物理RAM,其中8542273536个字节实际可用于Windows以进行分配。