Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Mmap with its applications in git and libgit2

Minqi Pan
January 08, 2016

Mmap with its applications in git and libgit2

Minqi Pan

January 08, 2016
Tweet

More Decks by Minqi Pan

Other Decks in Programming

Transcript

  1. mmap 在 git 与 libgit2
    中的应⽤用
    Minqi Pan

    View Slide

  2. I’m Minqi Pan
    github.com/pmq20
    twitter
    @psvr

    View Slide

  3. mmap
    • ⼆二类⼿手册,系统调⽤用
    • IEEE POSIX 标准 API 之⼀一
    • Linux / Mac OS X / BSD 均⽀支持

    View Slide

  4. ⾏行行为
    • 将⽂文件或设备映射⾄至内存,起初完全不读取⽂文件、
    完全不占⽤用内存,懒读取
    • 进程发起对这片映射空间的访问,引发缺⻚页异常,
    实现⽂文件内容到物理理内存(主存)的拷⻉贝
    • 系统会周期性地⾃自动回写脏⻚页⾯面到对应的⽂文件磁
    盘上,有⼀一段时间的延Ӿ

    View Slide

  5. 与常规⽂文件的区别
    • 常规⽂文件:磁盘 -> ⻚页缓存 -> ⽤用户主存
    • ⻚页缓存在内核空间中,空间不同数据不通
    • mmap:磁盘 -> ⽤用户主存

    View Slide

  6. ⽤用法
    #include
    void * // 返回被映射区域的指针
    mmap(void *addr, // 被映射的⻚页从 addr 开始
    size_t len, // 被映射的⻚页的最⼤大⻓长度
    int prot, // ⻚页的读写跑权限保护
    int flags, // 选项
    int fd, // 映射源
    off_t offset); // 映射源的起点偏移量量

    View Slide

  7. View Slide

  8. 构造 vm_area_struct

    View Slide

  9. 应⽤用
    • 按需分⻚页——仅当缺⻚页(访问虚拟地址但其物理理内存未
    加载)时 OS 才进⾏行行磁盘到内存的拷⻉贝
    • ⻚页缓存——缓存诸如动态库等磁盘数据,通过虚拟内存
    映射共享到使⽤用者的进程空间内
    • ⾼高效IPC——不同进程将⾃自⾝身⽤用户空间映射到同⼀一个⽂文件
    (管道和MQ需要在内核和⽤用户空间进⾏行行四次数据复制)
    • ⼤大数据处理理——内存空间不⾜足时使⽤用

    View Slide

  10. 在 git 应⽤用场景下
    • pack 与 delta window 的概念念
    • delta window 与系统分⻚页⼤大⼩小的关系,避免缺⻚页
    • 这就是为什什么 pack 内的对象顺序⾄至关重要

    View Slide

  11. mmap 在 git 中应⽤用⼗十分⼴广泛

    View Slide

  12. 在 git 中的应⽤用
    use_pack
    pack 的处理理属于⼤大数据处理理,内存空间不⾜足

    View Slide

  13. 在 git 中的应⽤用
    map_sha1_file

    View Slide

  14. 在 git 中的应⽤用
    git_config_set_multivar_in_file
    如果进程A和进程B都映射了了区域C,当A第⼀一次读取C时通
    过缺⻚页从磁盘复制⽂文件⻚页到内存中;但当B再读C的相同⻚页
    ⾯面时,虽然也会产⽣生缺⻚页异常,但是不再需要从磁盘中复
    制⽂文件过来,⽽而可直接使⽤用已经保存在内存中的⽂文件数据。

    View Slide

  15. 在 git 中的应⽤用
    diff_populate_filespec
    While doing rename detection and pickaxe operation, we
    may need to grab the data for the blob (or file) for our own
    in-core comparison.

    View Slide

  16. 在 git 中的应⽤用
    do_read_index

    View Slide

  17. 在 git 中的应⽤用
    check_packed_git_idx
    Open and mmap the index file at path, perform a
    couple of consistency checks

    View Slide

  18. 在 git 中的应⽤用
    do_read_index

    View Slide

  19. 在 git 中的应⽤用
    ⽤用于⼩小⼯工具读⽂文件

    View Slide

  20. 在 git 中的应⽤用
    ⽤用于 pack-bitmap

    View Slide

  21. 在 git 中的应⽤用
    ewah bitmap compression

    View Slide

  22. mmap 在 libgit2 中应⽤用⼗十分有限
    仅⽤用于 pack 和 index

    View Slide

  23. 在 libgit2 中的应⽤用
    new_window

    View Slide

  24. 在 libgit2 中的应⽤用
    (indexer) parse_header

    View Slide

  25. 在 libgit2 中的应⽤用
    (indexer) write_at

    View Slide

  26. 在 libgit2 中的应⽤用
    pack_index_check
    When doing Packed Object lookup query,
    Mmap the index file and do a quick run through
    the header to guess the index version, and to
    verify that the size of the index makes sense.

    View Slide

  27. 在 libgit2 中的应⽤用
    pack_index_check

    View Slide

  28. Thank you
    https://github.com/pmq20/

    View Slide