a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 58|回复: 0

[综合辅导] Linux认证:Linux页面回收与反向映射机制

[复制链接]
发表于 2012-8-4 12:07:07 | 显示全部楼层 |阅读模式
Linux认证:Linux页面回收与反向映射机制0 F' o. D/ z' U: z! H1 o4 I; M
操作系统管理内存中的物理页面,同时也担任着内存分配的职责。应用程序可以通过内存分配函数向操作系统申请物理页面;在使用完这些物理页面之后,应用程序可以通过相应的内存释放函数释放这些物理页面。但是,对于内存中的某些物理页面来说,页面的使用者并不会主动释放它们,如果这些物理页面一直被占用而得不到释放,那么无论计算机上可用的物理内存有多少,物理内存迟早都有被用完的时候。所以,对于无法被主动释放的物理页面来说,操作系统就需要提供相应的功能去释放它们,Linux 中提供页面回收算法这样一种机制进行页面回收。3 F; l$ l3 v# E& X) h
一般来说,用于页缓存的物理页面无法被页面的使用者主动释放,因为它们不知道这些页面何时应该被释放。Linux 中页缓存存在的最大好处就是可以让程序从缓存中快速获取数据,从而提升系统的性能。在系统负载不重的情况下,Linux 操作系统会分配较多的物理页面用于页缓存,从而提高程序的运行效率;但是在系统负载较重的情况下,Linux 操作系统就可能会适当回收用于缓存的页面,并减少用于缓存的页面的分配,从而满足系统中优先级更高的内存分配请求。对于用户进程来说,Linux 操作系统可以在它需要的时候为它分配物理内存,但是当用户进程不再需要这些物理页面的时候,如果用户进程不主动释放占用的页面,Linux 操作系统也不会强制用户进程去释放这些物理页面。基于上述这些情况,当内存中可用的物理页面越来越少,并最终导致内存的使用捉襟见肘的时候,为了保证系统的顺利运行,Linux 操作系统就会根据一定的算法去回收那些长期被占用并且没有得到有效使用的物理页面。/ b" k! M4 {# o
由操作系统内核本身使用的物理页面不在 Linux 操作系统进行页面回收的考虑范围之内,这是因为与用户进程相比,内核不需要占用非常多的内存,回收内核占用的物理页面会显着增加内核代码的复杂性,潜在收益非常低。$ U( p, s/ G! V
如何进行页面回收
* s3 v- V2 m) v/ x" Q8 ^  d$ U哪些页面可以被回收
) @3 n7 r* [/ d内存中并非所有物理页面都是可以进行回收的,总的来说,以下这些种物理页面可以被 Linux 操作系统回收:( k5 L5 ^6 w5 B; F. u( G0 ?/ a
●文件读写操作过程中用于缓冲数据的页面: Q0 V  g! }3 P: U  o; H6 o* P
●用户地址空间中用于文件内存映射的页面
6 }0 J5 ?, A1 S$ |( G●匿名页面:进程用户模式下的堆栈或者是使用 mmap 匿名映射的内存区
/ Q" ]: V3 J' U0 S●特殊的用于 slab 分配器的缓存,比如用于缓存文件目录结构 dentry 的 cache,以及用于缓存索引节点 inode 的 cache
$ j4 d& ^) _1 _7 |" ^在页面被操作系统回收之前,所有与之关联的进程页表项必须要断开与该页面之间的映射关系。对于匿名页面来说,在页面被回收之前,匿名页面中的内容首先需要先被交换到交换区中去;如果要回收的页面是“脏”页面,那么该页面在被回收之前需要先将页面中的数据写回。* |1 l4 m& Q) c# h
除此之外,其他的页面要么不可以被回收,要么根本不必进行回收。比如,内核占用的页面不会被回收;映射到内核空间中的页面也不会被回收;内核在执行的过程中动态生成的页面需要永驻内存;被锁住的页面不能被回收;而没有被占用的物理页面则根本不需要被回收。2 @5 w2 a/ F& s6 _" z" D4 Z
) }$ [$ {  `: n9 {: O- K
* I5 K0 d! |& c5 Q/ I! q
0 \2 A: o" H; q: u
进行页面回收的时机/ i8 L/ T) k8 u) }
Linux 操作系统使用如下这两种机制检查系统内存的使用情况,从而确定可用的内存是否太少从而需要进行页面回收。
9 a8 ?9 {: |4 j  I- N) W○周期性的检查:这是由后台运行的守护进程 kswapd 完成的。该进程定期检查当前系统的内存使用情况,当发现系统内空闲的物理页面数目少于特定的阈值时,该进程就会发起页面回收的操作。' b3 G$ w  L7 W
○“内存严重不足”事件的触发:在某些情况下,比如,操作系统忽然需要通过伙伴系统为用户进程分配一大块内存,或者需要创建一个很大的缓冲区,而当时系统中的内存没有办法提供足够多的物理内存以满足这种内存请求,这时候,操作系统就必须尽快进行页面回收操作,以便释放出一些内存空间从而满足上述的内存请求。这种页面回收方式也被称作“直接页面回收”。
; y2 r' A# G# w" M, x& J1 I+ h如果操作系统在进行了内存回收操作之后仍然无法回收到足够多的页面以满足上述内存要求,那么操作系统只有最后一个选择,那就是使用 OOM( out of memory )killer,它从系统中挑选一个最合适的进程杀死它,并释放该进程所占用的所有页面。
- ]- Z& P# W  W/ r, b1 Z上面介绍的内存回收机制主要依赖于三个字段:pages_min,pages_low 以及 pages_high。每个内存区域( zone )都在其区域描述符中定义了这样三个字段,这三个字段的具体含义如下表 1 所示。
; r6 x& g- k  F3 [1 H+ H* y表 1. 字段含义
' P* \% K  k% x名称 字段描述
: F/ ~& w, |6 D: apages_min 区域的预留页面数目,如果空闲物理页面的数目低于 pages_min,那么系统的压力会比较大,此时,内存区域中急需空闲的物理页面,页面回收的需求非常紧迫。
5 ], t, @: t' D! [pages_low 控制进行页面回收的最小阈值,如果空闲物理页面的数目低于 pages_low,那么操作系统内核会开始进行页面回收。
3 j! U! t7 a/ I2 W& e5 V% bpages_high 控制进行页面回收的最大阈值,如果空闲物理页面的数目多于 pages_high,则内存区域的状态是理想的。# p- _* J) ^9 R  J5 }
页面回收算法
7 m; S8 r3 Y+ m) Z* d' j5 u9 QLinux 中的页面回收是基于 LRU(least recently used,即最近最少使用 ) 算法的。LRU 算法基于这样一个事实,过去一段时间内频繁使用的页面,在不久的将来很可能会被再次访问到。反过来说,已经很久没有访问过的页面在未来较短的时间内也不会被频繁访问到。因此,在物理内存不够用的情况下,这样的页面成为被换出的最佳候选者。& u# N7 P* g0 w+ j. f2 B- C
LRU 算法的基本原理很简单,为每个物理页面绑定一个计数器,用以标识该页面的访问频度。操作系统内核进行页面回收的时候就可以根据页面的计数器的值来确定要回收哪些页面。然而,在硬件上提供这种支持的体系结构很少,Linux 操作系统没有办法依靠这样一种页计数器去跟踪每个页面的访问情况,所以,Linux 在页表项中增加了一个 Accessed 位,当页面被访问到的时候,该位就会被硬件自动置位。该位被置位表示该页面还很年轻,不能被换出去。此后,在系统的运行过程中,该页面的年龄会被操作系统更改。在 Linux 中,相关的操作主要是基于两个 LRU 链表以及两个标识页面状态的标志符,下文会逐一介绍这些相应的数据结构以及 Linux 如何使用这些数据结构进行页面回收。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-18 00:13 , Processed in 0.156795 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表