关于内存映射文件的理解,求指导

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

使用内存映射文件来共享数据的话,就相当于是一张银行卡放在那里,想要用的人自己去拿去取钱这样。


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

...全文
79 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
1cctv 2014-05-04
  • 打赏
  • 举报
回复
读写文件需要显式调用读写文件的函数,如果不是顺序读写还需操作文件指针。 而映射好的文件读写时不需要调用文件读写函数,也不需要操作文件指针。 因此,一个大文件,无法全装入内存,而还要随机访问文件的不同位置,显然映射后会方便不少。 另外,映射文件的读写确实没通过文件系统,因此效率高;但更贴近底层,源码跨编译平台及目标代码跨硬件平台的兼容性显然要差。 “读写磁盘文件,为什么不直接对磁盘进行操作呢?” 底层肯定是对磁盘进行操的,你是指你要自己显式的对磁盘进行操作? 答案是可行的,但前题是你得会才行。 从系统安全与你的应用的兼容性及你的精力等各方面来看,多数人是不会建议你这么做的。
大狮兄 2014-05-04
  • 打赏
  • 举报
回复
十分感谢楼上的!

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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