zoukankan      html  css  js  c++  java
  • 反向映射和写时复制

    4.0的内核后,反向映射以vma为单位,且avc不在链入父辈进程

    那么,在子进程发生写时复制,重新分配内存页后,为什么不将其从父进程的vma的avc中删除此子进程呢?

    wowotech上有个回答很不错, 如下:

    http://www.wowotech.net/memory_management/reverse_mapping.html

    ========================================================

     anon rmap确实存在这个问题,比如进程A fork了进程B,进程B,fork了进程C..如果一个pageA属于进程A且映射到相应的vma,那么在对这个page进行逆向映射时,确实会扫描到3个vma。如果进程C触发写保护异常,分配了一个新页pageC,那么在做pageA的逆向映射时,仍然会扫描到3个vma。我猜测linux这么实现的原因可能是:一个vma可能映射对个page,即使子进程对一个页面触发了写保护异常,但是其它page的映射关系没有发生改变。为了避免逆向映射时找到错误的vma,所以Linux做了以下工作: 
    1.在page_referenced_one中通过page_check_address函数进行校验 
    2.通过mapcount来优化逆向映射的过程,一旦映射到page的pte数量等于了mapcount,就不再继续搜索了

    ========================================================

    那如果父进程某个vma的所有页对于其子进程已经都发生过COW,是否可以将其从AVC中删除掉呢??

    抛些其他疑问:

    1. anon page rmap和file page rmap的区别?
      • address_space的优先树
      • anon_vma的红黑树
    2. 为何不在每个page中定义跟踪映射链?
      • 以page为单位,太浪费内存了,目前page的开销:1G内存大概需要16M;
    3. 一个进程的不同虚拟地址能否映射到同一个物理地址?可以的话,那rmap如何兼容这个case?
    4. demand paging请求调页是啥?等同于page fault?
  • 相关阅读:
    react-native-code-push进阶及实践小结
    Redux 基础
    iOS启动图异常修复方案 -(baidu)
    pod init
    Texture的异步渲染和布局引擎
    iOS 12.1 Tabbar 跳动Bug
    基本绘图的几种方式
    OC 小代码块
    OC基础--类的本质
    OC基础--构造方法 id类型
  • 原文地址:https://www.cnblogs.com/zengjianrong/p/12201411.html
Copyright © 2011-2022 走看看