请求分页存储管理方式
目录
参考资料:
1 请求分页中的硬件支持
为了实现请求分页,系统必须提供一定的硬件支持。计算机系统除了要求一定容量的内存和外存外,还需要有请求页表机制、缺页中断机构以及地址变换机构。
1.1 请求页表机制
在请求分页系统中需要的主要数据结构是请求页表,其基本作用仍然是将用户地址空间中的逻辑地址映射为内存空间中的物理地址。为了满足页面换进换出的需要,在请求页表中又增加了四个字段。这样,在请求分页系统中的每个页表应含以下诸项:
现对其中各字段说明如下:
- 状态位(存在位) P:由于在请求分页系统中,只将应用程序的一部分调入内存,还有一部分仍在外存磁盘上,故须在页表中增加一个存在位字段。由于该字段仅有一位,故又称位字。它用于指示该页是否已调入内存,供程序访问时参考。
- 访问字段 A:用于记录本页在一段时间内被访问的次数,或记录本页最近已有多长时间未被访问,提供给置换算法在选择换出页面时参考。
- 修改位 M:标识该页在调入内存后是否被修改过。由于内存中的每一页都在外存上保留一份副本,因此,在置换该页时,若未被修改,就不需再将该页写回到外存上,以减少系统的开销和启动磁盘的次数;若已被修改,则必须将该页重写到外存上,以保证外存中所保留的副本始终是最新的。简而言之,M 位供置换页面时参考。
- 外存地址:用于指出该页在外存上的地址,通常是物理块号,供调入该页时参考。
1.2 缺页中断机构
缺页中断作为中断,它们同样需要经历诸如保护 CPU 环境、分析中断原因、转入缺页中断处理程序进行处理,以及在中断处理完成后再恢复 CPU 环境等几个步骤。
在此,不做过多描述,仅知道是一种中断硬件即可
1.3 地址变换机构
请求分页系统中的地址变换机构是在分页系统地址变换机构的基础上,为实现虚拟存储器,再增加了某些功能所形成的,如产生和处理缺页中断,以及从内存中换出一页的功能等等。
2 请求分页中的内存分配
在为进程分配内存时,将涉及到三个问题:
- 第一,为保证进程能正常运行,所需要的最小物理块数的确定。//分配数量
- 第二,在为每个进程分配物理块时,应采取什么样的分配策略,即所分配的物理块是固定的,还是可变的。//分配方式
- 第三,为不同进程所分配的物理块数,是采取平均分配算法,还是根据进程的大小按比例分配。//分配公平性
2.1 最小物理块数的确定
随着为每个进程所分配的物理块的减少,将使进程在执行中的缺页率上升,从而会降低进程的执行速度。所以为使进程能有效地工作,应为它分配合理数目的物理块。
最小物理块数是指能保证进程正常运行所需的最小物理块数,当系统为进程分配的物理块数少于此值时,进程将无法运行。至于进程应获得的最少物理块数,与计算机的硬件结构有关,取决于指令的格式、功能和寻址方式。
跟具体计算机有关,不做深入描述
2.2 内存分配策略
在请求分页系统中,可采取两种内存分配策略,即固定和可变分配策略。在进行置换时,也可采取两种策略,即全局置换和局部置换。于是可组合出以下三种适用的策略:
固定分配局部置换(Fixed Allocation,LocalReplacement)
所谓固定分配,是指为每个进程分配一组固定数目的物理块,在进程运行期间不再改变。所谓局部置换,是指如果进程在运行中发现缺页,则只能从分配给该进程的 n 个页面中选出一页换出,然后再调入一页,以保证分配给该进程的内存空间不变。
实现这种策略的困难在于:应为每个进程分配多少个物理块难以确定。若太少,会频繁地出现缺页中断,降低了系统的吞吐量。若太多,又必然使内存中驻留的进程数目减少,进而可能造成 CPU 空闲或其它资源空闲的情况,而且在实现进程对换时,会花费更多的时间。
可变分配全局置换(VariableAllocation,GlobalReplacement)
所谓可变分配,是指先为每个进程分配一定数目的物理块,在进程运行期间,可根据情况做适当的增加或减少。所谓全局置换,是指如果进程在运行中发现缺页,则将 OS 所保留的空闲物理块取出一块分配给该进程,或者以所有进程的全部物理块为标的,选择一块换出,然后将所缺之页调入。这样,分配给该进程的内存空间就随之增加。
可变分配全局置换是最易于实现的一种物理块分配和置换策略,已用于若干个 OS 中。在采用这种策略时,凡产生缺页的进程,都将获得新的物理块,仅当空闲物理块队列中的物理块用完时,OS 才能从内存中选择一页调出。被选择调出的页可能是系统中任何一个进程中的页,因此这个被选中的进程拥有的物理块会减少,这将导致其缺页率增加。
缺点是会影响其他程序
可变分配局部置换(VariableAllocation,LocalReplacement)
该策略基于进程的类型或根据程序员的要求,为每个进程分配一定数目的物理块,但当某进程发现缺页时,只允许从该进程在内存的页面中选择一页换出,这样就不会影响其它进程的运行。
如果进程在运行中频繁地发生缺页中断,则系统须再为该进程分配若干附加的物理块,直至该进程的缺页率减少到适当程度为止。反之,若一个进程在运行过程中的缺页率特别低,则此时可适当减少分配给该进程的物理块数,但不应引起其缺页率的明显增加。
不会影响其他程序
2.3 物理块分配算法
在采用固定分配策略时,如何将系统中可供分配的所有物理块分配给各个进程,可采用下述几种算法:
- 平均分配算法,即将系统中所有可供分配的物理块平均分配给各个进程。
- 按比例分配算法,即根据进程的大小按比例分配物理块。
- 按优先权分配算法。在实际应用中,为了照顾到重要的、紧迫的作业能尽快地完成,应为它分配较多的内存空间。通常采取的方法是把内存中可供分配的所有物理块分成两部分:一部分按比例地分配给各进程;另一部分则根据各进程的优先权进行分配,为高优先进程适当地增加其相应份额。
3 页面调入策略
为了使进程能够正常运行,必须事先将要执行的那部分程序和数据所在的页面调入内存,现在的问题是:
- 系统应在何时调入所需页面?
- 系统应从何处调入这些页面?
- 页面是如何进行调入的?
3.1 系统应在何时调入所需页面?
预调页策略:采用一种以预测为基础的预调页策略,将那些预计在不久之后便会被访问的页面预先调入内存。
预先判断,缺点是预测率不高
预调页策略的使用:首先,在第一次将进程调入内存时,将程序中指出的页先调入内存。然后,在采用工作集的系统中,每个进程都具有一张表,表中记录有运行时的工作集,每当程序被调度运行时,将工作集中的所有页调入内存。
使用了工作集的概念
请求调页策略:当进程在运行中需要访问某部分程序和数据时,若发现其所在的页面不在内存,便立即提出请求,由 OS 将其所需页面调入内存。
用到采取调用,缺点是 I/O 频率高
由请求调页策略所确定调入的页是一定会被访问的,再加之请求调页策略比较易于实现,故在目前的虚拟存储器中,大多采用此策略。但这种策略每次仅调入一页,故须花费较大的系统开销,增加了磁盘 I/O 的启动频率。
3.2 系统应从何处调入这些页面?
将请求分页系统中的外存分为两部分:用于存放文件的文件区和用于存放对换页面的对换区。
通常,由于对换区是采用连续分配方式,而文件区是采用离散分配方式,所以对换区的数据存取(磁盘 I/O)速度比文件区的高。这样,每当发生缺页请求时,系统应从何处将缺页调入内存,可分成如下三种情况进行:
- 对换区空间足够:全部从对换区调入所需页面,以提高调页速度。为此,在进程运行前,便须将与该进程有关的文件从文件区拷贝到对换区。
全部从对换区调入
- 对换区空间不足:不会被修改的文件,直接从文件区调入;当换出这些页面时,由于它们未被修改,则不必再将它们重写到磁盘,以后再调入时,仍从文件区直接调入。对于可能被修改的部分,在将它们换出时便须调到对换区,以后需要时再从对换区调入。
区分不修改和修改
- UNIX 方式:由于与进程有关的文件都放在文件区,故凡是未运行过的页面,都应从文件区调入。而对于曾经运行过但又被换出的页面,由于是被放在对换区,因此在下次调入时应从对换区调入。由于 UNIX 系统允许页面共享,因此,某进程所请求的页面有可能已被其它进程调入内存,此时也就无需再从对换区调入。
区分运行过还是未运行过
3.3 页面调入过程
每当程序所要访问的页面未在内存时(存在位为 “0” ),便向 CPU 发出一缺页中断,中断处理程序首先保留 CPU 环境,分析中断原因后转入缺页中断处理程序。
该程序通过查找页表得到该页在外存的物理块后,如果此时内存能容纳新页,则启动磁盘 I/O,将所缺之页调入内存,然后修改页表。如果内存已满,则须先按照某种置换算法,从内存中选出一页准备换出。
调入或置换
如果该页未被修改过(修改位为 “0”),可不必将该页写回磁盘;但如果此页已被修改(修改位为 “1”),则必须将它写回磁盘,然后再把所缺的页调入内存,并修改页表中的相应表项,置其存在位为 “1”,并将此页表项写入快表中。//处理修改数据
在缺页调入内存后,利用修改后的页表形成所要访问数据的物理地址,再去访问内存数据。
整个页面的调入过程对用户是透明的。
3.4 缺页率
如果在进程的运行过程中,访问页面成功(即所访问页面在内存中)的次数为 S,访问页面失败(即所访问页面不在内存中,需要从外存调入)的次数为 F,则该进程总的页面访问次数为 A = S + F,那么该进程在其运行过程中的缺页率即为://页面不在内存中即为缺页
通常,缺页率受到以下几个因素的影响:
- 页面大小。页面划分较大,则缺页率较低;反之,缺页率较高。
- 进程所分配物理块的数目。所分配的物理块数目越多,缺页率越低;反之则越高
- 页面置换算法。算法的优劣决定了进程执行过程中缺页中断的次数,因此缺页率是衡量页面置换算法的重要指标。
- 程序固有特性。程序本身的编制方法对缺页中断次数有影响,根据程序执行的局部性原理,程序编制的局部化程度越高,相应执行时的缺页程度越低。
事实上,在缺页中断处理时,当由于空间不足,需要置换部分页面到外存时,选择被置换页面还需要考虑到置换的代价,如页面是否被修改过。没有修改过的页面可以直接放弃,而修改过的页面则必须进行保存。
4 页面置换算法
不适当的算法可能会导致进程发生"抖动"(Thrashing),即刚被换出的页很快又要被访问,需要将它重新调入,此时又需要再选一页调出;而此刚被调出的页很快又被访问,又需将它调入,如此频繁地更换页面,以致一个进程在运行中把大部分时间都花费在页面置换工作上,我们称该进程发生了"抖动"。
4.1 最佳 (Optimal) 置换算法
最佳置换算法所选择的被淘汰页面将是以后永不使用的,在未来不再被访问的页面。
采用最佳置换算法通常可保证获得最低的缺页率。但是,该算法是一种理想化的算法,它具有最好的性能,但实际上是无法实现的。通常使用最佳置换算法作为标准,来评价其它算法的优劣。
无法实现,仅作为评价标准
4.2 先进先出 (FIFO) 页面置换算法
FIFO 算法是最早出现的置换算法。该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。
该算法实现简单,只需把一个进程已调入内存的页面按先后次序链接成一个队列,并设置一个指针,称为替换指针,使它总是指向最老的页面。但该算法与进程实际运行的规律不相适应,因为在进程中,有些页面经常被访问,比如含有全局变量、常用函数、例程等的页面,FIFO 算法并不能保证这些页面不被淘汰。
由于与通常页面的使用规律不符,可能是性能最差的算法,实际应用极少。
页面调入的先后并不能反映页面的使用情况
4.3 最近最久未使用 (Least Recently Used,LRU) 置换算法
最近最久未使用(LRU)的页面置换算法,根据页面调入内存后的使用情况进行决策,LRU 置换算法选择最近最久未使用的页面予以淘汰。
该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t。当需淘汰一个页面时,选择现有页面中 t 值最大的页面予以淘汰。
需记录访问时间
4.4 最少使用 (Least Frequently Used,LFU) 置换算法
在采用 LFU 算法时,应为在内存中的每个页面设置一个移位寄存器,用来记录该页面被访问的频率。
该置换算法选择在最近时期使用最少的页面作为淘汰页。由于存储器具有较高的访问速度,例如 100ns,在 1s 时间内可能对某页面连续访问成千上万次,因此,直接利用计数器来记录某页被访问的次数是不现实的,只能采用较大的时间间隔来记录对存储器某页的访问。在最少使用置换算法中采用了移位寄存器方式。
使用移位寄存器的原因
每次访问某页时,便将该移位寄存器的最高位置 1,再每隔一定时间右移一次。
定时移位
这种算法并不能真正反映出页面的使用情况,因为在每一时间间隔内,只是用寄存器的一位来记录页的使用情况,因此,在该时间间隔内,对某页访问一次和访问 1000 次是完全等效的。
4.5 简单的 Clock 置换算法
虽然 LRU 是一种较好的算法,但由于它要求有较多的硬件支持,使得其实现所需的成本较高,故在实际应用中,大多采用 LRU 的近似算法。Clock 算法就是用得较多的一种 LRU 近似算法。
Clock 算法为每页设置一位访问位,再将内存中的所有页面都通过链接指针链接成一个循环队列。当某页被访问时,其访问位被置 1。
使用访问位进行记录
置换算法在选择一页淘汰时,只需检查页的访问位。如果是 0,就选择该页换出;若为 1,则重新将它置 0,暂不换出,给予该页第二次驻留内存的机会,再按照 FIFO 算法检查下一个页面。当检查到队列中的最后一个页面时,若其访问位仍为 1,则再返回到队首去检查第一个页面。
循环减到最后,一定有一个页面的访问位为 0
由于该算法是循环地检查各页面的使用情况,故称为 Clock 算法。但因该算法只有一位访问位,只能用它表示该页是否已经使用过,而置换时是将未使用过的页面换出去,故又把该算法称为最近未用算法或 NRU(Not Recently Used)算法。
4.6 改进型 Clock 置换算法
在将一个页面换出时,如果该页已被修改过,便须将该页重新写回到磁盘上;但如果该页未被修改过,则不必将它拷回磁盘。换而言之,对于修改过的页面,在换出时所付出的开销比未修改过的页面大(置换代价大)。
在改进型 CIock 算法中,除须考虑页面的使用情况外,还须再增加一个因素一一置换代价。这样,选择页面换出时,既要是未使用过的页面,又要是未被修改过的页面。把同时满足这两个条件的页面作为首选淘汰的页面。
增加置换代价的考虑
该算法与简单 Clock 算法比较,可减少磁盘的 I/O 操作次数。但为了找到一个可置换的页,可能须经过几轮扫描。换言之,实现该算法本身的开销将有所增加。
增加算法的开销
5 页面缓冲算法 (Page Buffering Algorithm,PBA)
5.1 影响页面换进换出效率的若干因素
- 页面置换算法。一个好的页面置换算法,可使进程在运行过程中具有较低的缺页率,从而可以减少页面换进换出的开销。
- 写回磁盘的频率。对于已经被修改过的页面,在将其换出时,应当写回磁盘,这意味着每换出一个页面,便需要启动一次磁盘。但如果在系统中已建立了一个已修改换出页面的链表,则对每一个要被换出的页面(已修改),系统暂不把它们写回磁盘,而是将它们挂在已修改换出页面的链表上,仅当被换出页面数目达到一定值时,例如 64 个页面,再将它们一起写回到磁盘上,这样就显著地减少了磁盘 I/O 的操作次数。
写缓存
- 读入内存的频率。在设置了已修改换出页面链表后,在该链表上就暂时有一批装有数据的页面,如果有进程在这批数据还未写回磁盘时需要再次访问这些页面时,就不需从外存上调入,而直接从已修改换出页面链表中获取,这样也可以减少将页面从磁盘读入内存的频率,减少页面换进的开销。
5.2 页面缓冲算法 PBA
PBA 算法的主要特点是:
- 显著地降低了页面换进、换出的频率,使磁盘 IO 的操作次数大为减少,因而减少了页面换进、换出的开销。
- 由于换入换出的开销大幅度减小,才能使其采用一种较简单的置换策略,如先进先出(FIFO)算法,它不需要特殊硬件的支持,实现起来非常简单。
实现简单
为了能显著地降低页面换进、换出的频率,在内存中设置了如下两个链表:
(1)空闲页面链表
实际上该链表是一个空闲物理块链表,是系统掌握的空闲物理块,用于分配给频繁发生缺页的进程,以降低该进程的缺页率。当这样的进程需要读入一个页面时,便可利用空闲物理块链表中的第一个物理块来装入该页。当有一个未被修改的页要换出时,实际上并不将它换出到外存,而是把它们所在的物理块挂在空闲链表的末尾。应当注意,这些挂在空闲链表上的未被修改的页面中是有数据的,如果以后某进程需要这些页面中的数据时,便可从空闲链表上将它们取下,免除了从磁盘读入数据的操作,减少了页面换进的开销。
懒换出
(2)修改页面链表
它是由已修改的页面所形成的链表。设置该链表的目的是为了减少已修改页面换出的次数。当进程需要将一个已修改的页面换出时,系统并不立即把它换出到外存上,而是将它所在的物理块挂在修改页面链表的末尾。这样做的目的是:降低将已修该页面写回磁盘的频率,降低将磁盘内容读入内存的频率。
修改页面暂不换出,或者一定时间间隔后批量换出