zoukankan      html  css  js  c++  java
  • 复合页( Compound Page )

         复合页(Compound Page)就是将物理上连续的两个或多个页看成一个
         独立的大页,它能够用来创建hugetlbfs中使用的大页(hugepage)。
         也能够用来创建透明大页(transparent huge page)子系统。可是
         它不能用在页缓存(page cache)中,这是由于页缓存中管理的都是
         单个页。


         分配一个复合页的方式是:使用alloc_pages函数,參数order至少为1,
         且设置__GFP_COMP标记。由于依据复合页的定义,它通常包含2个或多
         个连续的物理内存页,这是由它的实现决定的,因而order參数不可能
         为0。


         通常调用alloc_pages的内存分配方式例如以下:


         p = alloc_pages(GFP_KERNEL, 2);


         可是这样的方式和创建一个复合页有什么不同呢?不同点就是在创建复合
         页的时候会创建与这个复合页相关的元数据(metadata)。




         表示复合页的元数据都存在于Page结构体中,Page页中的flag标记用来
         识别复合页。

    在复合页中,打头的第一个普通页成为“head page”,用
         PG_head标记,而后面的全部页被称为“tail pages”,用PG_tail标记。
         在64位系统中,能够有多余的标记来表示复合页的页头和页尾;可是在
         32位系统中却没有那么多的标记,因此採用了一种复用其它标记的方案,
         即将复合页中的全部页都用PG_compound标记,然后,对于尾页同一时候也
         使用PG_reclaim标记。这是由于PG_reclaim仅仅有在页缓存中会用到,而

         复合页根本就不会在页缓存中使用。


         能够使用PageCompound函数来检測一个页是否是复合页,另外函数PageHead
         和函数PageTail用来检測一个页是否是页头或者页尾。

    在每一个尾页的page
         结构体中都包括一个指向头页的指针 - first_page,能够使用compound_head
         函数获得。


         那么当一个复合页不再被系统使用时,我们怎样知道该复合页包括多少
         个普通页。又怎样知道该复合页的析构函数(destructor)存在哪里呢?
         首先,人们可能会觉得这些信息存在于头页的page结构体中,可是非常不
         幸,在这个结构体中已经没有可用的空间了。

    因此,这些信息所有存储
         在第一个尾页的lru字段中,将该复合页的大小(order)首先强制转换
         为指针类型,然后存储在lru.prev中,将析构函数存储在lru.next中。


         这里就解释了为什么复合页必须至少是两个页。


         在内核中生命了两个复合页的析构函数。默认情况下会调用free_compound_page
         来将全部的页返回给系统的页框分配器。而hugetlbfs子系统会调用free_huge_page
         来做一些统计并释放。


         使用复合页的最经典的一个样例就是THP(transparent huge page)。
         另外一些驱动使用复合页来方便缓存的管理。


    ref
    ===
    1. https://lwn.net/Articles/619514/

  • 相关阅读:
    iOS-技巧性总结
    使用Xcode进行调试
    iOS-屏幕适配-UI布局
    iOS开发简单介绍
    iOS-网络处理
    iOS-数据解析XML解析的多种平台介绍
    iOS-数据持久化基础-JSON与XML数据解析
    iOS-数据持久化-第三方框架FMDB的使用
    ASP.NET的内置对象
    线性表
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/6979511.html
Copyright © 2011-2022 走看看