内核中的可用内存

时间:2011-06-19 08:05:44

标签: c memory linux-kernel

是否有内核函数返回可用内核内存量(与vmalloc无关)。

2 个答案:

答案 0 :(得分:12)

首先,请允许我说,如果您要根据此信息做出任何政策决定(我应该继续执行此操作吗?),停止。正如WGW指出的那样,这里有不可避免的种族;在您检查和使用它之间可以使用内存。只测试内存分配错误并获得适当的故障路径。此外,如果在没有足够的可用内存时请求内存,内核通常可以通过清理各种缓存,交换到磁盘,释放slab等来获得更多可用内存。内核内存碎片可能会失败(多页)即使没有足够的内存,也不能通过vmalloc进行分配。

也就是说,有用于查询内核内存可用性的API。你应该注意到内核有多个内存池,所以即使其中一个API说你没有空闲内存,也可能是你感兴趣的内存池中可用的。

首先,我们有si_meminfo。这是为/proc/meminfo提供可用性数据的调用,以及有关伙伴页面分配器当前状态的报告。请注意,缓存和缓冲区ram可以很快转换为free ram。

global_page_state(NR_SLAB_RECLAIMABLE)也可用于计算可以快速回收多少板坯内存的计数。如果您请求分配,则可以并且将按需释放此内存。

SLUB分配器(用于kalloc()等等)还提供其内部内存池的统计信息,这些内存池也可以反映每个内存池中的可用内存。这可能不适用于相同的API,具体取决于您的配置中选择了哪个分配器 - 请除调试外不要使用此数据。相关代码(实施/proc/slabinfo)可在mm/slub.c

中找到

答案 1 :(得分:3)

可用内存有哪些用途?最糟糕的情况是你在竞争条件下运行并检查可用内存:

  1. 你获得了可用的内存。这足够了。
  2. 多任务处理,即内核的调度程序,停止进程并继续使用另一个分配一堆可用内存的进程。
  3. 调度程序继续您的过程。
  4. 虽然步骤1显示了足够的可用内存,但您的分配失败。