嵌入式下,内存不够用,mmap可以吗?

npu_wy 2014-08-07 09:37:26
情形:嵌入式下,内存不够用,需要在磁盘上创建文件作为缓冲区,对用户看来,就像在内存中开辟一个buffer一样。
自然而然,想到了mmap函数。问题如下:
1.上网查到有人说,mmap只是把在文件上开辟的“内存”的地址映射到真实内存上,其实并不占用多少真实内存;不过,《UNIX环境高级编程》2th,上392页,图14-11似乎说明,文件被映射的部分有多大,内存中需要占用的空间就有多大。是这样吗?
2.mmap返回的指针,可以作为流输入的目的地址吗?还是只能用memcpy类似的操作?
3.回到用mmap的本身意图:内存不够,需要在磁盘上开辟空间当作内存使用,有没有更好的办法?
...
各路大神,求教……

能帮上的同志还会给分!
...全文
562 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-08-08
  • 打赏
  • 举报
回复
或者用固态硬盘也可以无视碎片问题.
赵4老师 2014-08-08
  • 打赏
  • 举报
回复
Linux的文件系统号称没有磁盘碎片问题.
npu_wy 2014-08-08
  • 打赏
  • 举报
回复
引用 20 楼 zhao4zhong1 的回复:
[quote=引用 17 楼 npu_wy 的回复:] [quote=引用 15 楼 zhao4zhong1 的回复:] 我解决内存不够用的思路只有一条: 用文件读写模拟内存读写,参考_lseeki64函数。 使用这种方法,只要硬盘空间够用,比如用1TB的存储空间毫无压力。
可是碎片如何管理?鸵鸟策略,还是自己来写下?[/quote] 文件管理不怕碎片。 您是否希望迅速对您频繁使用的文件进行碎片整理?使用 Contig 优化单个的文件,或者创建连续的新文件。http://technet.microsoft.com/zh-cn/sysinternals/bb897428 [/quote]Contig是M$的exe,linux也用不了... 创建连续的新文件或许会占用太多空间....
uploaders 2014-08-08
  • 打赏
  • 举报
回复
内存不够考虑把占用内存的代码优化掉,比如减少线程和减少缓存
npu_wy 2014-08-08
  • 打赏
  • 举报
回复
引用 19 楼 zhao4zhong1 的回复:
因为mmap用不了1TB那么大。
为什么不可以呢?
赵4老师 2014-08-08
  • 打赏
  • 举报
回复
引用 17 楼 npu_wy 的回复:
[quote=引用 15 楼 zhao4zhong1 的回复:] 我解决内存不够用的思路只有一条: 用文件读写模拟内存读写,参考_lseeki64函数。 使用这种方法,只要硬盘空间够用,比如用1TB的存储空间毫无压力。
可是碎片如何管理?鸵鸟策略,还是自己来写下?[/quote] 文件管理不怕碎片。 您是否希望迅速对您频繁使用的文件进行碎片整理?使用 Contig 优化单个的文件,或者创建连续的新文件。http://technet.microsoft.com/zh-cn/sysinternals/bb897428
赵4老师 2014-08-08
  • 打赏
  • 举报
回复
因为mmap用不了1TB那么大。
npu_wy 2014-08-08
  • 打赏
  • 举报
回复
引用 16 楼 zhao4zhong1 的回复:
[quote=引用 15 楼 zhao4zhong1 的回复:] 我解决内存不够用的思路只有一条: 用文件读写模拟内存读写,参考_lseeki64函数。 使用这种方法,只要硬盘空间够用,比如用1TB的存储空间毫无压力。
当然如果嵌入式环境不支持_lseeki64只支持fseek或_lseek的话,最大只能是4GB甚至2GB了。[/quote]为什么不用mmap呢?不过,即使是mmap,还是要面临类似存储管理的问题,碎片呀,分配策略呀什么的。 如果说文件用久了直接关了重开,这个想法还是算了,假如我就开一个文件,一直在用
npu_wy 2014-08-08
  • 打赏
  • 举报
回复
引用 15 楼 zhao4zhong1 的回复:
我解决内存不够用的思路只有一条: 用文件读写模拟内存读写,参考_lseeki64函数。 使用这种方法,只要硬盘空间够用,比如用1TB的存储空间毫无压力。
可是碎片如何管理?鸵鸟策略,还是自己来写下?
赵4老师 2014-08-08
  • 打赏
  • 举报
回复
引用 15 楼 zhao4zhong1 的回复:
我解决内存不够用的思路只有一条: 用文件读写模拟内存读写,参考_lseeki64函数。 使用这种方法,只要硬盘空间够用,比如用1TB的存储空间毫无压力。
当然如果嵌入式环境不支持_lseeki64只支持fseek或_lseek的话,最大只能是4GB甚至2GB了。
赵4老师 2014-08-08
  • 打赏
  • 举报
回复
我解决内存不够用的思路只有一条: 用文件读写模拟内存读写,参考_lseeki64函数。 使用这种方法,只要硬盘空间够用,比如用1TB的存储空间毫无压力。
npu_wy 2014-08-08
  • 打赏
  • 举报
回复
引用 25 楼 zhao4zhong1 的回复:
或者用固态硬盘也可以无视碎片问题.
虽然我没弄清楚核心问题,也许是我问的不清楚,不过还是很谢谢您了! 请你去这个帖子也回复下,分呈上! http://bbs.csdn.net/topics/390850139?page=1#post-397906189
帅得不敢出门 2014-08-07
  • 打赏
  • 举报
回复
mmap是映射整个文件到内存中。 是占用内存,不是释放内存用的。 所以不能满足你的要求。 内存不够,可心缓存到磁盘。设定swap大小
勤奋的小游侠 2014-08-07
  • 打赏
  • 举报
回复
帮你顶一下吧,没有研究过
npu_wy 2014-08-07
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
嵌入式系统支持mmap,且不超过2GB们可以用mmap
刚才重新测试了以下mmap开辟的文件,情况完全和之前不一样: open打开一个文件,lseek设置其为2GB(是个空洞文件),然后交给mmap去映射,得到其返回的指针; 接下来,我向这个指针开始的“缓冲区”中循环0x7fffffff次 memcpy,每次1B,向文件写2.1GB的字符,结果在写的过程中,使用du -lh filename发现:随着写入字符的增多,文件在增大,关键的是,使用pgrep a.out 和 cat \proc\pid\status | grep VmRSS 发现:VmRSS 和文件大小同步增大,直到2.1GB,说明…… 之前的想法是错误的,物理内存被占用了…… 您有解决内存不够用的思路吗? 麻烦您思考下吧
npu_wy 2014-08-07
  • 打赏
  • 举报
回复
引用 12 楼 zhao4zhong1 的回复:
引用 11 楼 npu_wy 的回复:
[quote=引用 10 楼 zhao4zhong1 的回复:] 64位
不过我64位ubuntu sizeof(size_t)为8.....
8个字节不就是64位吗。[/quote]I'm sorry,犯傻了
赵4老师 2014-08-07
  • 打赏
  • 举报
回复
引用 11 楼 npu_wy 的回复:
引用 10 楼 zhao4zhong1 的回复:
64位
不过我64位ubuntu sizeof(size_t)为8.....
8个字节不就是64位吗。
npu_wy 2014-08-07
  • 打赏
  • 举报
回复
引用 10 楼 zhao4zhong1 的回复:
64位
不过我64位ubuntu sizeof(size_t)为8.....
赵4老师 2014-08-07
  • 打赏
  • 举报
回复
64位
赵4老师 2014-08-07
  • 打赏
  • 举报
回复
60位系统的size_t最大值比4GB大。
加载更多回复(6)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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