热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

16.页框回收2010-02-2822:56591人阅读评论(0)收藏

系统负载较低时,RAM大部分由磁盘高速缓存占用。负载增加时,RAM大部分则由进程页占用,高速缓存会缩小从而给进程让出空间,之前的所有内存管理并未释放页。Linux内核的页框回收算法(PF

       系统负载较低时,RAM大部分由磁盘高速缓存占用。负载增加时,RAM大部分则由进程页占用,高速缓存会缩小从而给进程让出空间,之前的所有内存管理并未释放页。Linux内核的页框回收算法(PFRA)采用从用户态进程和内核缓存“窃取”页框以补充伙伴系统空闲块列表。

       回收的第一步是选择目标页,按页框可分为不可回收页,可交换页,可同步页,可丢弃页。对于页框回收算法来说,可交换页与可同步页是目标。前者可将内容保存在交换区以释放,可同步页则可直接将缓存写到磁盘。可交换页包括用户态的匿名页即用户态的堆与栈,及IPC共享内存的页等,可同步页包括用户态的映射页(文件映射内存)、页高速缓存、块缓冲、磁盘的inode缓存等。所以PFRA选定目标粗略为磁盘、内存高速缓存、用户态地址空间,但回收算法则很少有理论支撑,是相当经验性的。LRU算法的主要思想是以计数存放Ram中每页的年龄,有的CPU支持这种功能,但80x86不支持。为释放页框中的共享页框,PFRA要能迅速找到指向同一页框的所有页表项,这个过程叫反射映射。实现方法可在页描述符中加入字段,联系到对应的所有页表项,但这样开销太大。Linux采用“面向对象的反射映射”,对于任何可回收的用户态页,内核保留页到所属线性区的反向链接。线性区描述符又有指针指向内存描述符,内存描述符又有指针指向页全局目录。这是个由内到外由小到大的过程,内核会先看页描述符的__mapcountmapping字段,前者说明页框共享否,后者说明交换高速缓存,若非空则看最低位。1则是匿名页,0则映射页。若匿名页,反向映射可直接将页框所在匿名线性区存于双向循环链表。若映射页,则不行,因为它的数量可能很大,如C库代码的页可能有许多映射。Linux2.6引入优先搜索树(PST)来检索。

       页框回收算法的核心数据结构是页的活动链表与非活动链表,它们称为LRU链表。前者放最近访问过的页,后者存放有段时间未访问过的页。它俩存在zone描述符的active_listinactive_list中,并在页描述符中有字段指出在哪个链表或不在LRU链表。因为页要来回移动于两链表间,则光两个状态可能就不够。但并未引入新状态而是不在单独访问中就改变状态,实现移动的函数也不可太强,否则过多页移至非活动则要影响系统性能,过懒时则PFRA回收不力。PFRA倾向于先压缩页高速缓存,而非用户态进程的页。对进程页,可通过设交换值设定。对于目录项与inode高速缓存,会先判断它们是否可压缩,即判断从LRU收回与压缩的代价,再作出权衡。

       PFRA有两种周期回收机制:kswapd内核线程从LRU链表中回收页,cache_reap则从slab分配器中回收未用slab,前者在分配内存时若阈值低于某值被激活。

       极端时,交换区满,且磁盘高速缓存已被压缩,内存耗尽,此时,PFRA使用OOMout of memory)删除程序,它选择一个进程强行删除它并释放页框。

       Linux VM子系统代码太复杂,尤以PFRA,有时它会产生把某页换出再换入这种叫“交换失效”的情况,解决方法是用交换标记。交换是为非映射页在磁盘上提供备份。交换子系统要完成建立交换区、分配页槽,换入换出等,它是页框回收的最高级特性。交换区可实现于硬盘分区也可以使用文件。每交换区由一组页框组成,每页框包括一个被换出的页。第一页框(标号0)存放交换区信息,每个交换区由一或多个子交换区组成,每子区对应在磁盘上物理相邻的页,交换区由数据结构swap_info_struct描述符描述。Swap_map字段指向计数器数组,指出共享换出页的进程数。为找到换出页,引入换出页标识符,它指出了页槽索引、区号及有一位与present对应,80x86上页槽索引为24位,所以交换区可有64G,换出一页后,换出页标志符会放在页表项备查。换出时要找空闲页槽,Linux一般从上次已分配的页槽开始找。为了应付可能的多重换入及同时换入换出的情况,交换高速缓存被引入,它是个临时区域,存放正在换入或换出的匿名页描述符。换入一般在缺页异常处理中触发。 

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


推荐阅读
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 近年来,大数据成为互联网世界的新宠儿,被列入阿里巴巴、谷歌等公司的战略规划中,也在政府报告中频繁提及。据《大数据人才报告》显示,目前全国大数据人才仅46万,未来3-5年将出现高达150万的人才缺口。根据领英报告,数据剖析人才供应指数最低,且跳槽速度最快。中国商业结合会数据剖析专业委员会统计显示,未来中国基础性数据剖析人才缺口将高达1400万。目前BAT企业中,60%以上的招聘职位都是针对大数据人才的。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
author-avatar
西门庆重生727
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有