关于内存使用情况的问题

时间:2021-03-01 23:20:50
我的系统是64M内存,在linux下不启动任何应用程序的情况下用free命令查得内存应用情况如下:
              total         used         free       shared      buffers
  Mem:        62420         9040        53380            0         2492
 Swap:            0            0            0
Total:        62420         9040        53380

我启动一个应用程序后,用free命令查得内存应用情况如下:
              total         used         free       shared      buffers
  Mem:        62420        10780        51640            0         2916
 Swap:            0            0            0
Total:        62420        10780        51640

修改该应用程序,在其中定义一个大小为5M的全局字符数组并进行引用后,用free命令查得内存应用情况如下:
              total         used         free       shared      buffers
  Mem:        62420        10792        51628            0         2924
 Swap:            0            0            0
Total:        62420        10792        51628

我不明白为什么我定义一个5M的全局数组并引用,内存used却和原来差不多大呢?高手过来解释一下,谢谢了!

14 个解决方案

#1


你定义的5MB是在静态的吧? 用的应该是程序的栈空间.

#2


定义的是全局变量,用的怎么栈空间呢?

#3


linux的内存分配策略不是一次性完全分配,有些是用的时候再分配的

#4


这样定义的
char testBuffer[1024*1024*5];

在一个函数中这样引用,这个函数肯定被调用
testBuffer[0]=testBuffer[1024*1024]+testBuffer[4*1024*1024];

#5


那是不意味着我在程序中定义5M,10M的缓冲区,对系统的运行速度都不会影响呢?

#6


你定义一个空间,只是在你的进程的逻辑空间内分配了一段空间,程序在运行时,并不立即在内存内分配你定义的空间,只是在你要用到那里,系统才会把你的进程空间在系统内
进行映射,即分配空间.
如你的例子,你定义5M变量的,程序运行后,如果你这个变量一直没有用,那就不分配空间,至到你开始使用.比如你要使用你5M空间的前1M,那系统分配时,可能分配1M,也可能分配2M
也可能把这5M都分配给你,这也要看系统当前的运行状态而定

#7


谢谢各位

#8


数组的地址是连续的,我这条语句
testBuffer[0]=testBuffer[1024*1024]+testBuffer[4*1024*1024]; 
同时用到了第一个字节和第4M个字节,他难道不需要分配4M空间吗?而且此时系统有那么多的空闲内存,为什么没有分配呢?还请各位再解释一下,谢谢!

#9


楼 得分:0
数组的地址是连续的,我这条语句
testBuffer[0]=testBuffer[1024*1024]+testBuffer[4*1024*1024]; 
同时用到了第一个字节和第4M个字节,他难道不需要分配4M空间吗?而且此时系统有那么多的空闲内存,为什么没有分配呢?还请各位再解释一下,谢谢!


------------------------

用多少,分配多少,这属于mmu的功能,用户的程序一般不用理会它.

#10


谢谢,cceczjxy 

#11


那么我还想和大家讨论一下,如果我要从flash(或者是磁盘)读入一个0~20M大小不确定的文件岛内存中进行处理,我定义一个大的缓冲一次读入文件呢?还是应该定义一个较小的缓冲分多次读入呢?缓冲区必须是全局的

#12


大家给个建议

#13


看看这个兄弟的帖子,可能会对你有帮助

mmap()在内存小时的性能     [已结贴]
http://topic.csdn.net/u/20070901/23/0a5ec793-eef5-4284-9a02-d2043fa41431.html

#14


设置一个合适大小的缓冲区, 分次读.
这个大小要根据系统性能确定, 不同系统不一样, 我记得好象APUE上说是1024

#1


你定义的5MB是在静态的吧? 用的应该是程序的栈空间.

#2


定义的是全局变量,用的怎么栈空间呢?

#3


linux的内存分配策略不是一次性完全分配,有些是用的时候再分配的

#4


这样定义的
char testBuffer[1024*1024*5];

在一个函数中这样引用,这个函数肯定被调用
testBuffer[0]=testBuffer[1024*1024]+testBuffer[4*1024*1024];

#5


那是不意味着我在程序中定义5M,10M的缓冲区,对系统的运行速度都不会影响呢?

#6


你定义一个空间,只是在你的进程的逻辑空间内分配了一段空间,程序在运行时,并不立即在内存内分配你定义的空间,只是在你要用到那里,系统才会把你的进程空间在系统内
进行映射,即分配空间.
如你的例子,你定义5M变量的,程序运行后,如果你这个变量一直没有用,那就不分配空间,至到你开始使用.比如你要使用你5M空间的前1M,那系统分配时,可能分配1M,也可能分配2M
也可能把这5M都分配给你,这也要看系统当前的运行状态而定

#7


谢谢各位

#8


数组的地址是连续的,我这条语句
testBuffer[0]=testBuffer[1024*1024]+testBuffer[4*1024*1024]; 
同时用到了第一个字节和第4M个字节,他难道不需要分配4M空间吗?而且此时系统有那么多的空闲内存,为什么没有分配呢?还请各位再解释一下,谢谢!

#9


楼 得分:0
数组的地址是连续的,我这条语句
testBuffer[0]=testBuffer[1024*1024]+testBuffer[4*1024*1024]; 
同时用到了第一个字节和第4M个字节,他难道不需要分配4M空间吗?而且此时系统有那么多的空闲内存,为什么没有分配呢?还请各位再解释一下,谢谢!


------------------------

用多少,分配多少,这属于mmu的功能,用户的程序一般不用理会它.

#10


谢谢,cceczjxy 

#11


那么我还想和大家讨论一下,如果我要从flash(或者是磁盘)读入一个0~20M大小不确定的文件岛内存中进行处理,我定义一个大的缓冲一次读入文件呢?还是应该定义一个较小的缓冲分多次读入呢?缓冲区必须是全局的

#12


大家给个建议

#13


看看这个兄弟的帖子,可能会对你有帮助

mmap()在内存小时的性能     [已结贴]
http://topic.csdn.net/u/20070901/23/0a5ec793-eef5-4284-9a02-d2043fa41431.html

#14


设置一个合适大小的缓冲区, 分次读.
这个大小要根据系统性能确定, 不同系统不一样, 我记得好象APUE上说是1024