zoukankan      html  css  js  c++  java
  • file mmap

    do_set_pmd
    

    统计参数只会在这里设置:

    add_mm_counter(vma->vm_mm, MM_FILEPAGES, HPAGE_PMD_NR);
    

     但是这貌似都是处理大页的情况哪,小页呢?

    alloc_set_pte中有函数:inc_mm_couter_fast(vma->vm_mm, mm_couter_file(page))
    

     其中,mm_counter_file是在include 目录下设置的,注意一下,这个函数返回的是页的类型,有两种类型,一种是:

    1446 static inline int mm_counter_file(struct page *page)
    1447 {
    1448     if (PageSwapBacked(page))  //如果这个页是被swap出去了,那么这个页就是MM_SHMEMPAGES,
    1449         return MM_SHMEMPAGES;
    1450     return MM_FILEPAGES;
    1451 }
    1452 
    

    SHMEMPAGES 感觉和ANON/FILE是两种不同的考察维度呀,也就是说匿名页和filebacked的页都是可以当做SHMEM来用的。好像不对啊,匿名页就是匿名页,如果是可以共享的,也就是说MAP_ANONYMOUS  和 MAP_SHARED 是可以同时设置的?【结论MAP_ANONYMOUS和MAP_SHARED是不可以同时设置的】,

    PRIVATE 和 SHARED 都是对于文件来说的,是说多个

    [什么叫做共享内存的页呀: 下面这个patch中加了这个统计项,patch大致思想是:目前共享内存的页,都和file-backed的文件一起去统计了(实际共享内存后面挂载的设备是/dev/zero,我们没办法看到共享内存的页了,所以这个patch就是解决的就是区分这两种页]

    eca56ff906bdd0239485e8b47154a6e73dd9a2f3
    

     那么下面一个问题还是没有解决,为什么mm_counter_file中统计出来的page只会去统计MM_SHMEM / MM_FILE

     除了匿名页之外,有两种页:共享内存的页还有文件backed的页

    MAP_ANONYMOUS 是不能单独出现的

    SHMEMPAGES既可以当做

     这一部分好好讲讲文件系统的mmap file-backed

    [ 一个进程所有的页的类型包括:匿名页,文件backed的页,共享内存的页,swap出去的页.]

    私有的文件映射如果改动的话会发生啥事情

    《Linux环境编程》对该部分的解释有亮点,但是避重就轻,过多地去讲在MAP_SHARED的情况下,内存映射是如何完成的,比较难理解的是私有映射是如何完成的:

    如果我设置了私有的映射,并且还具有写权限,这个时候如果发生了写,操作系统是如何实现的呢?这种情况也分明是存在的!

    猜想:这个时候会发生写时写时复制机制,不会影响到文件的内容:【测试程序:

    https://github.com/honpey/codebox/blob/master/mmap/mmap_file_private.c
    

    设置了文件的MAP_PRIVATE 标志之后,我们发现,此时写入的任何东西都不会保存,所以我们就大胆猜想,初始化时,是做了一个映射,但是第一次访问之后,发生了缺页中断,而这个缺页中断的作用是从pagecache中copy一份数据到新的page中,即所谓的写时复制!这是file-backed mmap类型的写时复制。

    这个

  • 相关阅读:
    java实现模拟登陆
    springboot整合kafka(转)
    springboot使用缓存(三)
    springboot使用缓存(二)
    springboot使用缓存(一)
    springboot日期入参出参格式化注解:@DateTimeFormat 和 @JsonFormat (转)
    H5调用android相机拍照
    时间复杂度
    java guide面试突击版
    java面试手册-复制内容
  • 原文地址:https://www.cnblogs.com/honpey/p/7751834.html
Copyright © 2011-2022 走看看