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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-21 05:55:10

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

计算机底层知识拾遗(六)理解页缓存page cache和地址空间address_space

在这篇计算机底层知识拾遗(五)理解块IO层 中讲了块缓存buffer cache块缓存,这篇说说页缓存page cache以及相关的地址空间address_space的要点. 在Linux 2.4内核中块缓存buffer cache和页缓存page cache是并存的,表现的现象是同一份文件的数据,可能即出现在buffer cache中,又出现在页缓存中,这样就造成了物理内存的浪费.Linux 2.6内核对两个cache进行了合并,统一使用页缓存在做缓存,只有极少数的情况下才使用到buffer

PHP---分页类(page.class.php)

1 <?php 2 class Page 3 { 4 private $total; //数据总记录数 5 private $listRows; //每页显示的行数 6 private $limit; //偏移量长度 7 private $url; 8 private $pageNum; //总页数 9 private $config=array('header'=>'个记录','prev'=>'上一页','next'=>'下一页','first'=>'首页','last'=

复合模式Compound -- 学习HeadFirst设计模式记录

? 复合模式:结合两个或以上的模式,组成一个解决方案,解决一再发生的一般性问题. ? 典型应用:MVC模式,M:Model, V:View, C:Controller.类似的还有Web:浏览器/服务器模型. ? ?

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

我们已经讨论了GAM与SGAM页,数据页(Data Page) ,现在我们来看下页面自由空间页(Page Free Space (PFS) ). PFS在数据文件里是第2页(页号1,页号从0开始),接在文件头(file header,页号0)后.GAM与SGAM是用来跟踪区分配情况,而PFS页是用来跟踪页分配级别(page level allocation).当分配页时,数据库引擎使用GAM与SGAM来确定有可用页的区.一旦数据库引擎找到有可用页的区,它使用PFS页来确定在那个区里未分配的页,页

Scala 深入浅出实战经典 第54讲:Scala中复合类型实战详解

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2土豆:http://www.tudou.com/programs/view/a6qIB7SqOlc/优酷:http://v.youku.com/v_show/id_

JSP(Java Server Page)九大内置对象

× Web程序的请求相应模式(请求[request].响应[response]) × form method="get"和method="post"提交方式的区别                  1.get:以明文形式通过url进行参数的传递,数据能在url获取,提交的数据最多不超过2KB,安全性低但效率比post高.                 适用于提交数据量不大,安全性不高的数据.eg:搜索.查询等               2.post:将用户提交的

JSP系列:(2)JSP基础-Page指令详解

3.2.page指令 作用: 告诉tomcat服务器如何翻译jsp文件 <%@ page language="java"   --告诉服务器使用什么动态语言来翻译jsp文件 import="java.util.*" --告诉服务器java文件使用什么包(导入包), 多个包之间用逗号分割 pageEncoding="utf-8"  --告诉服务器使用什么编码翻译jsp文件(成java文件) contentType="text/htm

探究InnoDB数据页内部行的存储方式

*:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !important; } .markdown-body .anchor { position: absolute; top: 0; bottom: 0; left: 0; display: block; padding-right: 6px; padding-left: 30px; margin-left: -30

爬图交互界面及翻页初尝式

# -*- coding:utf-8 -*- import requests, re, os,urllib2 class TP: def __init__(self,baseUrl): #baseUrl是基本地址 #url = 'http://tieba.baidu.com/p/5307547413' self.baseURL=baseUrl #传入页码,获取该页帖子的代码 def getPage(self,pageNum): try: url=self.baseURL+'?pn='+str(p