开发板Linux下SD卡操作问题

mxc880922 2014-01-08 05:34:59
各位好,最近项目需要用到SD卡存储历史数据,ARM9+Linux2.6平台下,遇到一个奇怪的问题。
存储历史数据的时候,系统的内存在随之增加,增加的内存差不多就是向SD卡里面写入的数据量大小。程序里面没有malloc后没有free的情况,应该不会出现内存泄露。
怀疑是文件缓存的问题,但是SD卡里面存储数据的文件时每分钟打开,下一分钟关闭再打开的,应该不会出现文件缓存一直增加的情况呀。
另外,SD卡确实是挂载成功了的,取下SD卡看里面的数据也确实写进去了。

麻烦大家帮忙分析一下出现这种情况的可能,拜谢!
...全文
340 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
mxc880922 2014-01-10
  • 打赏
  • 举报
回复
引用 4 楼 zgglj 的回复:
linux的文件缓存机制是这样,到一定时候会回收,可以通过以下方法干预这个过程 echo 3 > /proc/sys/vm/drop_caches 可以回收在内核中申请的缓存 修改/proc/sys/vm/min_free_kbytes中的值可以设定内核预留给上层使用的最小内存大小,可以通过此方法控制文件写时过多使用内存进行缓存
谢谢zgglj 我试试修改一下看看再测试
mxc880922 2014-01-10
  • 打赏
  • 举报
回复
引用
坑太深不懂. 建议试一试,实践是检验..... 试下写超过内存大小的数据到SD卡(中的文件). 看看到底会怎样.(反正没什么损失吧) 可能是内核有IO缓存.比如你每毫秒向一个文件写byte的数据.然后内核觉得这样IO效率不科学.就先存在内存中(速度块嘛),然后在一段时间(或者等数据多点)之后,再一起写到文件中.
谢谢zodiac1111 我试了一下,现在用的系统是64M ram,往SD卡里写了100多M的数据了,内存只剩下1M左右的可用内存,测试之前系统有50多M的可用内存。
非凡glj 2014-01-09
  • 打赏
  • 举报
回复
linux的文件缓存机制是这样,到一定时候会回收,可以通过以下方法干预这个过程 echo 3 > /proc/sys/vm/drop_caches 可以回收在内核中申请的缓存 修改/proc/sys/vm/min_free_kbytes中的值可以设定内核预留给上层使用的最小内存大小,可以通过此方法控制文件写时过多使用内存进行缓存
zodiac1111 2014-01-09
  • 打赏
  • 举报
回复
坑太深不懂. 建议试一试,实践是检验..... 试下写超过内存大小的数据到SD卡(中的文件). 看看到底会怎样.(反正没什么损失吧) 可能是内核有IO缓存.比如你每毫秒向一个文件写byte的数据.然后内核觉得这样IO效率不科学.就先存在内存中(速度块嘛),然后在一段时间(或者等数据多点)之后,再一起写到文件中. man fflush 可能有帮助
mxc880922 2014-01-08
  • 打赏
  • 举报
回复
#define T_INTERVAL 1 int tick_ok = 0; void sigalrm_fn(int sig) { tick_ok = 1; alarm(T_INTERVAL); return; } int main(int argc, char *argv[]) { int sys_retval; FILE *hfile_fp; unsigned char *data_ptr; /* for time */ struct tm *local; time_t ltime; int old_min, old_hour; unsigned long ll=0; data_ptr = (unsigned char *)malloc(4096 * sizeof(unsigned char)); if (data_ptr==NULL) { perror("malloc"); exit(EXIT_FAILURE); } memset(data_ptr, 'A', 4096 * sizeof(unsigned char)); /* to determine whether /sdcard exists */ system("mount -t vfat /dev/mmc/blk0/part1 /mnt"); sleep(10); sys_retval = access("/mnt/mntfailed", F_OK); if (sys_retval == 0) { printf("mount SD card failed!!!\n"); exit(EXIT_FAILURE); } printf("mnt sd successed!\n"); //创建/打开文件,截断方式 if ((hfile_fp= fopen("/mnt/abc.txt", "wb+"))==NULL) { printf("creat flie abc.txt error!\n"); exit(EXIT_FAILURE); } ltime = time(NULL); local = localtime(<ime); old_min = local->tm_min; signal(SIGALRM, sigalrm_fn); alarm(T_INTERVAL); printf("history datas!\n"); while (1) { if (tick_ok) { tick_ok = 0; ltime = time(NULL); local = localtime(<ime); //写文件 if (fwrite(data_ptr, sizeof(char), 1024, hfile_fp) != 1024) { printf("write file abc.txt error!\n"); exit(EXIT_FAILURE); } printf("%d\n", ++ll); /* 新的一分钟到来 */ if(local->tm_min != old_min) { //printf("newm:%d, oldm:%d\n", local->tm_min, old_min); printf("new min!\n"); old_min = local->tm_min; if (fclose(hfile_fp) != 0) { printf("close file error!\n"); exit(EXIT_FAILURE); } usleep(100000); /* 打开文件 */ if ((hfile_fp=fopen("/mnt/abc.txt", "ab+")) == NULL) { printf("open flie abc.txt error!\n"); exit(EXIT_FAILURE); } } } usleep(50000); } free(data_ptr); if (fclose(hfile_fp) != 0) { printf("close file error!\n"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); }
mxc880922 2014-01-08
  • 打赏
  • 举报
回复
这样说的有点抽象,刚才改出来一个写SD卡的小测试程序,运行之后,发现内存也还是在增加 我是每秒钟向SD卡里面的文件写1K数据,使用free查看内存占用还是在增加。 kill掉测试程序的进程之后,增加的内存占用也没有减少到,所增加的内存量和写入SD卡的数据量基本一致; 之后我umount了SD卡,free内存信息,发现内存占用减少了,正好是运行测试程序之前的占用量! 有点头晕了,free出来的不是内存信息么,按说我往SD卡里面写数据,内存不应该增加那么快,增加那么多啊。 难道mount SD卡到文件系统里面,是映射到内存里的?如果真是这样的话,存储数据的程序一直运行,迟早会把内存吃空的啊。 Linux系统对这一块的内存回收机制又是怎么个情况呢 下面贴出测试程序

23,117

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧