复合页( 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/
复合页( Compound Page )的更多相关文章
- 刨根究底字符编码之七——ANSI编码与代码页(Code Page)
ANSI编码与代码页(Code Page) 一.ANSI编码 1. 如前所述,在全世界所有国家和民族的文字符号统一编码的Unicode编码方案问世之前,各个国家.民族为了用计算机记录并显示自己的字符, ...
- 大页(Huge Page)简单介绍
x86(包括x86-32和x86-64)架构的CPU默认使用4KB大小的内存页面(getconf PAGESIZE),但是它们也支持较大的内存页,如x86-64系统就支持2MB大小的大页(huge p ...
- 工作于内存和文件之间的页缓存, Page Cache, the Affair Between Memory and Files
原文作者:Gustavo Duarte 原文地址:http://duartes.org/gustavo/blog/post/what-your-computer-does-while-you-wait ...
- 描述各自页面的 page
一个小程序页面由四个文件组成(注意:为了方便开发者减少配置项,描述页面的四个文件必须具有相同的路径与文件名).分别是: 页面 Page(JS文件) Page(Object) 函数用来注册一个页面.接受 ...
- 教你如何修改FireFox打开新标签页(NewTab Page)的行列数
FireFox的打开新建标签页(即NewTab Page)默认只能显示3x3个网站缩略图,这9个自定义的网站,非常方便快捷,什么hao123的弱爆了,本人从未用过此类导航网站,曾经用过的也只是abou ...
- 实现加载页Loading Page 的几种方法
网页也可以像原生应用那样加入进度条或者其他的loading效果带来更好的等待体验,这里归纳几种我收集的实现loading page的方法,这几种方法在交互上都有利有弊,适用于不同应用.(PS:以下方法 ...
- JSP页面的Page指令指定编码和Meta标签编码
JSP代码如下: <%@ page language="java" contentType="text/html; charset=UTF-8" page ...
- SQL Server 存储(4/8):理解Page Free Space (PFS) 页
我们已经讨论了GAM与SGAM页,数据页(Data Page) ,现在我们来看下页面自由空间页(Page Free Space (PFS) ). PFS在数据文件里是第2页(页号1,页号从0开始),接 ...
- SQL Server :理解Page Free Space (PFS) 页
原文:SQL Server :理解Page Free Space (PFS) 页 我们已经讨论了GAM与SGAM页,数据页(Data Page) ,现在我们来看下页面自由空间页(Page Free S ...
随机推荐
- idea vue提示
我在idea中,装了,vue.js插件,可就是死活,没有提示,我的html 文件是 .html扩展名,我想是不是因为这个原因,我就新建了个,test.vue,哈哈,提示出来了,我又在其它.html文件 ...
- Solaris 默认Shell 修改
ssh登陆远程的solaris 10,backspace出现乱码. ssh登陆远程的solaris 10默认Shell不是bash 把solaris10的shell环境改为bash就行 dev13% ...
- redis简介以及安装
redis作为开源的高性能的键值对数据库,本身是单线程的,性能虽然没有memcache高,但是也是性能跟memcache相差无几的,memcache是多线程的,但是redis本身功能更加强大,学习一下 ...
- linux下查找字符串的命令
1. set命令可以显示出当前shell下所有全局参量定义及其值; 2. 查找并删除当前目录下小文件: find . -type f -size -10k -exec rm {} \; 说明: w ...
- 简单的学生选课系统——基于Servlet+Ajax
以前挖的坑,早晚要往里掉.基础太薄弱,要恶补.在此程序前,我还对Servlet没有一个清晰的概念:一周时间写好此程序之后,对Servlet的理解清晰许多. 这周一直在恶补Spring,今天正好完成了S ...
- CSU 2018年12月月赛 H(2220): Godsend
Description Leha somehow found an array consisting of n integers. Looking at it, he came up with a t ...
- Python:webshell 跳板机审计服务器
1.修改paramiko源码包实现 https://github.com/paramiko/paramiko/tree/1.10.1 下载源码包 unzip paramiko-1.10.1.zip p ...
- 等待某(N)个线程执行完再执行某个线程的几种方法(Thread.join(),CountDownLatch,CyclicBarrier,Semaphore)
1.main线程中先调用threadA.join() ,再调用threadB.join()实现A->B->main线程的执行顺序 调用threadA.join()时,main线程会挂起,等 ...
- HUAS Summer Contest#4 D题 DP
Description Speakless很早就想出国,现在他已经考完了所有需要的考试,准备了所有要准备的材料,于是,便需要去申请学校了.要申请国外的任何大学,你都要交纳一定的申请费用,这可是很惊人的 ...
- 添物零基础到架构师(基础篇) - JavaScript
JavaScript是什么? JavaScript是web开发必须学习的,ECMAScript是其规则来源. JavaScript的历史 Developed by Brendan Eich of Ne ...