注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

中吴南顾惟一笑

成功法则就是那19个字

 
 
 

日志

 
 

关于Windows Memory-Mapped Files和Shared memory  

2016-01-25 16:17:09|  分类: R&D |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

疑问:

    1. 内存映射文件是否比直接I/O读写高效
    2. 访问shared memory是否比private memory慢

    在windows中,上述两者使用了同一实现机制(section objects/file mapping objects)
    当你映射文件到内存时,Windows内存管理器会创建特殊的数据结构将process空间的虚拟内存页某个区域和disk上的文件某区域对应起来。从process看来,此内存区域对它本身已不可见(内存管理器已把它设成invalid,但这个映射关系已被保存起来),接下来应用访问这块映射的内存区域时,处理器产生exception,内存管理器则会捕获并处理这个异常,分配新的physical memory,读取文件内容,remap虚拟页到物理页。

    这种方式比直接用API读高效的原因在于:
    1). 一旦一个页从disk上被fetch后,后续的access无需os干预,而文件操作API会有系统调用的开销
    2). 没有额外的buffer分配释放,由系统完成。也没有额外的buffer间拷贝
    3). 直接提供memory-mapped file的基地址给以内存地址为参数的库函数(例如用简单的memcpy就可以取代文件定位、读写的复杂循环,其实和DLL的加载一个道理,对上层透明)

    不适合的情形,异步I/O,在fetch页的时候,你不能指定continuation或做其它事情。

    Section objects也可以用于process间共享内存。一个process命名了section object之后,其它process可以通过名字来打开此object的handle,两个process可以映射对象的shared region到各自的虚地址空间,即虚拟内存页区域到物理内存页共享区域。注意section object可以基于disk文件(进程间内存文件映射共享,OS的image loader处理DLL的方式)或非disk文件(基于页的纯共享内存区域)。

    应用程序可CPU都不关心内存页是否共享,实际上,在CPU看来,访问private page和访问被映射到其它进程的内存页没有什么区别,所以速度上也是一样的,硬件对此根本不关心。

  评论这张
 
阅读(61)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017