内存管理(下)(操作系统)

        传统的将作业调入内存的方法中存在着一些问题,比如一次性:作业必须一次性的全部装入内存才能开始运行,这就导致了,如果进程过大,可能整个内存空间都容纳不下该进程,以及如果运行作业很多,也会出现内存空间不足的问题;驻留性:作业进入内存后,直到进程运行结束才会被换出。

        根据时间局部性和空间局部性我们知道,一个作业不是所有的页面都会被使用,如果一次性的将整个作业全部调入内存也会出现内存空间浪费的问题。所以我们将会利用虚拟内存管理来解决传统的内存管理存在的问题。

        一、虚拟内存管理

        虚拟内存是先将作业的少部分程序和数据先调入内存投入运行,在程序运行期间,当所要访问的数据不在内存中,那么操作系统就会将需要的部分页面调入内存;另一方面,如果程序的某些数据内容暂时用不到,那么操作系统就会将这些页面调出内存。这样一来就可以在有限的内存空间中,运行更多的程序,系统看似为用户提供了一个比实际容量大得多的内存存储器,这就是虚拟存储器。

        1.1虚拟存储器有三大特征

        1.多次性:指作业可以分多次调入内存,即可以只调入暂时需要的部分程序和数据即可开始运行。2.兑换性:指作业中暂时用不到的那些程序和数据,可以先调出内存,以后需要的时候再调回内存。3.虚拟性:是指从逻辑上扩充了内存空间,使用户所看到的内存容量远比实际内存容量大得多。

        1.2虚拟存储技术的实现

        由于虚拟存储的特性,需要将部分程序及数据调入内存,而这种分段式的将部分程序及数据调入内存的方式,一定是分配在不连续的内存空间中的。故如果使用连续分配方式需要为作业提供连续的内存空间,那么我们也就很难做到扩充内存空间的效果。故我们可以根据非连续存储方式的那三种方法:1.分页式存储管理,2.分段式存储管理,3.段页式存储管理。改进为1.请求分页存储管理、2.请求分段存储管理、请求段页式存储管理。

        而为了实现这些存储技术:我们就需要几种必要的硬件:1.一定空间的内存和外存。2.页表机制。3.中断机构,当需要访问程序的数据时,而该部分还没有调入内存,此时就需要一个中断机构来进行中断。4.地址变换机构。其实与前面传统的存储技术相比,需要特殊记忆的就是中断机构。

        二、请求分页存储管理

        2.1页表

        请求分页存储管理是利用页表中各项数据来实现的,请求分页存储管理的页表包括页框号、状态位、访问字段、修改位、外存地址。与分页存储管理页表不同的是增加了4个变量,状态位的作用是表述该页面此时是否被调入内存;访问字段的作用是表述该页面一共被访问了多少次,或者最近是否访问过,该变量可作为页面置换算法的参考项;修改位的作用是表述该页面调入内存后是否被修改,如果被修改需要将其写回外存;外存地址用来表述该页面在外存中的地址。

        2.2地址变换机构

        首先将PCB中存放的页表起始地址以及页表长度放入CPU的页表寄存器中,然后根据逻辑地址结构的页号判断该逻辑地址是否越界。然后查询页表,找到对应的页表项,通过页表项中的状态位我们可以知道此时该页面是否调入内存,如果我们要访问的页面不在内存中,那么就需要发生缺页中断,使进程进入阻塞态,直到操作系统将页面调入内存,这里操作系统将页面调入内存需要访问I/O设备,这个过程是慢速的,如果进程频繁的调入调出页面,那么会严重的影响CPU效率。最后根据逻辑地址结构中的页内偏移量以及页框号,即可求出地址。

        与分页存储一样,请求分页存储也可以引入快表机构,引入快表机构不同点在于,如果快表未命中,而页面在页表中的状态为未调入内存,那么就需要将页面调入内存的同时将该页面写入快表,且修改慢表中的某些数据。然后再次访问快表即可命中该页面。

        2.3页面置换算法

        1.最佳置换算法(OPT)

        最佳置换算法的机制是,当为某程序分配的内存块满了之后,某页面还想要进入内存,操作系统会提前预判已经调入内存的哪些页面将在未来的时间里最久不会被使用,那么操作系统会将此页面调出内存,为该页面腾出一块内存块。

        该算法的缺页率是最低的,但是很遗憾操作系统并没有预知未来的能力。故这种置换算法在现实中是无法实现的

        2.先进先出置换算法(FIFO)

        先进先出算法的机制是,当为某程序分配的内存块满了之后,某页面还想要进入内存,操作系统会将最先进入内存的页面调出内存。但是这种方法显然具有很大的问题,因为最先进入的页面可能会被经常访问,故这种算法的性能最差,缺页率页很高。

        这种算法还会引发Belady异常,也就是当为该程序分配更多的内存块后,该程序的缺页率不降反增。

        3.最近最久未使用置换算法(LRU)

        该算法的机制是,当为某程序分配的内存块满了之后,某页面还想要进入内存,我们会利用页表中的访问字段,在访问字段中写入该页面调入内存后未被访问的时间,在驻留集中选取一个访问字段中时间最长的页面调入内存,该算法的思想在于,某页面在过去很久没有被访问,那么该页面在将来也会有很大概率很久不会被访问。但实际上过去和将来并无必然联系

        不过即便如此,该算法的算法性能还是较好,是最接近OPT算法性能的,缺页率也低,但是该算法需要向访问驻留集中的页面,这一步骤需要寄存器和栈的硬件支持。故该算法实现起来开销很大。且该算法属于堆栈类算法,不可能引发Belady异常,而先进先出置换算法属于队列算法。

        4.时钟置换算法(NRU)

                                             

        我们假设页面号引用串为1、3、4、2、5、6、3、4、7,然后我们为该进程分配5个内存块空间,然后将这5块内存空间制成循环队列的形式以便于我们指针对其循环遍历,然后我们在页表的访问位中用1来表示最近访问过该页面,用0来表示最近没有访问过该页面。

        满足以上条件后,最初5个内存块均为空,故1、3、4、2、5这五个页面可以依次进入放入内存块,接下来页面6需要进入内存空间,但是此时内存空间已经满了,我们需要将内存中访问位为0的页面置换出。但是这5个页面全都刚刚进入内存故这五个页面的访问位均为1,所以当我们的指针第一次扫描这个循环队列的时候,没有发现访问位为0的页面,所以我们想到一种解决方法,我们在扫描的时候需要将所有页面的访问位置为0,当第二次扫描的时候,第一个页面也就是1号页面的访问位为0,所以就可以将1号页面调出内存,令6号页面进入内存,扫描指针进入下一个页面。

        此时的循环队列中,6号位访问位为1,接下来3号页面和4号页面相继被访问,故需要将他们的访问位置为1,然后7号页面想要进入内存,上一次扫描后1号页被替换为6号页,扫描指针进入下一个页面也就是3号页,那么就需要从3号页开始扫描,3、4号页的访问位均为1,故扫描过后需要将他们的访问位置为0,当指针扫描到2号页时发现此时的2号页访问位为0,故2好页被调出内存,7号页替换原来2号页的位置,然后改变页表中的数据内容。

        值得注意的是,时钟置换算法与时钟管理并无关系,时钟置换算法名字是根据循环队列中指针像时钟一样循环遍历队列元素而来,需要做好区分。

        5.改进型时钟置换算法

        时钟置换算法的原理就是直接选择与第一个最近没有被访问过的页面进行替换,但是有没有一种更好的选择方法呢?由于被修改过的页面调入外存后会触发I/O设备的读写功能,那么我们可以优先选择那些调入内存后没有被修改过的且最近没有被访问过的页面来进行置换。基于这种思想,我们可以想到一种方法,我们还是按照时钟置换算法的方式将内存块中制成循环队列的方式,只不过这次我们设置两个参数,一个是访问位,一个是修改位,根据这两个参数的结合来从决定将内存中的哪些页面置换到外存。

        按照我们现在的思路来看,我们首先要淘汰的就是那些,进入内存后没有被修改过且最近没有被访问过的页面,其次就是进入内存后被修改过且最近没有被访问过的页面,再然后就是进入内存后没有被修改过但是最近被访问过的页面,最后才能淘汰最近被修改过且最近被访问过的页面。

        算法规则:我们按照这种淘汰思路来看,最多进行四次扫描即可找到需要被置换到外存的页面,那么我们可以用(访问位,修改位)这样方式来对循环队列中的页面进行淘汰,淘汰规则:首先指针第一次扫描要找到(0,0)这样的页面进行淘汰,本次扫描不修改任何标志位,若本次扫描未找到则进行第二次扫描;第二次扫描需要找到(0,1)这样的页面进行淘汰,本轮扫描需要将所有的访问位置为0,若本次扫描未找到则进行第三次扫描;第三次扫描需要找到(0,0)这样的页面进行淘汰,本轮扫描不需要修改任何标志位,若本次扫描未找到则进行第四次扫描;第四次扫描需要找到(0,1)这样的页面进行淘汰。

       其实按照我们前面的思路来讲淘汰顺序应该是:(0,0)(0,1)(1,0)(1,1),但是实际上淘汰的顺序却是:(0,0)(0,1)(0,0)(0,1),我们发现前两次的淘汰顺序是相同的,但是后两次的淘汰顺序却不同,这是由于我们第二轮扫描将所有的访问位置为0导致的,学到这里其实我是非常困惑的为什么要在第二轮将访问位置为0呢?按照时钟置换算法算法来看,由于其参数是一维的,可能第一次访问位全为1,那么如果扫描的时候不将访问位置为0的话,将会永远找不到访问位为0的页面,但是改进型时钟置换算法不同,这种算法的参数是二维的,不管页面状态如何变化,我们四轮扫描下来总能找到对应的置换页面,那还何必要去在第二轮扫描将访问位置为0呢?置为0的过程还会增大算法开销,我十分不解。有知道为什么的,还请多多指教。

        三、页面分配策略、抖动、工作集 

        首先我们需要直到驻留集的概念:驻留集是为某个程序分配一定数量的物理内存块的集合。

        3.1页面分配策略 

页面分配策略一般分为两种:固定分配和可变分配,而固定分配的含义就是分配给程序的驻留集一旦确定就不能再改变,而可变分配策略的驻留集是可以改变的。

1.固定分配局部置换:显然,由于固定分配的驻留集大小不变,故只能在分配给该进程的部分物理块中进行分配。这种分配方式由于驻留集大小不变,如果某个进程缺页率很高的话,会导致操作系统无法降低其缺页率,该方法的灵活性很差。

2.可变分配全局置换:当驻留集中有空闲的物理块时,被调入的页面会优先进入驻留集中的页框,而当驻留集存满之后,操作系统会寻找内存中其余空闲的,未锁定的内存块来储存页面。这种方法由于可以使用空闲的未锁定的内存块,灵活性很高,但是如果有很多需要被调入的页面,就会导致操作系统一直给该进程分配新的内存块,会导致多道程序并发度下降。

3.可变分配局部置换:当驻留集中有空闲的物理块时,被调入的页面会优先进入驻留集中的页框,而如果该进程频繁缺页,那么操作系统会适当的额外给该进程分配一定数量的内存块,反之如果该今晨缺页率极低,那么操作系统会回收分配给该进程的部分内存块。这种方法既保证了可变分配局部置换的灵活性,又保证了其不会给进程无限的分配内存块导致多道程序并发度下降。

        3.2调入内存的时机

1.进程运行前调入内存:此时调入内存叫做预调页策略,根据著名的局部性原理可知,被调入的页面,其邻近的页面也有很大概率被访问。那么我们就可以一次性的调入该页面周围的若干个页面,这种一次调入多个页面,显然比一次调入一个页面来的快。但是这种方法只应用于页面首次调入。

2.进程运行时调入内存:此时调入内存叫做请求调页策略,当我们要访问一个页面的时候,才将该页面按照某种方法调入内存。缺点是每次仅调入一页,增大了磁盘I/O开销。

        3.3从何处调入页面

        我们在调入页面的时候是从外存调入,而外存分为文件区和对换区,在对换区中的页面置换起来比较迅速,而在文件区的页面置换起来比较缓慢。

        当系统拥有足够多的对换区空间时,我们将外存中的页面先复制到对换区,然后再将对换区中的页面调入内存。

        但是当系统的对换区空间不足时,我们想要调入内存时就要从文件区调入,当我们修改了某些页面之后,将修改过的页面写回外存的对换区中,下次再想从用该页面,直接从对换区调入即可。而对于那些没有被修改过的页面,无需写回外存,下次要用直接从文件区调入即可。

        UNIX系统方式:调入内存时直接从文件区调入,在内存中运行过但是被置换出的页面放入对换区,下次再想调入,直接从对换区调入即可。

        注意区分UNIX方式和缺少对换区空间方式,前者是无论页面是否被修改,都将置换出的页面放入对换区,而后者是只将修改过的页面放入对换区。

        抖动、颠簸现象:该现象表现为某个进程的页面频繁的调入调出内存,原因可能是分配给该进程的内存块不足导致的。

        工作集:我们挑选最近访问过的页面队列中,所有不同的页面,就是工作集,工作集的大小一般小于驻留集。因为驻留集大于工作集才能保证最近访问的所有不同的页面都有足够的内存块空间,防止抖动、颠簸现象。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值