锁定老帖子 主题:File Mapping析疑
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-01-12
问题一、Mapping有“映射”之意,那么在该语境中形成映射关系的双方是谁,也就是从哪里映射到哪里呢?
上面这个图大家应该都很熟悉,它是Linux中进程的内存映象。我们可以看到,在4G的地址空间中,我们先从下往上看, 0~0x08047ffff(大概128M左右)是系统保留的,不能使用。read-only segment和read/write segment用以存放系统加载器从可执行文件中载入的代码段以及数据段等内容。运行时堆大家应该都比较清楚,是动态分配内存的地方,我们通过malloc和free等函数动态在堆中分配和释放内存,堆的大小是往上增长的,最大可达到0x3FFFFFFF处。好,到这里我们在从上往下看,0xc0000000以上是核心虚拟内存,专门为操作系统核心的数据结构以及代码预留的,一般用户进程无权使用。然后就到了栈区了,这里是系统保存跟函数操作有关的数据,如局部变量,函数参数等内容。与堆不一样,栈是从上往下增长的,其栈顶通过寄存器esp指出。那么被堆和栈夹着的区域是干什么的呢?原来,那是用来放动态共享库的。动态共享库是在程序被载入时或者运行过程中载入到进程内存空间中的,它存放的地方就是我们称作内存映射区的这个地方。
问题四、什么情况适合使用 File Mapping呢?看看人家的建议:
You should not use file mapping in the following situations:
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-01-16
图片看不到哩
|
|
返回顶楼 | |
发表时间:2007-01-17
File Mapping有两个好处:
1. 共享内存 在保护模式下,File Mapping是最基本的跨进程共享数据的方法,通过使用相同名字的file mapping就可以使多个进程使用同一块内存区,得到相同的数据. 这一点完全基于CPU的保护模式运行机理. 2. 提高文件访问速度 实际上这个提速原理就是cache, file mapping根据需求是将文件数据大量读到了内存中,速度自然快,特别适合那些需要不停的随机或跳转访问文件的程序,速度得以大幅提高. 这一点文中的解释是错误的,无论file mapping还是直接的文件操作,其访问文件的途径和方法都是一样,所谓的页读取在普通的文件访问中也是一样存在的,只是物理的页因为系统的多任务性以及应用的更大需求而往往会被新的页覆盖,或则下一次的访问超过了物理页cache的范围需要重新读取,从而导致多次的寻道读取,这一点硬盘的cache的机理就可以明白.简单说就是利用操作系统来做了一个大的硬盘cache. 至于一定要用file mapping来解决大文件,其实完全没有太大的意义. 明白了file mapping的原理,如果单纯只是为了操作大文件,那么你完全可以自己去allocate buffer,然后作交换访问,当然这样你要多写很多代码,所以才有人推荐file mapping访问大文件,而并非file mapping就是用来访问大文件的. |
|
返回顶楼 | |
发表时间:2007-01-18
Arath 写道 File Mapping有两个好处:
我觉得原文中的解释似乎是对的。
1. 共享内存 在保护模式下,File Mapping是最基本的跨进程共享数据的方法,通过使用相同名字的file mapping就可以使多个进程使用同一块内存区,得到相同的数据. 这一点完全基于CPU的保护模式运行机理. 2. 提高文件访问速度 实际上这个提速原理就是cache, file mapping根据需求是将文件数据大量读到了内存中,速度自然快,特别适合那些需要不停的随机或跳转访问文件的程序,速度得以大幅提高. 这一点文中的解释是错误的,无论file mapping还是直接的文件操作,其访问文件的途径和方法都是一样,所谓的页读取在普通的文件访问中也是一样存在的,只是物理的页因为系统的多任务性以及应用的更大需求而往往会被新的页覆盖,或则下一次的访问超过了物理页cache的范围需要重新读取,从而导致多次的寻道读取,这一点硬盘的cache的机理就可以明白.简单说就是利用操作系统来做了一个大的硬盘cache. 至于一定要用file mapping来解决大文件,其实完全没有太大的意义. 明白了file mapping的原理,如果单纯只是为了操作大文件,那么你完全可以自己去allocate buffer,然后作交换访问,当然这样你要多写很多代码,所以才有人推荐file mapping访问大文件,而并非file mapping就是用来访问大文件的. 映射文件可以把系统中的内存直接映射到你的用户空间中去,好像是由缺页中断还是什么来控制什么时候从真实的文件中读入,他不是从系统空间复制到用户空间,因此少了系统中断调用的时间以及内存COPY的时间。跟cache根本没关系。特别是大文件的读写这样很有效率。filemap并没有将文件大量读到内存中去。 |
|
返回顶楼 | |
发表时间:2007-01-18
文件访问速度的瓶颈在于磁盘访问速度的相对低下,filemapping的优势主要就在于用户自控制的cache方式.
而且也不存在什么系统空间到用户空间的copy问题,保护模式是物理内存与地址脱离的. 以下是filemapping的工作图,其中主要体现了file mapping作为share memory的形成: |
|
返回顶楼 | |
发表时间:2007-01-18
对了上图中Physical memory->Process Virtual Memory绝对不是拷贝,只是影射!
|
|
返回顶楼 | |
发表时间:2007-01-18
我只说LINUX系统下的我的理解
mmap打开时,OS并不把所有的文件内容都读到内核空间去。 进程调用mmap()时,只是在进程空间内新增了一块相应大小的缓冲区,并设置了相应的访问标识,但并没有建立进程空间到物理页面的映射。文件应被映射到进程空间的起始地址,一般被指定一个空指针,此时选择起始地址的任务留给内核来完成。因此,第一次访问该空间时,会引发一个缺页异常。在这个时候才会去读物理文件。 这里面的cache就是vfs下层的cache,并没有另外的cache,除非你自己编程写cache,跟read,write里用的系统cache似乎并没有太大的差别。 大文件的效率因为文件大,内核->用户的COPY会很多(LINUX下有函数名字好像就叫copy_to_user,copy_to_kernel),这种做法跟sendfile,TransmitFile这种直接内核COPY的想法是一样的。 |
|
返回顶楼 | |
发表时间:2007-01-18
filemap才是影射,
read,write是COPY+中断调用(或者是sysenter)。 |
|
返回顶楼 | |
发表时间:2007-01-18
自己做了一个测试
http://www.iteye.com/topic/48412 file mapping不能将读写隔离吧;) |
|
返回顶楼 | |
发表时间:2007-01-19
引用 最初接触File Mapping是为了能够方便地处理一个几百兆的大文件
只是为了说明我接触File Mapping的原因,并不是说FileMapping只能用于处理大文件 使用File Mapping处理文件有两个好处: 1、文件快速访问。普通的文件读写使用系统调用(read,write)数据先从磁盘拷贝到内核空间,再从内核空间拷贝到用户进程空间,这个模型在《Unix环境高级编程》中有详细描述的。File Mapping采用虚拟内存管理机制来处理文件读写,不需要中间的拷贝过程,因此效率要比普通的文件读写要快。 2、简单高效。File Mapping由OS管理同步和缓冲,将文件映射成用户进程中的一维地址空间,因此用户可以像使用数组那样使用文件,很多库函数得以重用。 PS:google "memory mapping"得到的资料好像要多一些 |
|
返回顶楼 | |