会计考友 发表于 2012-8-4 12:19:50

红帽认证辅导:Linux页面回收与反向映射机制

操作系统打点内存中的物理页面,同时也担任着内存分配的职责。应用轨范可以经由过程内存分配函数向操作系统申请物理页面;在使用完这些物理页面之后,应用轨范可以经由过程响应的内存释放函数释放这些物理页面。可是,对于内存中的某些物理页面来说,页面的使用者并不会自动释放它们,如不美观这些物理页面一向被占用而得不到释放,那么无论计较机上可用的物理内存有若干好多,物理内存迟早都有被用完的时辰。所以,对于无法被自动释放的物理页面来说,操作系统就需要供给响应的功能去释放它们,Linux 中供给页面收受接管算法这样一种机制进行页面收受接管。
一般来说,用于页缓存的物理页面无法被页面的使用者自动释放,因为它们不知道这些页面何时应该被释放。Linux 中页缓存存在的最大益处就是可以让轨范从缓存中快速获取数据,从而晋升系统的机能。在系统负载不重的情形下,Linux 操作系统会分配较多的物理页面用于页缓存,从而提高轨范的运行效率;可是在系统负载较重的情形下,Linux 操作系统就可能会恰当收受接管用于缓存的页面,并削减用于缓存的页面的分配,从而知足系统中优先级更高的内存分配请求。对于用户历程来说,Linux 操作系统可以在它需要的时辰为它分配物理内存,可是当用户历程不再需要这些物理页面的时辰,如不美观用户历程不自动释放占用的页面,Linux 操作系统也不会强制用户历程去释放这些物理页面。基于上述这些情形,当内存中可用的物理页面越来越少,并最终导致内存的使用左支右绌的时辰,为了保证系统的顺遂运行,Linux 操作系统就会按照必然的算法去收受接管那些持久被占用而且没有获得有用使用的物理页面。
由操作系统内核自己使用的物理页面不在 Linux 操作系统进行页面收受接管的考虑规模之内,这是因为与用户历程对比,内核不需要占用很是多的内存,收受接管内核占用的物理页面会光鲜较着增添内核代码的复杂性,潜在收益很是低。
若何进行页面收受接管
哪些页面可以被收受接管
内存中并非所有物理页面都是可以进行收受接管的,总的来说,以下这些种物理页面可以被 Linux 操作系统收受接管:
●文件读写操作过程顶用于缓冲数据的页面
●用户地址空间顶用于文件内存映射的页面
●匿名页面:历程用户模式下的仓库或者是使用 mmap 匿名映射的内存区
●非凡的用于 slab 分配器的缓存,好比用于缓存文件目录结构 dentry 的 cache,以及用于缓存索引节点 inode 的 cache
在页面被操作系统收受接管之前,所有与之联系关系的历程页表项必需要断开与该页面之间的映射关系。对于匿名页面来说,在页面被收受接管之前,匿名页面中的内容首先需要先被交流到交流区中去;如不美观要收受接管的页面是“脏”页面,那么该页面在被收受接管之前需要先将页面中的数据写回。

除此之外,其他的页面要么不成以被收受接管,要么根柢不必进行收受接管。好比,内核占用的页面不会被收受接管;映射到内核空间中的页面也不会被收受接管;内核在执行的过程中动态生成的页面需要永驻内存;被锁住的页面不能被收受接管;而没有被占用的物理页面则根柢不需要被收受接管。

会计考友 发表于 2012-8-4 12:19:51

红帽认证辅导:Linux页面回收与反向映射机制

</p>


进行页面收受接管的机缘
Linux 操作系统使用如下这两种机制搜检系统内存的使用情形,从而确定可用的内存是否太少从而需要进行页面收受接管。
○周期性的搜检:这是由后台运行的守护历程 kswapd 完成的。该历程按期搜检当前系统的内存使用情形,当发现系统内余暇的物理页面数目少于特定的阈制瘫,该历程就会倡议页面收受接管的操作。
○“内存严重不足”事务的触发:在某些情形下,好比,操作系统倏忽需要经由过程伙伴系统为用户历程分配一大块内存,或者需要建树一个很大的缓冲区,而那时系统中的内存没有法子供给足够多的物理内存以知足这种内存请求,这时辰,操作系统就必需尽快进行页面收受接管操作,以便释放出一些内存空间从而知足上述的内存请求。这种页面收受接管体例也被称作“直接页面收受接管”。
如不美观操作系统在进行了内存收受接管操作之后仍然无术数受接管到足够多的页面以知足上述内存要求,那么操作系统只有最后一个选择,那就是使用 OOM( out of memory )killer,它从系统中遴选一个最合适的历程杀死它,并释放该历程所占用的所有页面。
膳缦沔介绍的内存收受接管机制首要依靠于三个字段:pages_min,pages_low 以及 pages_high。每个内存区域( zone )都在其区域描述符中界说了这样三个字段,这三个字段的具体寄义如下表 1 所示。
表 1. 字段寄义
名称 字段描述
pages_min 区域的预留页面数目,如不美观余暇物理页面的数目低于 pages_min,那么系统的压力会斗劲大,此时,内存区域中急需余暇的物理页面,页面收受接管的需求很是紧迫。
pages_low 节制进行页面收受接管的最小阈值,如不美观余暇物理页面的数目低于 pages_low,那么操作系统内核会起头进行页面收受接管。
pages_high 节制进行页面收受接管的最大阈值,如不美观余暇物理页面的数目多于 pages_high,则内存区域的状况是理想的。
页面收受接管算法
Linux 中的页面收受接管是基于 LRU(least recently used,即比来起码使用 ) 算法的。LRU 算法基于这样一个事实,曩昔一段时刻内频仍使用的页面,在不久的未来很可能会被再次访谒到。反过来说,已经良久没有访谒过的页面在未来较短的时刻内也不会被频仍访谒到。是以,在物理内存不够用的情形下,这样的页面成为被换出的最佳候选者。
LRU 算法的根基事理很简单,为每个物理页面绑定一个计数器,用以标识该页面的访谒频度。操作系统内核进行页面收受接管的时辰就可以按照页面的计数器的值来确定要收受接管哪些页面。然而,在硬件上供给这种撑持的系统结构很少,Linux 操作系统没有法子依靠这样一种页计数器去跟踪每个页面的访谒情形,所以,Linux 在页表项中增添了一个 Accessed 位,当页面被访谒到的时辰,该位就会被硬件自动置位。该位被置芜降示该页面还很年青,不能被换出去。此后,在系统的运行过程中,该页面的春秋会被操作系统更改。在 Linux 中,相关的操作主若是基于两个 LRU 链表以及两个标识页面状况的标识表记标帜符,下文会一一介绍这些响应的数据结构以及 Linux 若何使用这些数据结构进行页面收受接管。
页: [1]
查看完整版本: 红帽认证辅导:Linux页面回收与反向映射机制