【mmap】求教此种情况下使用mmap的效率

hazuki9902 2012-01-01 02:29:28
文件大小:64MB左右,大概43万行,每行151字符

操作:对该文本文件每次顺序读出大概10KB打印直到读完

会有多个用户进程同时进行此操作,并且能保证所有用户进程都只是读操作,不写

一种办法是不用mmap,每个用户进程都各自对文件指针操作

另一种办法是以共享、只读、常驻内存模式使用mmap将文件映射到内存,每个用户进程直接访问映射的内存

环境:linux2.6.X CPU:mips或arm 物理内存:256MB

不知道哪种方式相对来说更省资源更快呢?(优先保证资源)

另外有几点不太明白(本人linux菜鸟):
1、mmap映射后是在系统空间还是在用户空间?
2、多个不同的进程分别对同一文件执行mmap后,是不是任何时刻都只有一份副本在内存中并且进程切换时不会涉及该内存,或者说进程切换时对该内存的维护开销灰常灰常小?(如果是这样的话很爽哦~)
3、页的问题会不会严重影响此种应用?比如:根本不能实现每次打印10KB。页大小按默认4KB算~
4、以上环境和应用,还有什么高效的办法实现吗?

不常上CSDN~也没看到linux专区,借宝地求教~
3天内必结贴散分!
...全文
222 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hazuki9902 2012-01-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cfjtaishan 的回复:]
1.映射的是在内核的空间。
2.进程的切换和维护产生的开销不小,如果你创建的进程不适当,比如很多事情反而会相反,因为进程之间的切换所占用的资源和时间已经是得不偿失了。
3.那就是占用多个页。我想你在内核中也不见得会申请这么多的空间的,内核空间是宝贵的。
4.你可以尝试使用线程,线程占用资源比较小,切换起来比较快;
[/Quote]
受教了~想进一步问问:
1.映射的是在内核的空间。
没问题

2.进程的切换和维护产生的开销不小,如果你创建的进程不适当,比如很多事情反而会相反,因为进程之间的
切换所占用的资源和时间已经是得不偿失了。
进程切换是难以避免的,因为读文件操作可能只是每个进程中的一个次要任务,多个进程创建后不是只为了干这个的,所以环境是一个既成事实,只能迁就不能改,呵呵。这里所要比较的是两种方法对于切换进程时所花费的开销,对于只有256MB的物理内存来说,换页应该是比较频繁的吧

3.那就是占用多个页。我想你在内核中也不见得会申请这么多的空间的,内核空间是宝贵的。
恩~内核空间的问题可能是个隐患~不知是否为mmap的最大缺点呢

4.你可以尝试使用线程,线程占用资源比较小,切换起来比较快;
线程太麻烦,不搞,呵呵^_^
hazuki9902 2012-01-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 qq120848369 的回复:]
不知道你想干什么, open,然后mmap,munmap慢慢挪就行了。
[/Quote]
实现没问题,只是不知道哪种实现起来更舒服~
hazuki9902 2012-01-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 anyidan 的回复:]
2、多个不同的进程分别对同一文件执行mmap后,是不是任何时刻都只有一份副本在内存中并且进程切换时不会涉及该内存,或者说进程切换时对该内存的维护开销灰常灰常小?(如果是这样的话很爽哦~)

物理内存里面刚开始只有一份,如果有进程对共享的部分进行了写操作,则此进程将创造一份 copy
[/Quote]
已经说了,不写
qq120848369 2012-01-01
  • 打赏
  • 举报
回复
不知道你想干什么, open,然后mmap,munmap慢慢挪就行了。
AnYidan 2012-01-01
  • 打赏
  • 举报
回复
2、多个不同的进程分别对同一文件执行mmap后,是不是任何时刻都只有一份副本在内存中并且进程切换时不会涉及该内存,或者说进程切换时对该内存的维护开销灰常灰常小?(如果是这样的话很爽哦~)

物理内存里面刚开始只有一份,如果有进程对共享的部分进行了写操作,则此进程将创造一份 copy
2012-01-01
  • 打赏
  • 举报
回复
1、mmap映射后是在系统空间还是在用户空间?

用户空间可见。

2、多个不同的进程分别对同一文件执行mmap后,是不是任何时刻都只有一份副本在内存中并且进程切换时不会涉及该内存,或者说进程切换时对该内存的维护开销灰常灰常小?(如果是这样的话很爽哦~)

物理内存里面只有一份,但是每个进程映射到的地址是不一样的,所以该切的页表还是得切……
但是一定会比每个进程都去 read 要省内存。

3、页的问题会不会严重影响此种应用?比如:根本不能实现每次打印10KB。页大小按默认4KB算~

这两个问题有关系么?

4、以上环境和应用,还有什么高效的办法实现吗?

我觉得这个办法靠谱。
自信男孩 2012-01-01
  • 打赏
  • 举报
回复
1.映射的是在内核的空间。
2.进程的切换和维护产生的开销不小,如果你创建的进程不适当,比如很多事情反而会相反,因为进程之间的切换所占用的资源和时间已经是得不偿失了。
3.那就是占用多个页。我想你在内核中也不见得会申请这么多的空间的,内核空间是宝贵的。
4.你可以尝试使用线程,线程占用资源比较小,切换起来比较快;

69,382

社区成员

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

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