当前位置: 代码迷 >> 汇编语言 >> 关于内存映射文件的懂得,求指导
  详细解决方案

关于内存映射文件的懂得,求指导

热度:170   发布时间:2016-05-02 04:36:29.0
关于内存映射文件的理解,求指导
本帖最后由 u012941710 于 2014-05-03 11:39:02 编辑
    昨天看到内存映射文件,比较吃力,今天总结了下自己对于内存映射文件的理解,请各位大大帮忙指点一下,看看有什么理解错误或者不到位的地方。
    我的理解是这样的,假如我要使用内存映射文件读写一个文件:
  (1)使用CreateFile打开文件,得到文件句柄hFile
    ( 2 )使用CreateFileMapping创建一个hFile的映射文件句柄,这一步相当于复制一个hFile,但是并没有实质的内容,类似于指针的性质,得到映射文件对象句柄hFileMap
   (3)使用MapViewOfFile在使用映射文件的进程的地址空间里面,为hFileMap分配地址空间,在真正进行数据读写的时候,就为hFileMap分配物理内存,这步得到一个指向映射文件所在内存的指针。
  (4)使用完毕,UnmapViewOfFile,CloseHandle等等善后。
   形象点比喻的话,就是我把钱(数据)存在银行(磁盘)里,要出去旅游,可能会用到钱,但是我的背包(物理内存)背不了那么多钱,于是我就只能带上一张银行卡(映射文件对象hFileMap),到了我要去的地方,要用钱的时候就到附近银行(虚拟内存)去取,银行就会为我调动资金(为映射文件分配内存)。
   
  使用内存映射文件来共享数据的话,就相当于是一张银行卡放在那里,想要用的人自己去拿去取钱这样。


   我是新人,对于很多概念不是很清楚,我想再问问,读写磁盘文件,为什么不直接对磁盘进行操作呢?还要把文件映射出来,不是多此一举?
  另外就是上面的我对映射文件的理解,大神们有空的时候帮忙看看吧谢谢啦!


------解决方案--------------------
读写文件需要显式调用读写文件的函数,如果不是顺序读写还需操作文件指针。
而映射好的文件读写时不需要调用文件读写函数,也不需要操作文件指针。

因此,一个大文件,无法全装入内存,而还要随机访问文件的不同位置,显然映射后会方便不少。

另外,映射文件的读写确实没通过文件系统,因此效率高;但更贴近底层,源码跨编译平台及目标代码跨硬件平台的兼容性显然要差。


“读写磁盘文件,为什么不直接对磁盘进行操作呢?”
底层肯定是对磁盘进行操的,你是指你要自己显式的对磁盘进行操作?
答案是可行的,但前题是你得会才行。
从系统安全与你的应用的兼容性及你的精力等各方面来看,多数人是不会建议你这么做的。
  相关解决方案