操作系统(六)—— 存储管理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Alexshi5/article/details/88651604

一、存储管理概述

1、存储体系

         内存空间,是由存储单元组成的一组连续的地址空间,简称内存空间。内存空间一般分为两部分:一部分是系统区,用以存储操作系统常驻内存部分,用户不能占用这部分空间;另一部分是用户区,分配给用户使用,用于装入并存储用户程序和数据,这部分的信息随时都在发生变化。

2、存储管理的任务

        存储管理实质上就是管理供用户使用的那部分空间。

(1) 内存的分配与回收

        ① 静态分配。程序要求的内存空间是在目标模块连接装入内存时确定分配的,并且在程序运行过程中不允许再申请附加内存空间,即分配工作是在程序运行前一次性完成的。

        ② 动态分配。程序要求的基本内存空间是在目标模块装入时确定并分配的,但是在程序运行过程中允许申请附加的内存空间,即分配工作可以在程序运行前及运行过程中逐步完成。

(2) 存储共享

       是指两个或多个进程共用内存中的相同区域,这样不仅能够使多道程序能够动态的共享内存,提高内存利用率,而且还能共享内存中某个区域的信息。共享的内容包括代码共享和数据共享,特别是代码共享要求代码必须是纯代码。

        存储共享的一个目的是通过代码共享节省内存空间,提高内存利用率;另一个目的是通过数据共享实现进程通信。

(3) 存储保护

        存储保护的内容包括:保护系统程序区不被用户有意或无意的侵犯;不允许用户程序读写不属于自己地址空间的数据,如系统区地址空间、其他用户程序的地址空间。

3、地址转换

(1) 地址重定位

        把逻辑地址转换成绝对地址的工作称为“地址重定位”或“地址转换”,也称“地址映射”。重定位的方式有“静态重定位”和“动态重定位”。

(2) 静态重定位

        内存在装入程序时,要把程序中的指令地址和数据地址全部转换成绝对地址。由于地址转换工作是在程序开始前集中完成的,所以在程序执行过程中就无需再进行地址转换工作,这种地址转换方式称为静态重定位。

(3) 动态重定位

        内存在装入程序时,不进行地址转换,而是直接把程序装入到分配的内存区域中。在程序执行过程中,每当执行一条指令时都由硬件的地址转换机构将指令中的逻辑地址转换成绝对地址。这种方式的地址转换是在程序执行时动态完成的,所以称为动态地址转换。

二、分区管理方案

1、固定分区

        固定分区是指系统先把内存划分成若干个大小固定的分区,一旦划分好,在系统运行期间便不再重新划分。为了满足不同程序的存储需求,各分区的大小可以不同。由于每一分区的大小是固定的,就对可容纳程序的大小有所限制。因此,程序在运行时就必须提供对内存资源的最大申请量。

2、可变分区

        可变分区是指系统不预先划分固定分区,而是在装入程序时划分内存分区,使为程序分配的分区的大小正好等于该程序的需求量,且分区的个数是可变的。显然,可变分区有较大的灵活性,较之固定分区能获得较好的内存利用率。

        系统初启后,在内存中除操作系统区之外,其余空间为一个完整的大空闲区。当有程序要求装入内存运行时,系统从该空闲区中划分出一块大小相同的区域进行分配。当系统运行一段时间后,随着一系列的内存分配与回收。原来的一整块大空闲区形成了若干占用区和空闲区相间的布局。若有上下相邻的两块空闲区,系统应将它们合并成一块连续的大空闲区。

(1) 紧缩技术

        解决碎片问题的办法是在适当时刻进行碎片整理,通过移动内存中的程序,把所有空闲碎片合并成一个连续的大空闲区并放在内存的一端,而把所有程序占用区放在内存的另一端。这一技术称为“紧缩技术”或“压缩技术”。

(2) 内存分配表

        内存分配表由两张表格组成。一个是已分配区表,记录已装入程序在内存中占用分区的起始地址和长度,用标志位指出占用分区的程序名。另一个是空闲区表,记录内存中可供分配的空闲区的起始地址和长度,用标志位指出该分区是未分配的空闲区。

(3) 操作系统查找和分配空闲区的三种分配算法

① 最先适应算法

        又称为顺序分配算法,当接到内存申请时,顺序查找分区说明表,找到第一个满足申请长度的空闲区,将其分割并分配。此算法比较简单,可以快速作出分配决定。

② 最优适应算法

        当接到内存申请时,查找分区说明表,找到第一个能满足申请长度的最小空闲区,将其分割并分配。此算法最节约空间,因为它尽量不分割大的空闲区;其缺点是可能会形成很多很小的空闲内存碎片。

③ 最坏适应算法

        当接到内存申请时,查找分区说明表,找到能满足申请要求的最大空闲区。该算法的基本思想是:在大空闲区中装入信息后,分割剩下的空闲区相对也很大,还能用于装入其他程序。

(4) 分区管理方案的优缺点

        分区管理是实现多道程序设计的一种简单易行的存储管理技术。通过分区管理,内存真正成为了共享资源,有效地利用了处理器和IO设备,从而提高了系统的吞吐量和缩短了周转时间。分区存储管理算法比较简单,所采用的表格不多,实现起来比较容易,内存额外开销较少,存储保护措施也很简单。

        在内存利用率方面,可变分区的内存利用率比固定分区高。

        分区管理的主要缺点是:内存使用仍不充分,并且存在着较为严重的碎片问题。虽然可以解决碎片问题,但需要移动大量信息,浪费了处理器的时间。此外,分区管理不能为用户提供虚拟存储,即不能实现对内存的扩充,每一个用户程序的存储要求仍然受到物理存储器实际存储容量的限制。分区管理要求运行程序一次全部装入内存之后,才能开始运行。这样,内存中可能包含有一些实际不使用的信息。

三、覆盖与交换技术

1、覆盖技术

        覆盖技术是指一个程序的若干程序段,或几个程序的某些部分共享一个存储空间。覆盖技术的实现是把程序划分为若干个功能上相对独立的程序段,按照其自身的逻辑结构使那些不会同时执行的程序段共享同一块内存区域。未执行的程序段先保存在磁盘上,当有关程序段的前一部分执行结束后,把后续程序段调入内存,覆盖前面的程序段。

2、交换技术

        在分时系统中,用户的进程比内存能容纳的数量要多,这就需要在磁盘上保存那些内存中放不下的进程。在需要运行这些进程时,再将它们装入内存。

        在实际操作系统中使用交换技术需要考虑的问题:换出进程的选择、交换时机的确定、交换空间的分配、换入进程换回内存时位置的确定。

四、虚拟页式存储管理方案

1、虚拟存储技术

        虚拟存储技术的基本思想是利用大容量的外存来扩充内存,产生一个比实际内存大的多的逻辑虚拟内存空间,简称虚存,以便能够有效地支持多道程序系统的实现和大型程序运行的需要,从而增强系统的处理能力。

        虚拟存储器的工作原理:当进程开始运行时,先将一部分程序装入内存,另一部分暂时留在外存;当要执行的指令不在内存时,由系统自动完成将它们从外存调入内存的工作;当没有足够的内存空间时,系统自动选择部分内存空间,将其中原有的内容交换到磁盘上,并释放这些内存空间供其他进程使用。

        虚拟存储技术和交换技术在原理上有些相似,不同的是交换技术是以进程为单位进行的,而虚拟存储一般是以页为单位进行的。

2、虚拟页式存储管理

        存储管理部件首先将内存分成大小相等的许多区,把每个区称为物理页面,物理页面是进行内存空间分配的物理单位。同时,要求程序中的逻辑地址也进行分页,页的大小与物理页面的大小一致。此时,逻辑地址可被称为虚拟地址。这样,就可以把程序信息按页存放到物理页面中。页式存储地址提供编程使用的虚拟地址由两部分组成:虚拟页号和页内地址。

3、物理内存的分配与回收

        页式存储管理分配内存空间以物理页面为单位,由于物理页面的大小是固定的,所以只要在内存分配表中指出哪些物理页面已经分配、哪些物理页面没有分配以及当前剩余空间的物理页面数这三种标识即可。

        简单的内存分配表可以用一张位示图构成,在位示图中每一位与一个物理页面对应,每一位的值可以是0或1,0表示对应的物理页面为空闲,1表示已占用。在位示图中再增加一个字节记录当前剩余的总空闲物理页面数,在进行内存分配时,首先查看空闲物理页面数是否能满足要求,能满足则从位示图中找出一些为0的,将值更新为1,并从空闲页面数中减去本次分配的页面数,然后按照找到的位计算出对应的物理页面号。

4、虚拟页式存储地址转换过程

        页式存储管理要为每个装入内存的进程提供一张页表,该页表所在内存的起始地址和长度作为现场信息存储在该进程的进程控制块中。一旦进程被调度进入处理器执行,这些信息将被作为恢复现场信息送入系统的地址映射机制中的寄存器里。

(1) 页式存储管理的地址转换

       为了实现页式存储管理,系统要提供一对硬件的页表控制寄存器,即页表始址寄存器和页表长度寄存器,另外还需要高速缓冲存储器的支持。

        页表指出该程序虚拟地址中的页号与所占用的物理页面号之间的对应关系,页表的长度由程序拥有的页面数而定。

        页表又是硬件进行地址转换的依据,每执行一条指令时按虚拟地址中的页号来查询页表。如果表中无此页号,则产生一个地址错的程序性中断事件。若有,则可以得到对应的物理页面号。

(2) 页表项

        在进程开始运行之前,不是装入全部页面,而是装入零个或多个页面,之后根据进程运行的需要,动态装入其他页面;当内存空间已满,而又需要装入新的页面时,则根据某种算法淘汰某个页面,以便装入新的页面。

(3) 页表的分类

① 多级页表

        大多数操作系统中采用二级页表,即由页表页和页目录一起构成进程页表。第一级表示页目录,保存页表页的地址;第二级表示页表页,保存物理页面号。

② 散列页表

        当地址空间大于32位时,一种常见的方法是使用以页号为散列值的散列页表。其中每个表项都包含一个链表,该链表中元素的散列值都指向同一个位置。这样,散列页表中的每个表项都包含三个字段:虚拟页号、所映射的页框号、指向链表中的下一个元素的指针。

③ 反置页表

        在反置页表中,每个物理页框对应一个表项。每个表项包含与该页框对应的虚拟页面地址,以及拥有该页面进程的信息。因此,整个系统中只存在一个页表,并且每个页框对应其中一个表项。由于一方面系统中只有一个页表,而另一方面系统中又存在着多个映射着物理内存的地址空间,因此需要在反置页表中存放地址空间标志符。

(4) 转换检测缓冲区

        利用高速缓冲存储器存储当前访问最频繁的小数活动页面的页号,这个高速缓冲存储器称为“转换检测缓冲区”,也称为“快表”。

(5) 缺页异常处理

① 根据当前执行指令中的逻辑地址查页表的有效位,判断该页是否在内存中;

② 该页标志为0,形成缺页异常。保留现场,中断装置通过交换PSW让操作系统中的中断处理程序占用处理器;

③ 操作系统处理缺页异常,寻找一个空闲的页面;

④ 若有空闲页,则把磁盘上读出的信息装入该页面中;

⑤ 修改页表及内存分配表,表示该页已在内存;

⑥ 如果内存中没有空闲页,则按某种算法选择一个已在内存中的页面,把它暂时调出内存。若在执行中该页面已被修改过,则要把该页信息重新写回到磁盘上,否则不必重新写回磁盘。当一页被暂时调出内存后,让出的内存空间用来存储当前需要使用的页面。页面被调出或装入之后都要对页表及内存分配表作修改。

⑦ 恢复现场,重新执行被中断的指令。当重新执行该指令时,由于要访问的页面已被装入内存,所以可以正常执行下去。

(6) 页面高度策略

        虚拟存储器系统通常定义三种策略来规定如何进行页面调度:调入策略(请求调页和预调页)、置页策略和置换策略(固定分配局部换、可变分配全局置换和可变分配局部置换)。

(7) 页面置换算法

① 理想页面置换算法(OPT)

        OPT算法淘汰以后不再需要的或者在最长时间以后才会用到的页面。

② 先进先出页面转换算法(FIFO)

        FIFO算法总是选择最先装入内存的一页调出,或者说是把驻留在内存中时间最长的一页调出。

        FIFO算法的实现过程是:把装入内存的那些页面的页号按进入的先后次序排好队列,每次总是调出队首的页,当装入一个新页后,把新页的页号排入队尾。由操作系统维护一个所有当前在内存中的页面的链表,最老的页面在表头,最新的页面在表尾。当发生缺页时,淘汰表头的页面并把新调入的页面加入到表尾。

③ 第二次机会页面置换算法

        FIFO算法可能会把经常使用的页面置换出去,为了避免这一问题,对该算法进行一个简单的修改:检查进入内存时间最久页面的R位,如果是0,那么这个页面既老又没有被使用,可以立即置换到;如果是1,就将R位清0,并把该页面放到链表的尾端,修改其进入时间,然后继续搜索。

④ 时钟页面转换算法

        由于第二次机会算法经常要在链表中移动页面,降低了效率,一个更好的办法是把所有的页面都保存在一个类似时钟钟面的环形链表中,一个表针指向最老的页面。当发生缺页时,算法首先检查表针指向的页面,如果它的R位是0就置换该页面,并把新的页面插入这个位置,然后把表针向前移动一个位置;如果R位是1就清除R位并把表指针向前移一个位置,重复这个过程直到找到了一个R位为0的页面为止。

⑤ 最近最少使用的页面置换算法(LRU)

        这个算法是淘汰掉最长时间未被使用过的页面。实现它的方法是:在页表中为每一页增加一个计时标志,记录该页面自上次被访问以来所经历的时间,每被访问一次都应从0开始重新计时。当要装入新页面时,检查页表中各页的计时标志,从中选出计时值最大的那一页调出,并且把各页的计时标志全部置为0,重新计时。

(8) 缺页率

        影响缺页率的因素有:

① 分配给程序的物理页面数;

② 页面的大小;

③ 程序编制方法;

④ 页面调度算法。

5、虚拟页式存储管理的优点和缺点

        虚拟页式存储管理的主要优点是:由于它不要求进程的程序段和数据在内存中连续存放,从而有效地解决了碎片问题。这既提高了内存利用率,又有利于组织多道程序执行。

        虚拟页式存储管理的主要缺点是:存在页面空间的浪费问题,这是由于各种程序代码的长度是各不相同的,但页面的大小是固定的,所以在每个程序的最后一页内总有一部分空间得不到利用。如果页面较大,则由此引起的存储空间的损失仍然较大。

猜你喜欢

转载自blog.csdn.net/Alexshi5/article/details/88651604