13. 反向映射RMAP

问题:

  • 在linux 2.6.x 内核中,如何从一个page找到所有映射该页面的VMA?反向映射可以带来哪些便利?

答:在linux2.6.x内核中,page->mapping指向的是anon_vma,当fork的时候,创建子进程后,当子进程发生了COW时,子进程的page->mapping也是指向了父进程的anon_vma(这句话特别重要),所以在一个page要找到所有映射该页面的VMA时,必须遍历父进程和子进程的所有VMA。在现在的新反向映射机制中,子进程发生了COW后,子进程的page->mapping执行的是子进程的anon_vma结构,而不是指向父进程的anon_vma

  • 阅读linux4.0内核RAMP机制的代码,画出父子进程之间VMA、AVC、anon_vma和page等数据结构之间的关系图。

答:

  • 在linux2.6.34中,RMAP机制采用了新的实现,在linux2.6.33和之前的版本中称为旧版本RMAP机制。那么在旧版本RMAP机制中,如果父进程有1000个子进程,每个子进程都有一个VMA,这个VMA里面有1000个匿名页面,当所有的子进程的VMA同时发生写时复制会是什么情况呢?

答:有100万个匿名页面指向父进程的AVp数据结构。每个匿名页面在做反向映射时,最糟糕的情况下需要扫描这个AVp队列全部成员,但是AVp队列大部分的成员(VMA)并没有映射这个匿名页面。这个扫描的过程是需要全程持有锁的,锁的争用变得激烈,导致有一些性能测试中出现问题。

    用户进程在使用虚拟内存过程中,从虚拟内存页面映射到物理内存页面,PTE页表项保留着这个记录,page数据结构中的_mapcount成员记录有多少个用户PTE页表项映射了物理页面。用户PTE页表项是指用户进程地址空间和物理页面建立映射的PTE页表项,不包括内核地址空间映射物理页面产生的PTE页表项。有的页面需要被迁移,有的页面长时间不使用需要被交换到磁盘。在交换之前,必须找到哪些进程使用了这个页面,然后断开这些映射的PTE。一个物理页面可以同时被多个进程的虚拟内存映射,一个虚拟页面同时只能有一个物理页面与之映射。

    在linux2.4内核中,为了确定某一个页面是否被某个进程映射,必须遍历每个进程的页表,工作量相当大,效率很低。在linux2.5 开发期间,提出了反向映射(the object-based reverse-mapping VM, RMAP)的概念

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

byd yes

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值