复合页(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/

复合页( Compound Page )的更多相关文章

  1. 刨根究底字符编码之七——ANSI编码与代码页(Code Page)

    ANSI编码与代码页(Code Page) 一.ANSI编码 1. 如前所述,在全世界所有国家和民族的文字符号统一编码的Unicode编码方案问世之前,各个国家.民族为了用计算机记录并显示自己的字符, ...

  2. 大页(Huge Page)简单介绍

    x86(包括x86-32和x86-64)架构的CPU默认使用4KB大小的内存页面(getconf PAGESIZE),但是它们也支持较大的内存页,如x86-64系统就支持2MB大小的大页(huge p ...

  3. 工作于内存和文件之间的页缓存, Page Cache, the Affair Between Memory and Files

    原文作者:Gustavo Duarte 原文地址:http://duartes.org/gustavo/blog/post/what-your-computer-does-while-you-wait ...

  4. 描述各自页面的 page

    一个小程序页面由四个文件组成(注意:为了方便开发者减少配置项,描述页面的四个文件必须具有相同的路径与文件名).分别是: 页面 Page(JS文件) Page(Object) 函数用来注册一个页面.接受 ...

  5. 教你如何修改FireFox打开新标签页(NewTab Page)的行列数

    FireFox的打开新建标签页(即NewTab Page)默认只能显示3x3个网站缩略图,这9个自定义的网站,非常方便快捷,什么hao123的弱爆了,本人从未用过此类导航网站,曾经用过的也只是abou ...

  6. 实现加载页Loading Page 的几种方法

    网页也可以像原生应用那样加入进度条或者其他的loading效果带来更好的等待体验,这里归纳几种我收集的实现loading page的方法,这几种方法在交互上都有利有弊,适用于不同应用.(PS:以下方法 ...

  7. JSP页面的Page指令指定编码和Meta标签编码

    JSP代码如下: <%@ page language="java" contentType="text/html; charset=UTF-8" page ...

  8. SQL Server 存储(4/8):理解Page Free Space (PFS) 页

    我们已经讨论了GAM与SGAM页,数据页(Data Page) ,现在我们来看下页面自由空间页(Page Free Space (PFS) ). PFS在数据文件里是第2页(页号1,页号从0开始),接 ...

  9. SQL Server :理解Page Free Space (PFS) 页

    原文:SQL Server :理解Page Free Space (PFS) 页 我们已经讨论了GAM与SGAM页,数据页(Data Page) ,现在我们来看下页面自由空间页(Page Free S ...

随机推荐

  1. Bzoj 3307 雨天的尾巴(线段树合并+树上差分)

    C. 雨天的尾巴 题目描述 N个点,形成一个树状结构.有M次发放,每次选择两个点x,y对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.完成所有发放后,每个点存放最多的是哪种物品. 输入格式 第 ...

  2. ORACLE中DBMS_SQL的用法

    ORACLE中DBMS_SQL的用法   对于一般的select操作,如果使用动态的sql语句则需要进行以下几个步骤: open   cursor---> parse---> define ...

  3. Atcoder regular Contest 073(C - Sentou)

    Atcoder regular Contest 073(C - Sentou) 传送门 每个人对开关的影响区间为a[i]--a[i]+t,因此此题即为将所有区间离散化后求所有独立区间的长度和 #inc ...

  4. Shrio Demo

    package com.atguigu.shiro.helloworld; import org.apache.shiro.SecurityUtils; import org.apache.shiro ...

  5. jmeter接口测试实战简例

    1.接口需求文档说明 2.打开jmeter,新建线程组,线程组里面默认配置就可以 3.建立http请求,我这里是http请求,所以我选择这个,跟进实际情况 4.post请求说明,post直接加参数和参 ...

  6. Leetcode 218.天际线问题

    天际线问题 城市的天际线是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓.现在,假设您获得了城市风光照片(图A)上显示的所有建筑物的位置和高度,请编写一个程序以输出由这些建筑物形成的天际线(图B). ...

  7. NOIP2013提高组D2T3 华容道

    n<=30 * m<=30 的地图上,0表示墙壁,1表示可以放箱子的空地.q<=500次询问,每次问:当空地上唯一没有放箱子的空格子在(ex,ey)时,把位于(sx,sy)的箱子移动 ...

  8. Linux下C编程入门(1)

    Linux系统的介绍(以下以Manjaro最新版为例子): 一.系统的安装: 1.可以直接使用U盘做一个live usb的启动盘,在bios中设置从U盘启动即可拥有linux系统,如果是新式bios需 ...

  9. UVA 437_The Tower of Babylon

    题意: 一堆石头,给定长宽高,每种石头均可以使用无数次,问这堆石头可以叠放的最高高度,要求下面的石头的长和宽分别严格大于上面石头的长和宽. 分析: 采用DAG最长路算法,由于长宽较大,不能直接用于表示 ...

  10. spring history &design Philosophy

    Spring简介 Spring是一个开源框架,它由Rod Johnson创建.它是为了解决企业应用开发的复杂性而创建的.Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情.然而, ...