16. 页框回收 2010-02-28 22:56 591人阅读 评论(0) 收藏...
系统负载较低时,RAM大部分由磁盘高速缓存占用。负载增加时,RAM大部分则由进程页占用,高速缓存会缩小从而给进程让出空间,之前的所有内存管理并未释放页。Linux内核的页框回收算法(PFRA)采用从用户态进程和内核缓存“窃取”页框以补充伙伴系统空闲块列表。
回收的第一步是选择目标页,按页框可分为不可回收页,可交换页,可同步页,可丢弃页。对于页框回收算法来说,可交换页与可同步页是目标。前者可将内容保存在交换区以释放,可同步页则可直接将缓存写到磁盘。可交换页包括用户态的匿名页即用户态的堆与栈,及IPC共享内存的页等,可同步页包括用户态的映射页(文件映射内存)、页高速缓存、块缓冲、磁盘的inode缓存等。所以PFRA选定目标粗略为磁盘、内存高速缓存、用户态地址空间,但回收算法则很少有理论支撑,是相当经验性的。LRU算法的主要思想是以计数存放Ram中每页的年龄,有的CPU支持这种功能,但80x86不支持。为释放页框中的共享页框,PFRA要能迅速找到指向同一页框的所有页表项,这个过程叫反射映射。实现方法可在页描述符中加入字段,联系到对应的所有页表项,但这样开销太大。Linux采用“面向对象的反射映射”,对于任何可回收的用户态页,内核保留页到所属线性区的反向链接。线性区描述符又有指针指向内存描述符,内存描述符又有指针指向页全局目录。这是个由内到外由小到大的过程,内核会先看页描述符的__mapcount与mapping字段,前者说明页框共享否,后者说明交换高速缓存,若非空则看最低位。1则是匿名页,0则映射页。若匿名页,反向映射可直接将页框所在匿名线性区存于双向循环链表。若映射页,则不行,因为它的数量可能很大,如C库代码的页可能有许多映射。Linux2.6引入优先搜索树(PST)来检索。
页框回收算法的核心数据结构是页的活动链表与非活动链表,它们称为LRU链表。前者放最近访问过的页,后者存放有段时间未访问过的页。它俩存在zone描述符的active_list与inactive_list中,并在页描述符中有字段指出在哪个链表或不在LRU链表。因为页要来回移动于两链表间,则光两个状态可能就不够。但并未引入新状态而是不在单独访问中就改变状态,实现移动的函数也不可太强,否则过多页移至非活动则要影响系统性能,过懒时则PFRA回收不力。PFRA倾向于先压缩页高速缓存,而非用户态进程的页。对进程页,可通过设交换值设定。对于目录项与inode高速缓存,会先判断它们是否可压缩,即判断从LRU收回与压缩的代价,再作出权衡。
PFRA有两种周期回收机制:kswapd内核线程从LRU链表中回收页,cache_reap则从slab分配器中回收未用slab,前者在分配内存时若阈值低于某值被激活。
极端时,交换区满,且磁盘高速缓存已被压缩,内存耗尽,此时,PFRA使用OOM(out of memory)删除程序,它选择一个进程强行删除它并释放页框。
Linux VM子系统代码太复杂,尤以PFRA,有时它会产生把某页换出再换入这种叫“交换失效”的情况,解决方法是用交换标记。交换是为非映射页在磁盘上提供备份。交换子系统要完成建立交换区、分配页槽,换入换出等,它是页框回收的最高级特性。交换区可实现于硬盘分区也可以使用文件。每交换区由一组页框组成,每页框包括一个被换出的页。第一页框(标号0)存放交换区信息,每个交换区由一或多个子交换区组成,每子区对应在磁盘上物理相邻的页,交换区由数据结构swap_info_struct描述符描述。Swap_map字段指向计数器数组,指出共享换出页的进程数。为找到换出页,引入换出页标识符,它指出了页槽索引、区号及有一位与present对应,80x86上页槽索引为24位,所以交换区可有64G,换出一页后,换出页标志符会放在页表项备查。换出时要找空闲页槽,Linux一般从上次已分配的页槽开始找。为了应付可能的多重换入及同时换入换出的情况,交换高速缓存被引入,它是个临时区域,存放正在换入或换出的匿名页描述符。换入一般在缺页异常处理中触发。
版权声明:本文为博主原创文章,未经博主允许不得转载。
转载于:https://www.cnblogs.com/qqmomery/archive/2010/02/28/4700456.html
16. 页框回收 2010-02-28 22:56 591人阅读 评论(0) 收藏...相关推荐
- 蓝桥软件竞赛 预选赛 2014-01-21 22:54 206人阅读 评论(0) 收藏...
1.把一个二进制的串转换为十进制整数 #include<stdio.h> #include<math.h> int main(){long long n;long long k ...
- 获取窗口上指定控件集合 2012-08-22 16:14 498人阅读 评论(0) 收藏...
假如想获取一个Grid(名称为grid1)上所有的Button按钮,则代码如下: List<Button> collection = GetChildObjects<Button&g ...
- 改进的筛素数法 2014-11-29 16:16 29人阅读 评论(0) 收藏...
最简单的筛素数法方法就是从2开始,将所以2的倍数去掉,然后从3开始,将3的倍数去掉.根据这样很容易写出代码,下面代码就是是筛素数法得到100以内的素数并保存到primes[]数组中. [cpp] vi ...
- 只有程序员能看懂的十个笑话 2014-08-05 16:07 54人阅读 评论(0) 收藏...
2012-02-18 13:07 1某程序员退休后决定练习书法,于是重金购买文房四宝.一日,饭后突生雅兴,一番研墨拟纸,并点上上好檀香.定神片刻,泼墨挥毫,郑重地写下一行字:hello world! ...
- linux 内存管理---页框回收(十)
为什么需要页回收? linux的设计哲学之一:尽可能多的使用内存,比如尽可能的多使用memory cache,disk cache,因为这在系统负载比较小时,能够提升系统性能,但是随着cache越来越 ...
- TensorFlow学习笔记(二):快速理解Tutorial第一个例子-MNIST机器学习入门 标签: 机器学习SoftmaxTensorFlow教程 2016-08-02 22:12 3729人阅
TensorFlow学习笔记(二):快速理解Tutorial第一个例子-MNIST机器学习入门 标签: 机器学习SoftmaxTensorFlow教程 2016-08-02 22:12 3729人阅读 ...
- 2010.2.28 OA 项目组工作报告
进度评价:50 本周除了Jack外,我和Roch的任务都没有按照计划完成. 我这里主要是在先项目的协调上花去了较多的时间: Roch主要是因为在代码的分析方面经验还不够,在团队开发的经验上还不够. 目 ...
- 尚硅谷 宋红康 JVM教程_01_内存与垃圾回收篇——02
本系列相关链接 尚硅谷 宋红康 JVM教程_01_内存与垃圾回收篇--01 (20210103-20210110) https://blog.csdn.net/wei198621/article/de ...
- 2010.02.03——Jquery ajax 动态更新 局部刷新
2010.02.03--Jquery ajax 动态更新 局部刷新 最后的效果如图所示 ,说要达到的目标就是: 当我选着不同的时间,最后一列的时间也跟着变,并且将一系列的参数传到后台,计算出结果,并填 ...
- 第 16 章 垃圾回收相关概念
第 16 章 垃圾回收相关概念 1.System.gc() 的理解 1.1.System.gc() 方法 System.gc() 方法 在默认情况下,通过System.gc()者Runtime.get ...
最新文章
- Spring Boot教程(一)注解配置与EhCache使用
- LiveVideoStack音视频技术年度评奖启动
- 企业能为员工储蓄点什么呢
- 客户说发货慢怎么回复_女生微信说身体不舒服怎么回复关心她?
- Windows中木马之后桌面被篡改的恢复方法
- 力扣693.交替位二进制数
- linux 重新扫描pci设备,linux重新扫描pci总线
- vue开发中遇到的问题
- PHPMailer如何获取QQ邮箱授权码
- 国产web端开源ui组件-后台前端ui界面组件库
- 奥城大学计算机专业,2018年美国大学硕士双录取最全名单
- 打出一个平行四边形的C语言程序,用汇编语言编写一个平行四边形输出程序,图形如下...
- 奥的斯服务器状态显示,OTIS服务器(TT)查看故障及清除故障的方法
- 用网站怎么赚钱?具体点!聊聊用网站赚钱的方法
- codeblocks的下载、安装与创建
- 天翼数字生活C++客户端实习
- 计算机报刊杂志推荐,计算机优秀期刊推荐 | Journal of Cloud Computing
- 日常吐槽系列~背锅篇
- Mapbox Android学习笔记(8)离线地图
- 个人学习网站记载(因为并不能转载只能记网站了)
热门文章
- java孢子进化_孢子进化论游戏
- mysql 账户管理_MySql 账户管理
- linux 查找py文件命令_小命令大作用---linux 下快速查找
- 自动驾驶 10-4: 为什么是传感器融合 Why Sensor Fusion
- AWS AI网络研讨会 webinar - Case 分享
- 产品经理训练营:让正确的事情相继发生 开营直播
- 算法:还有比二分查找更快的算法,判断是否是子字符串Is Subsequence
- 重启mysql tomcat_linux下MySQL、Tomcat、Redis、Nginx停止和重启
- 函数重载与函数覆盖的区别(C++)
- 服务器设置客户端网页安装,在Windows 7环境下安装并配置web、SSH、E-mail、FTP等服务器...