操作系统 存储管理概述

您所在的位置:网站首页 edp存储管理系统 操作系统 存储管理概述

操作系统 存储管理概述

2024-05-28 07:07| 来源: 网络整理| 查看: 265

文章目录 概述基本概念分区存储管理分区保护 分页存储管理地址组成页面映射表快表两级页表 分段存储管理地址组成段映射表 段页式存储管理虚拟存储管理实现方式请求分页管理页面置换算法

概述

在操作系统的概念中,存储管理的对象主要是主存存储器(内存),主存是计算机系统中的关键性资源,是存放信息、程序的主要场所。

操作系统中存储管理的主要功能是负责主存空间分配和回收、提高主存利用率、扩充主存及对主存信息提供保护。

为了解决多个用户、程序使用主存问题,诞生了许多种管理方法,它们主要有:分区存储管理、分页存储管理、分段存储管理、段页式存储管理、虚拟寄存管理。下面将逐一进行简单的介绍。

基本概念

有几个基本的概念要先做个简单的了解。

逻辑地址

对于程序员而言,地址都是由符号(标识符、变量名)决定的,源程序的地址空间都是从0号单元开始编址的,并按顺序分配所有符号对应的地址。

但它不是操作系统中主存的真实地址。逻辑地址也称为相对地址、程序地址、虚拟地址。

地址空间

逻辑地址所组成的地址空间称为逻辑地址空间,而逻辑地址可以通过地址重定位转换为绝对地址(物理地址),绝对地址组成的地址空间称为物理地址空间。

存储空间

指物理地址空间,它是物理地址的集合。顺带的,逻辑地址空间简称为地址空间。

地址重定位

将逻辑地址转换为主存物理地址(绝对地址)的过程就是地址重定位。

在可执行文件加载时,就需要解决可执行文件中逻辑地址与主存地址的对应关系,这个过程由操作系统中的加载程序和地址重定位机构完成。地址的重定位又分为两类:

静态重定位

在程序装入主存时就完成逻辑地址到物理地址的转换,且程序执行期间不会发生变化。其优点是这种变换无需硬件地址变换机构支持,它只要求程序本身是可重定位的。在早期的操作系统中大多采用这种方法,但缺点在于必须为程序分配一块连续的存储区域,并且执行期间无法调整大小,也不能在主存中移动,且难以共享同一程序的副本与数据。

动态重定位

在程序运行时完成逻辑地址与物理地址的转换。但这种机制依赖硬件地址变换机构,如基地址寄存器(BR)等。动态重定位的优点在于程序在执行期间可以被换入和换出主存,让主存的使用更灵活,且可在主存空间中移动以消除主存的碎片,也不必给程序分配连续的空间,更简单的实现共享等。

分区存储管理

这是一种早期的管理方法,基本思想在于把主存的用户区划分为若干区域,每个区域分配给一个用户程序使用,并限定它们只能在自己的区域中运行。按照区域划分方式的不同,分区又有如下方法:

固定分区

操作系统会将主存划分为若干个分区,每个分区大小可不等,操作系统主要通过主存分配情况表管理主存,但这是一种静态的分区方法,也就是说不可变。这种方式很容易造成浪费,分配的区大小不太可能刚好和程序所需的空间相等,造成了空间的浪费。

可变分区

操作系统在程序加载时再进行动态的分区,分区的大小和程序所需的是相当的。可变分区的分配需要两种管理表分别记录已分配和未分配的分区情况。

对可变分区的请求和释放主要有如下4种算法:

最佳适应算法

设系统中存在 n n n个空白区(自由区),每当程序申请一个空间时,将从 n n n个空白区中找一个最接近程序需求的分区,拆分成满足进程需求部分后分配给进程使用。缺点和固定分区类似,因为空闲区可能会造成许多碎片,且可能产生小的无任何作用的碎片(外碎片)。

最差适应算法

与最佳适应相反 ,系统总是将最大的空白区拆分给程序使用,这样拆分后的空白区通常不容易产生外碎片。

首次适应算法

每当程序申请空间时,系统总是从主存的低地址开始选择一个能使用的空白区,这样的好处在于程序释放空间后,更容易实现相邻空白区的合并。

循环首次适应算法

与首次适应不同的地方在于,每次分配都尽量从刚分配的空白区开始找一个能满足程序要求的空白区。

可重定位分区

可变分区虽然能让主存变的更灵活,但系统总是在不断分配和回收,必定会出现一些不连续的小分区。尽量小分区的总和也许能满足一个程序的要求,但由于不连续往往不能分配使用,这就产生了外碎片。

这种方式主要为了解决碎片产生的问题,解决的方式自然是将外碎片都拼接(也称为紧凑)在一起,即内存整理,通常是将已分配的分区往一个方向移动,外碎片自然就会消失。

但移动分区的代价是昂贵的,所以移动的时机一般在程序请求空间失败或某程序执行完毕后。

另外,分区移动时会导致分区所处的物理地址发生变化,所以有地址的重定位问题。

分区保护

为了防止进程使用不属于自己的分区,通常使用两种方式加以保护:

采用上/下界寄存器采用基址/限长寄存器

这两种寄存器的方式都是在于限定物理地址的区间,就如同编程中对数组上下界的标记。这种保护同样应用于其他形式的存储管理中。

分页存储管理

尽管分区管理已经实现了多道程序共享主存,但分区主要问题在于程序必须装入连续的地址空间中,若不能满足这个要求,则分区需要整理。但整理需要耗费大量的系统时间,因此又提出了分页存储管理。

将一个 进程的地址空间划分为若干大小相等的区域 ,称为 页 。相应地,将 主存空间划分成与页相同大小的若干个物理块 ,称为 块 或 页框 。用进程一词而非程序主要强调进程的活动性。

分页即为进程分配主存时,将进程中的若干页分别装入多个不相邻的块中。

地址组成

由于一个进程所使用的页在主存中可能并非是连续的,因此分页系统需要一种特别的地址结构。

其主要由两部分组成:页号§、偏移量(W)(也叫页内地址)。页面的大小由偏移量长度决定,分页数量由页号长度决定。

如假定地址长度为32位,低12位为页内地址,高20位为页号。则地址空间大小最多有约1Mb个页。

页面映射表

当进程中多个页离散的分配到了主存中多个物理块时,系统需要一种方式能找到进程中的页对应主存中的物理块。为此,系统会为 每个进程 建立页面映射表(页表),而该页表的起始地址和长度会存放于进程的PCB中。每个页在页表中占一个表项,记录该页对应主存的物理块号。

页表及映射流程如下图:

Memory Page Mapping

可以清楚的看到,页表主要管理的是 页号 与 物理块号 的关系。

快表

从上面地址映射的过程可以看到,分页存储管理至少需要访问两次主存:第一次是为了访问页表取得物理地址;第二次才是存取数据;

为了提高访问主存的速度,可以降低访问页表的时间,这样一来就有两种方式:一种是使用高速寄存器来存放页表,但这需要大量的硬件资源,过于昂贵;其二就是通过在地址映射机构中应用小容量的 相联存储器 ,这也称之为快表,这种技术也用在CPU高速缓存中。

这里的相联存储器只保存当前进程最活跃的少数页的物理块号,当在相联存储器中找不到对应的页时仍使用系统的页表进行。实际上,这两种方式是并行进行的。

两级页表

在80386上共有逻辑地址 2 32 2^{32} 232个(32位寻址CPU),若页面大小为 2 12 = 4 k b 2^{12} = 4kb 212=4kb,则页表项达 2 20 = 1048576 2^{20} = 1048576 220=1048576个,每个页表项需4B空间,则对于每个进程的页表就需要4MB的主存空间,且还需要是连续的,显然这难以实现。

为了减少页表所需的连续主存空间,在80386中采用了两级页表机制,基本方法就是对页表再分页。

分段存储管理

在分段存储管理方式中,进程的地址空间被划分为若干个段,与分页不同的是,段拥有完整的逻辑信息,如段有主程序段、子程序段、数据段、堆栈段等。每个段都有自己的名字,都是从0开始编址的一段连续的地址空间,段之间的长度不相等。

地址组成

分段存储也将地址分为两部分:段号(S)、段内地址(d)。段的大小由段内地址长度决定,段的数量由段号长度决定。

段映射表

与分页相同,系统也设置了一个段映射表(段表),其结构与页表类似,除了含义略微不同。如下:

Segment Mapping

主要的不同由于分段不同分区对应某一块,因此其段表记录的是段号对应的物理地址的起始点及长度,实际上在最后一步的映射里会检查段内地址是否大于段长,图中没有显示。

段页式存储管理

分页的主要缺点在于难以实现内存共享,而分段系统的内存利用率则不及分页。因此折中一下就产生了段页式的管理方式。其基本方法是先将主存划分成页框,然后按程序逻辑关系分段,最后再将每个段分页,这样一来就兼顾了两者的优点。

在段页式系统中,其地址有三个部分:段号、段内页号、页内地址

系统中同时配备页表与段表,但略有不同的是,段表中的页才是实际上被离散的单位。因此 段表中的内容不是段的基址和长度,而是页表地址和页表长度 。

其地址变换过程如下:

根据段号查段表,得到页表起始地址根据页号查页表,得到物理块号将物理块号与页内地址拼接得到物理地址 虚拟存储管理

前面的方法都是需要为程序提供足够的空间,否则就无法分配空间,程序也无法启动。

但有时候程序只需部分装入主存即可启动,其余部分可暂时留在外存上,需要时再加载。这样来看,外存的一部分似乎在逻辑上也变成了主存,这种空间形成的存储器,称为虚拟存储器,虚拟存储器的容量由计算机地址结构决定。

在1968年P. Denning就指出,程序在执行时其实呈现的是局部性规律,即一段时间内程序执行仅局限于某个部分。相应的,它所访问的主存也仅限于某个区域内。这种局限性有两方面:

时间局限性

程序中某条指令一旦执行,则将来该指令可能再次被执行;某个存储单元被访问,则将来该存储单元可能再次被访问;产生这种局限性的原因主要是程序中普遍存在大量的循环操作。

空间局限性

程序中某个存储单元被访问,则将来附近的存储单元最有可能被再次访问;产生这种局限性的主要原因是程序是顺序执行的。

基于这个规律,使得虚拟存储是可能的,它可以使不常用的部分暂时挪出主存,提升主存的利用率。虚拟存储管理的目的就是为了逻辑上扩大主存容量,虚拟存储的容量取决于计算机的地址结构。

实现方式

前面提到,虚拟存储的关键在于可以逻辑上的将外存当做主存,也就是说为主存和外存之间提供了交换数据的能力,并且逻辑上是一体的。

其实现的关键就在于为各种存储管理方式提供 调入 和 置换 的能力。只是对于不同的存储方式其操作的单位不一。

下面主要就简单介绍分页是怎么实现的。

请求分页管理

在纯分页存储管理的基础上增加请求调页,页面置换功能就能形成分页虚拟存储系统,这也是目前最常用的虚拟存储的方式。

请求分页的页表是在普通分页的页表机制上形成的,由于需要标记出实际位于主存和外存的部分,因此页表也需增加若干项(如状态位、访问字段、辅存(外存)地址)以供需要页面置换时参考。因此在地址变换结构上也需要做出相应的变化,如页在主存与辅存之间交换时需产生中断(称缺页中断)等。

在请求分页系统中,每当访问的页不在主存中时,都需要产生缺页中断,请求操作系统将目标页调入主存。这种中断与一般中断的区别在于:

缺页中断在指令执行期间产生和处理,而一般中断一般是在下一条指令开始执行前检查和处理。缺页中断产生时,需返回被中断的指令重新执行。一条指令执行期间可能会产生多次缺页中断。 页面置换算法

页面置换是虚拟存储的核心,为了决定哪个分页应该调出主存,哪个分页应该调入主存,需要根据一定算法来实现,这个算法的优劣直接决定了虚拟存储的效率。不适当的算法会导致系统频繁的发生 抖动(Thrashing) ,即一个分页刚被调出主存马上又被访问,需重新调入。使得一个进程在运行中把大部分的时间都浪费在页面置换上。

一个好的算法通常缺页率更低,其计算方法为: 缺 页 率 f = 缺 页 次 数 / 访 问 次 数 缺页率f = 缺页次数 / 访问次数 缺页率f=缺页次数/访问次数。

常用的页面置换算法主要有下面几种:

最佳(Optimal)置换法

理想化算法,选择一些永远或最长时间不被访问的页面置换出去,理论性能最好,但却无法实现。要确定哪个页面是未来最长时间不再被访问是很难的,通常这个方法只是作为评价其他算法的基准。

先进先出(FIFO, First In First Out)置换法

总是将最先进入主存的页面置换出去,即在主存中驻留最长时间的页。这种算法实现简单,只需使用队列即可实现,但这种算法性能也非常差。甚至会出现为其分配的主存空间增大缺页率反而提高的现象,这种现象又称为 Belady 异常现象。

最近最少未使用(LRU, Least Recently Used)置换法

总是将最近最少未使用的页面置换出去,系统会在每个页均设置一个字段,记录该页面自上次访问以来的时间 T T T,当要置换一个页面出去时选择 T T T最大的页面。不过为了记录这个字段,通常需要硬件的支持(寄存器等)。

最近未用(NUR, Not Used Recently)置换法

总是将最近未访问过的页面置换出去,这种方法与LRU是类似的。也为每个页面设置一个标志位,每次页面被访问则将标志位设置为1。每当要置换出去一个页面时,检查标志是否为0,是则置换出去,否则将其标志为置为0,然后检查下一个页,直到出现标志为0的页面。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3