/proc/mem中有许多字段:我知道我不能只看“MemFree”,因为许多内存实际上是缓存的。所以问题是,如何计算可用内存的数量?
假设:
- 系统未配置交换空间。
- 我的“可用内存”定义是当此值为零时,malloc开始失败。
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 killer会启动。
malloc
并检查其返回值。如果返回null
,则内存不可用。/proc
文件系统的行为可能会导致内存开销。即使您以某种方式成功获取了可以使用malloc()
分配的数量,也无法保证在您尝试分配它的瞬间时可用相同数量的内存。使用源代码吧!
free.c -- 'free' 命令行实用程序的源代码
sysinfo.c -- 查看 meminfo() 方法,了解如何读取 /proc/meminfo 的示例。
虽然读取 /proc 目录相当简单,但预测 malloc 是否会失败却一点也不容易。正如其他人所提到的,过度提交等问题使情况变得复杂。标准的方法是尝试分配所需内存,如果无法成功,则优雅地失败或者降低要求。
如果有足够的时间,阅读这一系列文章是值得的:每个程序员都应该了解的有关内存的知识。
{
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);
}
为回答这个旧帖提供信息,因为我再次来到了这个问题。
free 命令有一个 "available" 条目,/proc/meminfo 中的 "MemAvailable"。
而 man 文档说:
available 估计有多少内存可用于启动新应用程序,而无需交换。与缓存或 free 字段提供的数据不同,该字段考虑了页面缓存,并且并非所有可回收的内存块都将被回收,因为某些项正在使用中(在 /proc/meminfo 中的 MemAvailable,在 3.14 内核上可用,在 2.6.27+ 内核上模拟,在其他情况下与 free 相同)。