在Linux上,我应该如何计算从/ proc / mem中的信息的可用内存量?

在/ proc / mem中有许多字段:我知道我不能只用“MemFree”,因为大量的内存实际上是caching的。 所以问题是,如何计算可用内存的数量?

假设:

  • 系统configuration不带交换空间。
  • 我对“空闲内存”的定义是,当这个命中为零时,malloc开始失败。

使用源码卢克!

free.c – “免费”命令行实用程序的源代码
sysinfo.c – 有关如何读入/ proc / meminfo的示例,请参阅meminfo()方法。

虽然读/ proc是相当直接的,可以预测malloc是否会失败并不容易。 正如其他人提到过度浑水这个问题。 标准的做法是只尝试和分配你需要的东西,如果你不能让它失败,或者用更少的工作。

如果你有足够的时间,这一系列的文章是值得一读的: 每个程序员应该知道的内存。

如果如你所说系统配置了没有交换空间,那么可以通过从/ proc / meminfo中添加“MemFree”,“Buffers”和“Cached”值来计算可用内存的数量。

这正是“free -m”在“ – / + buffers / cache”行中的'free'下显示的命令。

在Python中,我将如下实现它:

with open('/proc/meminfo', 'rt') as f: vals = {} for i in f.read().splitlines(): try: name, val = i.split(':') vals[name.strip()] = int(val.split()[0]) except: pass memfree = vals['MemFree'] + vals['Buffers'] + vals['Cached'] 

这将以千字节为单位给出值。

正如其他人所说,malloc不可能返回null。 Linux会重新定位,当你开始使用一个真正无法找到的页面的时候,OOM杀手将会启动。

我有这种感觉,你走错了路。 你想用这些信息做什么? 你想看看是否可以为下一步操作分配足够的内存吗? 如果是这样,你可以调用malloc并检查它的返回值。 如果它返回null ,则内存不可用。

请注意,内存是一个高度动态的资源。 即使你打开/关闭/proc文件系统的行为也可能导致内存开销。 即使你以某种方式设法获得了你可以用malloc()分配的数量,没有人能够保证在你尝试分配它的时间内有相同数量的内存可用。

AFAIK,malloc默认会在linux上过度使用,所以malloc不会在你期望的时候失败。 你不会看到事情失败,直到你实际接触到你配合的内存,OOM杀手可能会被唤醒。

这可能是有趣的(不知道它有多准确)。

http://opsmonkey.blogspot.com/2007/01/linux-memory-overcommit.html

但搜索linux malloc overcommit可能会出现一些有趣的东西。

试着看看这个问题的答案。

以下程序计算Linux环境中的内存使用情况。

 { FILE *fp; char tmpline[1024]; char key[1024]; int line = 0; int num1 = 0; int num2 =0; int val = 0; int cat = 0; fp = fopen("/proc/meminfo","r"); fgets(tmpline,256,fp); sscanf(tmpline,"%*s %d\n",&num1); fgets(tmpline,256,fp); sscanf(tmpline,"%*s %d\n",&num2); printf("toatl mem = %d\n free mem = %d\n",num1,num2); val = num1-num2; printf("Used Mem =%d\n",val ); cat = val*100/num1; printf("per = %d%\n",cat); fclose(fp); return(0); }