【问题标题】:Finding amount of RAM using C++使用 C++ 查找 RAM 的数量
【发布时间】:2011-04-29 09:39:27
【问题描述】:

我如何找出我的系统的 RAM 量和详细信息,例如 CPU 类型、速度、可用物理内存量。 RAM 中的堆栈和堆内存量,正在运行的进程数。

还有如何确定是否有任何方法可以确定您的计算机执行一条指令、从内存中获取一个字(有和没有缓存未命中)、从磁盘读取连续字以及寻找新的磁盘上的位置。


编辑: 我想在我的 linux 系统上使用 g++ 编译器来完成这个。是否有任何 inbulit 功能用于此..?也告诉我这些事情在windows系统上是否可行。

当我在学习 C++ 中的一些内存管理内容时,我只是出于好奇而提出了这个问题。请一步一步指导我,或者可能是在线教程会做得很好。谢谢。

【问题讨论】:

  • 一般来说没有便携的方法可以做到这一点,所以你需要指定你正在使用的操作系统。
  • 所有这些都高度依赖于系统。请详细说明您打算支持哪些操作系统和硬件。其中一些事情没有明智的客观答案(“您的计算机执行指令需要多长时间”)。请详细说明您实际尝试解决的问题,然后也许我们可以提出不同的方法。
  • 我想在我的 linux 系统上使用 g++ 编译器来完成这个。是否有任何 inbulit 功能用于此..?也告诉我这些事情在windows系统上是否可行。
  • 我们通常添加此类额外信息的方式是通过编辑帖子,而不是通过 cmets。就像我刚刚为你做的那样:)
  • 谢谢 Magnus.. 我会记住这一点.. :)

标签: c++ linux memory winapi


【解决方案1】:

对于 Linux 和 GCC,您可以使用包含在 <unistd.h> 标头中的 sysconf 函数。

您可以传递各种参数来获取硬件信息。例如,要获取计算机中的物理 RAM 量,您需要执行以下操作:

sysconf(_SC_PHYS_PAGES) * sysconf(_SC_PAGESIZE);

请参阅man page 了解所有可能的用法。

您可以使用 getrlimit 系统调用和 RLIMIT_STACK 参数获取进程的最大堆栈大小,包括使用 <sys/resource.h> 标头。

要了解当前机器上正在运行的进程数,您可以查看/proc 目录。每个正在运行的进程都表示为该目录中的一个文件,该文件以其进程 ID 号命名。

【讨论】:

    【解决方案2】:

    在 Windows Vista 和 Windows 7 上,Windows System Assessment Tool 可以提供大量信息。据说可以通过 WEI API 以编程方式访问它。

    【讨论】:

    • 但是应该有一些独立于操作系统的方式来使用本机 c++ 代码执行此操作,因为每次程序执行 c++ 编译器都会确保是否有足够的内存可用。
    • @Anurag,没有独立于操作系统的本地 C++ 方式来做到这一点。 CPU 速度或可用 RAM 之类的东西不是 C++ 标准的一部分。
    【解决方案3】:

    对于 Windows - GetPhysicallyInstalledSystemMemory 用于安装的 RAM,GetSystemInfo 用于 CPU,Process Status API 用于进程枚举。堆和堆栈的使用只能由本地进程自己获取。记住堆栈使用是每个线程的,在 Windows 中,一个进程可以有多个堆(使用GetProcessHeaps 枚举它们)。可以使用GetProcessMemoryInfo 检索每个进程的外部可见使用情况中的每个进程的内存使用情况。

    我不知道第二段列表的 Win32 API。如果可能的话,我认为可能必须在设备驱动程序级别(内核模式)执行此操作。指令获取和 执行取决于处理器、缓存大小和指令本身(它们的复杂性并不完全相同)。内存访问速度将取决于 RAM、CPU 和主板 FSB 速度。磁盘访问同样完全取决于系统特性。

    【讨论】:

    • 这些函数在 g++ 编译器上可用还是非常依赖于操作系统...?
    • 如果您在 Windows 上,它们不应该依赖于编译器 - 我希望 g++ 将链接与交付的 Windows DLL 和 LIB。不过,除了 Visual C++ 之外,我没有任何经验。
    • GetPhysicallyInstalledSystemMemory 仅支持 Vista+
    • @Axel - 对,在此之前你应该使用GlobalMemoryStatusEx
    猜你喜欢
    • 2018-08-17
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 2018-02-14
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    相关资源
    最近更新 更多