Mongodb源码分析--内存文件映射(MMAP)

     在Mongodb中,其使用了操作系统底层提供的内存映射机制,即MMAP。MMAP可以把磁盘文件的一部分或全部内容直接映射到内存,这样文件中的信息 位置就会在内存中有对应的地址空间,这时对文件的读写可以直接用指针来做,而不需要read/write函数了。同时操作系统会将数据刷新保存到磁盘上。 如下图:
      

     鉴于linux,window系统为mmap所提供的API大同小异(见下图)。这里仅以mongodb对window系统的mmap调用机制为例,来说 明一下其具体的实现方式,以及在mongodb启动时,客户端提交查询和插入操作请求时mongodb的mmap执行流程。
   

    上面类图中:
    MongoFile :定义了mongo文件对象常用操作,包括创建,关闭,设置名称,flushAll,获取MongoFile文件总尺寸等。
    MMF : 一个类型定义,其声明:typedef MemoryMappedFile MMF;   
    MongoMMF :为了便于journaling/durability操作,对MemoryMappedFile进行了一些封装(特别是对private views )
       
    下面着重看一下windows提供的mmap的常用API:
    MapViewOfFile (): 把文件数据映射到进程的地址空间
    CreateFileMapping () : 创建一个新的文件映射内核对象
    FlushViewOfFile (): 强制系统将内存中修改过的数据重新写入磁盘映像,从而可以确保所有的数据更新能及时保存到磁盘
    CloseHandle (): 关闭文件映射对象和文件对象
    MapViewOfFileEx (): 将文件映射到指定的进程地址空间

    参数说明:



    下面我们看一下mongodb如何使用上述API,来实现windows环境下对mongofile进行mmap操作的.



    上面的代码比较简单,大家看一下注释就可以了,下面看一下mmf对于上面的MemoryMappedFile类实现是如何封装的,因为mmf会在journaling/durability 这类场景下使用PrivateMap():   


 

    mongodb完成了上面的工具类的声明定义之后,就会在前台使用这些类了,下面通过插入数据操作(之前主要流程我已在这篇文章 中有所描述)过程中,对上面类的使用来进行阐述.  

    首先需要说明的是,如果是首次在本地运行mongod,则不会在指定的数据库目录(dbpath 参数)下生成数据库文件,但如果有数据插入时,则会生成相应文件,这里可以理解为生成文件的过程就是mmap的创建过程。
    
    之前的文章中提到过,当客户端要插入记录时,则系统会根据客户端的操作枚举信息来调用相应的操作,这里它会执行instance.cpp 文件中的receivedInsert 方法,并进而调用 pdfile.cpp 文件的 insert ()函数,而在该方法下有如下一段代码:

   



    上面的allocExtent方法用于分配Extent要求的磁盘空间,其中Extent用于记录多个record记录信息,而record就是数据库中 的一条记录。这里可以将Extent看成是一个数据集合,但与我们通常所理解的"数据表"(datatable)有所差异,因为在同一个 namespace下可以有一个或多个extent(可以不连续),extent之间是一个双向链表结构,其通过cursor进行向前(forward) 或反转(reverse)的访问。有关这些内容,参见我之前写的这篇文章 。  

    言归正传,在上面的allocExtent方法中,会执行pdfile.cpp中的如下方法:

  

 

    最后在addAFile方法中,我们会看下如下代码段:



    下面用一张时序图来大体回顾一下这一流程:
  

    在创建了该数据库文件及相应mmap操作之后,下面再重新启动mongod时,系统会通过构造client类的上下文对象 (context)方法来最终调用namespaceIndex.init()方法,其时序图如下,大家可以通过调试源码来难证这一流程:
  

    好了,今天的内容到这里就告一段落。

    参考链接:

             http://www.cnblogs.com/daizhj/archive/2011/03/30/1999699.html

             http://en.wikipedia.org/wiki/Mmap
             http://linux.about.com/library/cmd/blcmdl2_mmap.htm
             http://msdn.microsoft.com/en-us/library/aa366761.aspx
             http://hi.baidu.com/%B2%A4%B2%CB%B1%F9%B1%F9/blog/item/f6e6fb2561c0136a35a80f70.html

    原文链接:http://www.cnblogs.com/daizhj/archive/2011/04/25/mongos_mmap_source_code.html

    作者: daizhj, 代震军   
    微博: http://t.sina.com.cn/daizhj
    Tags: mongodb,c++,mmap

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值