请高手相助: mmap 使用问题,程序执行完后吃掉 100M 内存 !
这是一段测试程序。用 $ top -p <pid> 监视内存,发现该进程仅占用 352K 内存,
可是程序执行完后总内存被吃掉 100M !删除 tmpfile 后,内存恢复到原始状态。
为什么?如何修改?请高手出招,问题解决立刻结贴,谢谢!
//==================================================================
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <curses.h>
#include <string.h>
#include <iostream>
using namespace std;
const long FILE_SIZE = 100 < < 20;
const long PAGE_SIZE = 4 < < 10;
const long PAGE_NUM = FILE_SIZE / PAGE_SIZE;
int main()
{
// reserve
int fd = open( "tmpfile ", O_CREAT|O_RDWR|O_TRUNC, 00777 );
if( fd < 0 )
{
cout < < "Can 't open file. " < < endl;
exit( EXIT_FAILURE );
}
if( lseek( fd, PAGE_SIZE*PAGE_NUM-1, SEEK_SET ) < 0 )
{
cout < < "lseek error. " < < endl;
exit( EXIT_FAILURE );
}
char ch = '\0 ';
if( write( fd, &ch, 1 ) != 1 )
{
cout < < "write error. " < < endl;
exit( EXIT_FAILURE );
}
cout < < "Press ENTER to create file ... ";
getchar();
void *pBuf = NULL;
for( int i = 0; i < PAGE_NUM; ++i )
{
// mmap
pBuf = (int *)mmap( NULL, PAGE_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, i*PAGE_SIZE );
if( MAP_FAILED == pBuf )
{
cout < < "mmap error. " < < endl;
exit( EXIT_FAILURE );
}
memset( pBuf, 0, PAGE_SIZE );
if( munmap( (caddr_t)pBuf, PAGE_SIZE ) < 0 )
{
cout < < "munmap error " < < endl;
exit( EXIT_FAILURE );
}
}
close( fd );
cout < < "Press ENTER to exit ... ";
getchar();
exit( 0 );
}
[解决办法]
const long FILE_SIZE = 100 < < 20;
100M 全是保存在内存中的
[解决办法]
回wgjmail(笑面佛),
和const long FILE_SIZE = 100 < < 20;
这个定义有关吗?
那为什么程序运行完了,内存还没有被放出来,必须删除文件才行?
[解决办法]
测试了一下,发现其实内存并没有少,你所指的少了估计只是指free命令说看到的free下的数值减少了,其实可以注意一下free命令最后还有一个cached的值。实际上cached也是应用程序在需要时可以使用的内存(被内核用于磁盘缓冲),所以你可以看看实际上free+buffers+cached的值没有变化。删除tmpfile后由于对应的磁盘缓冲已不需要使用,因此cached部分恢复原来的值。
[解决办法]
嗯,楼上说的在理
[解决办法]
总内存是没有变,但是为什么free的内存减少了呢,为什么cached的内存在不删除文件的情况下没有释放呢?如果创建一个大文件,比如大小是是物理内存的两倍或者更多的话,那么可以看到系统根本就无法正常工作了。如果不是创建临时文件,那么mmap就没有任何实用的价值。