13.4 RMAP小结
作者:互联网
早期的linux2.6的rmap实现如下图:
父进程的VMA中有一个struct anon_vma数据结构(简称AVp),page->mapping指向AVp数据结构,另外父进程和子进程所有映射了页面的VMA时,只需要从物理页面的page->mapping找到AVp,再遍历AVp链表即可。当子进程的虚拟内存发生写时复制COW时,新分配的页面COW_Page->mapping依然指向父进程的AVp数据结构。这个模型非常简单,而且通俗易懂,但也有致命弱点。特别是在负载重的服务器中,例如父进程有1000个子进程,每个子进程都有一个VMA,这个VMA中有1000个匿名页面,当所有的子进程的VMA中的所有匿名页面都同时发生写时复制时,情况会很糟糕。有100万个匿名页面指向父进程的AVp数据结构。每个匿名页面在做反向映射时,最糟糕的情况下需要扫描这个AVp队列全部成员,但是AVp队列大部分的成员(VMA)并没有映射这个匿名页面。这个扫描的过程是需要全程持有锁的,锁的争用变得激烈,导致有一些性能测试中出现问题。
linux2.6.34内核对RMAP方向映射系统进行了优化,模型和现在Linux4.0内核中模型相似,如下图:
新增加了AVC数据结构(struct anon_vma_chain),父进程和子进程都有各自的AV数据结构且都有一颗红黑树(简称AV红黑树),此外,父进程和子进程都有各自的AVC挂入进程AV红黑树中。还有一个AVC作为纽带来联系父进程和子进程,我们暂且称它为AVC枢纽。AVC枢纽挂入父进程的AV红黑树中,因此所有子进程都有一个AVC枢纽用于挂入父进程的AV红黑树。需要反向映射遍历时,只需要扫描符进程中的AV红黑树即可。当子进程VMA发送COW时,新分配的匿名页面cow_page->mapping指向子进程自己的AV数据结构,因此在反向映射时不需要扫描所有的子进程。
旧版反向映射和新版反向映射最大的区别是子进程的page->mapping指向子进程的AV数据结构,所以在做反向映射查询时,就只有遍历自身的AVC。
标签:RMAP,映射,AVp,AV,进程,13.4,数据结构,小结,页面 来源: https://blog.csdn.net/dai_xiangjun/article/details/118863792