在/ proc / mem中有许多字段:我知道我不能只用“MemFree”,因为大量的内存实际上是caching的。 所以问题是,如何计算可用内存的数量?
假设:
使用源码卢克!
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); }