免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9036 | 回复: 5
打印 上一主题 下一主题

mmap 为什么比普通的读文件方式快 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-10-16 23:12 |只看该作者 |倒序浏览
本帖最后由 546144153 于 2011-10-17 21:29 编辑

最近和同事讨论,他说mmap一定是比普通的读取文件方式快的。可是mmap是把文件读进内存里,第一次没有的时候 也会引发缺页中断。这比普通读文件的方式相比没什么优势。如果普通读文件的方式,能次次都命中cache的话,结果会不会比mmap更快呢?
    另外写的时候,写的时候大家都是往内存里写脏数据,等待系统回写。这也不应该比普通的读写性能好啊,大家都来说下,mmap为什么快呢,比普通的读文件方式优势在哪?我觉得很困惑。

论坛徽章:
0
2 [报告]
发表于 2011-10-17 09:10 |只看该作者
很想知道为什么没有人回复呢? 难道我这个问题问的太简单了吗 ,大家都觉得没必要回答?
新手,大家还是要多多包含哦

论坛徽章:
0
3 [报告]
发表于 2011-10-17 09:21 |只看该作者
回复 2# 546144153


     来学习 这问题很专业啊    不像新手

论坛徽章:
4
CU大牛徽章
日期:2013-03-13 15:29:07CU大牛徽章
日期:2013-03-13 15:29:49CU大牛徽章
日期:2013-03-13 15:30:192015年迎新春徽章
日期:2015-03-04 09:57:09
4 [报告]
发表于 2011-10-17 14:24 |只看该作者
“mmap与read/write两条路线对文件的访问比较
无论是通过mmap方式或read/write方式访问文件在内核中都必须经过两个缓存:一个是用a
ddress_space来组织的以页为基础的缓存;一个是以buffer来组织的缓存,但实际上这两
个缓存只是同一个缓冲池里内容的不同组织方式。当需要从文件读写内容时,都经过 add
ress_space_operation中提供的函数也就是说路径是一致的。
如果是用read/write方式,用户须向内核指定要读多少,内核再把得到的内容从内核缓冲
池拷向用户空间;写也须要有一个大致如此的过程。mmap的优势在于通过把文件的某一块
内容映射到用户空间上,用户可以直接向内核缓冲池读写这一块内容,这样一来就少了内
核与用户空间的来回拷贝所以通常更快。但 mmap方式只适用于更新、读写一块固定大小的
文件区域而不能做像诸如不断的写内容进入文件导到文件增长这类的事。”

FROM: http://hi.baidu.com/interxuxing/ ... 919ed2ac6e750d.html

论坛徽章:
0
5 [报告]
发表于 2011-10-17 17:54 |只看该作者
Linux通过内存映像机制来提供用户程序对内存直接访问的能力。内存映像的意思是把内核中特定部分的内存空间映射到用户级程序的内存空间去。也就是说,用户空间和内核空间共享一块相同的内存。这样做的直观效果显而易见:内核在这块地址内存储变更的任何数据,用户可以立即发现和使用,根本无须数据拷贝。而在使用系统调用交互信息时,在整个操作过程中必须有一步数据拷贝的工作——或者是把内核数据拷贝到用户缓冲区,或只是把用户数据拷贝到内核缓冲区——这对于许多数据传输量大、时间要求高的应用,这无疑是致命的一击:许多应用根本就无法忍受数据拷贝所耗费的时间和资源。
我们曾经为一块高速采样设备开发过驱动程序,该设备要求在20兆采样率下以1KHz的重复频率进行16位实时采样,每毫秒需要采样、DMA和处理的数据量惊人,如果要使用数据拷贝的方法,根本无法达成要求。此时,内存映像成为唯一的选择:我们在内存中保留了一块空间,将其配置成环形队列供采样设备DMA输出数据。再把这块内存空间映射到在用户空间运行的数据处理程序上,于是,采样设备刚刚得到并传送到主机上的数据,马上就可以被用户空间的程序处理。
实际上,内存影射方式通常也正是应用在那些内核和用户空间需要快速大量交互数据的情况下,特别是那些对实时性要求较强的应用。X window系统的服务器的虚拟内存区域,就可以被看做是内存映像用法的一个典型例子:X服务器需要对视频内存进行大量的数据交换,相对于lseek/write来说,将图形显示内存直接影射到用户空间可以显著提高效能。
并不是任何类型的应用都适合mmap,比如像串口和鼠标这些基于流数据的字符设备,mmap就没有太大的用武之地。并且,这种共享内存的方式存在不好同步的问题。由于没有专门的同步机制可以让用户程序和内核程序共享,所以在读取和写入数据时要有非常谨慎的设计以保证不会产生干绕。
mmap完全是基于共享内存的观念了,也正因为此,它能提供额外的便利,但也特别难以控制。
由内核主动发起的信息交互

在内核发起的交互中,我们最关心和感兴趣的应该是内核如何向用户程序发消息,用户程序又是怎样接收这些消息的,具体问题通常集中在下面这几个方面:内核可否调用用户程序?是否可以通过向用户进程发信号来告知用户进程事件发生?
前面介绍的交互方法最大的不同在于这些方式是由内核采取主动,而不是等系统调用来被动的返回信息的。
来源:http://www.kerneltravel.net/jiaoliu/005.htm

可能我还有点困惑的原来内核缓冲区和用户缓冲区是分开的,一直以为他们会用一个缓冲区呢。
那mmap应该是赋予了用户进程直接访问内核缓冲区的能力。
感谢dooros 欢迎大家继续讨论。

论坛徽章:
0
6 [报告]
发表于 2011-10-17 18:16 |只看该作者
另外 上面所说的用户空间缓冲区是操作系统维护的还是用户进程自己维护的?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP