Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

构造 vm_area_struct

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

在 git 中的应⽤用 map_sha1_file

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

在 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.

Slide 16

Slide 16 text

在 git 中的应⽤用 do_read_index

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

在 git 中的应⽤用 do_read_index

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

在 git 中的应⽤用 ewah bitmap compression

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

在 libgit2 中的应⽤用 new_window

Slide 24

Slide 24 text

在 libgit2 中的应⽤用 (indexer) parse_header

Slide 25

Slide 25 text

在 libgit2 中的应⽤用 (indexer) write_at

Slide 26

Slide 26 text

在 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.

Slide 27

Slide 27 text

在 libgit2 中的应⽤用 pack_index_check

Slide 28

Slide 28 text

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