C/C++;以编程方式获取可用内存

C/C++;以编程方式获取可用内存,c,memory,C,Memory,如何使用C/C++程序获取OSX和linux平台中当前的“空闲”内存?在OSX中,我可以通过sysctl和sysconflinux系统调用获得“最大”内存量。但是,我不知道如何在运行时获得可用内存。运行时没有可用内存总量这样的东西。由您的进程分配并有效使用的内存很可能以前被另一个进程或仅文件系统缓存使用过,您实际上可以分配和使用比主板上物理可用的内存更多的内存(尽管效率非常低)。Linux和Windows也是如此:所有这些操作系统都使用虚拟内存 您可以依靠系统信息来告诉您有多少物理内存可用(但在

如何使用C/C++程序获取OSX和linux平台中当前的“空闲”内存?在OSX中,我可以通过
sysctl
sysconf
linux系统调用获得“最大”内存量。但是,我不知道如何在运行时获得可用内存。

运行时没有可用内存总量这样的东西。由您的进程分配并有效使用的内存很可能以前被另一个进程或仅文件系统缓存使用过,您实际上可以分配和使用比主板上物理可用的内存更多的内存(尽管效率非常低)。Linux和Windows也是如此:所有这些操作系统都使用虚拟内存

您可以依靠系统信息来告诉您有多少物理内存可用(但在虚拟机中这可能是假的)。在切换到压缩内存或SDD之前,计算可用内存的数量更为困难,且系统特定,不同版本的操作系统会有所不同

根据经验,使用配置文件或环境变量告诉程序要使用多少内存,并针对特定环境调整该数字:

  • 如果您的程序在专用系统上执行,它应该为系统留出足够的内存,以便正常运行,并提供相当数量的磁盘缓存。使用诸如
    top
    (Linux)或活动监视器(OS/X)之类的工具查看系统最终使用了多少压缩内存或多少交换,并减少设置以最小化这些

  • 如果您的程序需要与执行其任务的用户共存,则应显著减少此配额,以便为其他任务保留至少一半的可用内存


运行时的可用内存总量是不存在的。由您的进程分配并有效使用的内存很可能以前被另一个进程或仅文件系统缓存使用过,您实际上可以分配和使用比主板上物理可用的内存更多的内存(尽管效率非常低)。Linux和Windows也是如此:所有这些操作系统都使用虚拟内存

您可以依靠系统信息来告诉您有多少物理内存可用(但在虚拟机中这可能是假的)。在切换到压缩内存或SDD之前,计算可用内存的数量更为困难,且系统特定,不同版本的操作系统会有所不同

根据经验,使用配置文件或环境变量告诉程序要使用多少内存,并针对特定环境调整该数字:

  • 如果您的程序在专用系统上执行,它应该为系统留出足够的内存,以便正常运行,并提供相当数量的磁盘缓存。使用诸如
    top
    (Linux)或活动监视器(OS/X)之类的工具查看系统最终使用了多少压缩内存或多少交换,并减少设置以最小化这些

  • 如果您的程序需要与执行其任务的用户共存,则应显著减少此配额,以便为其他任务保留至少一半的可用内存


这就是您要搜索的内容吗?这就是你要找的吗?IIRC,甚至还有一个问题,一些(默认配置的)操作系统允许用户进程分配比可用内存更多的内存(即使在虚拟内存中),将分配失败推迟到使用失败。是的,我写道:实际上,您可以分配和使用比主板上物理可用内存更多的内存。系统的运行速度取决于所述内存的使用模式。滥用此功能确实可能导致系统故障。有些系统通过限制单个进程或单个用户可分配的内存量来防止这种情况,但很容易绕过这些限制。也许我不清楚我指的是虚拟机过度使用(即操作系统分配的内存超过配置的虚拟机限制),而不仅仅是虚拟内存的概念。这就像超额预订一个航班,希望一些乘客不会出现。这是一个很好的比较:超额预订一个航班会导致在登机口留下一些随机的乘客,这些乘客有望搭乘下一个航班。对它们的惩罚与被交换击中的进程的惩罚非常相似,只是更糟糕:一个需要几纳秒的操作最终会从毫秒持续到甚至整秒(!)想象一下你从航天飞机上被弹回,然后等待100万小时等待下一次……IIRC,甚至有一个问题操作系统的(默认配置)允许用户进程分配比可用内存更多的内存(即使在虚拟内存中),将分配失败推迟到使用失败。是的,我写道:实际上,您可以分配和使用比主板上物理可用内存更多的内存。系统的速度将取决于所述内存的使用模式。滥用此功能可能确实会导致系统故障。一些系统通过限制内存来防止出现这种情况一个进程或一个用户可以分配的内存量为t,但很容易绕过这些限制。也许我不清楚我指的是虚拟机过度使用(即操作系统分配的内存超过配置的虚拟机限制),而不仅仅是虚拟内存的概念。这就像超额预订航班,希望一些乘客不会出现。这是一个很好的比较:超额预订航班会导致在登机口留下一些随机乘客,这些乘客有望乘坐下一班航班。对他们的惩罚与交换过程中发生的情况非常相似,除了更糟糕的是:一个需要几纳秒的操作最终会持续几毫秒甚至整秒(!)想象一下你从航天飞机上被弹回,然后等待100万小时等待下一次。。。