当前位置: 首页 > news >正文

linux内核page结构体的PG_referenced和PG_active标志

linux内核使用了lru算法来置换内存页面,但是实际上并不是纯的lru算法,里面掺杂了很多别的思想,比如第二次机会,比如双时钟指针等等。这里着重说一下第二次机会的体现。在内核中有一个mark_page_accessed函数,它实际上体现一个状态机,这是它的实现:
if (!PageActive(page) && PageReferenced(page) && PageLRU(page)) {
activate_page(page);
ClearPageReferenced(page);
} else if (!PageReferenced(page)) {
SetPageReferenced(page);
}
基本上这段代码体现了函数注释中的言词:
inactive,unreferenced -> inactive,referenced
inactive,referenced -> active,unreferenced
active,unreferenced -> active,referenced
一个被内存管理系统管理的page的生命周期就是:伙伴系统->active list->inactive list->伙伴系统。
当一个page在两个list之间晃荡的时候,并不是一次性从active转移到inactive或者相反的移动,而是有两次机会,inactive的page要先referenced才能进一步变成active的,同样的active的page要先清除了referenced才能变成inactive的,上面的函数是到active的变换,下面的page_referenced其实是到inactive的变换,每当置换算法扫描到一个页面的时候,就要老化它一次,这里有一个技巧,那就是不管它是active的还是inactive的,只是清除一下referenced,只要它被referenced了,那么它就理应不该被释放,除非它既是inactive的又是unreferenced的:
int page_referenced(struct page *page, int is_locked)
{
int referenced = 0;
if (page_test_and_clear_young(page))
referenced++;
if (TestClearPageReferenced(page))
referenced++;
if (page_mapped(page) && page->mapping) {
...//检查page是否刚被使用
}
return referenced;
}

相关文章:

  • 解決BufferedReader读取UTF-8文件中文乱码(转)
  • 问题以及发现问题和解决问题
  • bitmap格式分析(转)
  • 关于数组或集合中判断存在某个元素
  • kexec机制
  • Spring事务配置的五种方式
  • buffer_head和bio
  • 关于人脸识别,稀疏表示的若干论文的小结
  • asp.net——正则表达式
  • 开始iOS 7中自动布局教程(一)
  • POJ 1470 Closest Common Ancestors
  • S3C2440-中文手册
  • URAL 1779 F - The Great Team 构造
  • 如何应用混沌进行置乱
  • Ruby源文件指引
  • [PHP内核探索]PHP中的哈希表
  • go语言学习初探(一)
  • iOS编译提示和导航提示
  • Laravel5.4 Queues队列学习
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • tensorflow学习笔记3——MNIST应用篇
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • vagrant 添加本地 box 安装 laravel homestead
  • Vue 动态创建 component
  • 初识 beanstalkd
  • 观察者模式实现非直接耦合
  • 检测对象或数组
  • 老板让我十分钟上手nx-admin
  • 如何在 Tornado 中实现 Middleware
  • 事件委托的小应用
  • 首页查询功能的一次实现过程
  • 一些关于Rust在2019年的思考
  • 《码出高效》学习笔记与书中错误记录
  • 7行Python代码的人脸识别
  • 阿里云服务器如何修改远程端口?
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​linux启动进程的方式
  • #Lua:Lua调用C++生成的DLL库
  • #vue3 实现前端下载excel文件模板功能
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • $L^p$ 调和函数恒为零
  • (1)bark-ml
  • (14)Hive调优——合并小文件
  • (2)nginx 安装、启停
  • (2)STL算法之元素计数
  • (4)logging(日志模块)
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (四)Android布局类型(线性布局LinearLayout)
  • (一)Dubbo快速入门、介绍、使用
  • (转)Unity3DUnity3D在android下调试
  • .NET : 在VS2008中计算代码度量值