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];
char testBuffer[1024*1024*5];
在一个函数中这样引用,这个函数肯定被调用
testBuffer[0]=testBuffer[1024*1024]+testBuffer[4*1024*1024];
#5
那是不意味着我在程序中定义5M,10M的缓冲区,对系统的运行速度都不会影响呢?
#6
你定义一个空间,只是在你的进程的逻辑空间内分配了一段空间,程序在运行时,并不立即在内存内分配你定义的空间,只是在你要用到那里,系统才会把你的进程空间在系统内
进行映射,即分配空间.
如你的例子,你定义5M变量的,程序运行后,如果你这个变量一直没有用,那就不分配空间,至到你开始使用.比如你要使用你5M空间的前1M,那系统分配时,可能分配1M,也可能分配2M
也可能把这5M都分配给你,这也要看系统当前的运行状态而定
进行映射,即分配空间.
如你的例子,你定义5M变量的,程序运行后,如果你这个变量一直没有用,那就不分配空间,至到你开始使用.比如你要使用你5M空间的前1M,那系统分配时,可能分配1M,也可能分配2M
也可能把这5M都分配给你,这也要看系统当前的运行状态而定
#7
谢谢各位
#8
数组的地址是连续的,我这条语句
testBuffer[0]=testBuffer[1024*1024]+testBuffer[4*1024*1024];
同时用到了第一个字节和第4M个字节,他难道不需要分配4M空间吗?而且此时系统有那么多的空闲内存,为什么没有分配呢?还请各位再解释一下,谢谢!
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的功能,用户的程序一般不用理会它.
数组的地址是连续的,我这条语句
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
mmap()在内存小时的性能 [已结贴]
http://topic.csdn.net/u/20070901/23/0a5ec793-eef5-4284-9a02-d2043fa41431.html
#14
设置一个合适大小的缓冲区, 分次读.
这个大小要根据系统性能确定, 不同系统不一样, 我记得好象APUE上说是1024
这个大小要根据系统性能确定, 不同系统不一样, 我记得好象APUE上说是1024
#1
你定义的5MB是在静态的吧? 用的应该是程序的栈空间.
#2
定义的是全局变量,用的怎么栈空间呢?
#3
linux的内存分配策略不是一次性完全分配,有些是用的时候再分配的
#4
这样定义的
char testBuffer[1024*1024*5];
在一个函数中这样引用,这个函数肯定被调用
testBuffer[0]=testBuffer[1024*1024]+testBuffer[4*1024*1024];
char testBuffer[1024*1024*5];
在一个函数中这样引用,这个函数肯定被调用
testBuffer[0]=testBuffer[1024*1024]+testBuffer[4*1024*1024];
#5
那是不意味着我在程序中定义5M,10M的缓冲区,对系统的运行速度都不会影响呢?
#6
你定义一个空间,只是在你的进程的逻辑空间内分配了一段空间,程序在运行时,并不立即在内存内分配你定义的空间,只是在你要用到那里,系统才会把你的进程空间在系统内
进行映射,即分配空间.
如你的例子,你定义5M变量的,程序运行后,如果你这个变量一直没有用,那就不分配空间,至到你开始使用.比如你要使用你5M空间的前1M,那系统分配时,可能分配1M,也可能分配2M
也可能把这5M都分配给你,这也要看系统当前的运行状态而定
进行映射,即分配空间.
如你的例子,你定义5M变量的,程序运行后,如果你这个变量一直没有用,那就不分配空间,至到你开始使用.比如你要使用你5M空间的前1M,那系统分配时,可能分配1M,也可能分配2M
也可能把这5M都分配给你,这也要看系统当前的运行状态而定
#7
谢谢各位
#8
数组的地址是连续的,我这条语句
testBuffer[0]=testBuffer[1024*1024]+testBuffer[4*1024*1024];
同时用到了第一个字节和第4M个字节,他难道不需要分配4M空间吗?而且此时系统有那么多的空闲内存,为什么没有分配呢?还请各位再解释一下,谢谢!
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的功能,用户的程序一般不用理会它.
数组的地址是连续的,我这条语句
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
mmap()在内存小时的性能 [已结贴]
http://topic.csdn.net/u/20070901/23/0a5ec793-eef5-4284-9a02-d2043fa41431.html
#14
设置一个合适大小的缓冲区, 分次读.
这个大小要根据系统性能确定, 不同系统不一样, 我记得好象APUE上说是1024
这个大小要根据系统性能确定, 不同系统不一样, 我记得好象APUE上说是1024