存储管理是指主存管理(外存管理见文件系统),包括给进程分配主存片段,收回进程释放的主存片段,为分配出去的主存片段提供保护与共享,以及为作业提供一个虚拟的存储空间。
主要功能:分配,回收,保护,共享,虚存(扩充)。
3.1 物理主存
主存,是计算机系统中的存储装置。
分配主存等价于分配主存地址编号。
3.2 存储概念和虚拟管理
链接工作的实质是按照各个程序段之间的调用关系把各段的地址统一成从0开始的一维线性地址。
链接即可在作业运行之前,也可以在作业的程序段执行过程中依调用关系动态地进行。前者称为静态链接,由link程序完成;后者称为动态链接。
从0开始的指令地址和数据段地址组成作业的地址空间,它是逻辑上的,与主存地址毫不相关,因此称为虚拟空间或虚拟存储器。虚存的容量与主存大小无关,它是由计算机系统的地址结构和寻址方式确定的。
虚存:逻辑地址空间。
Windows API控制进程的虚拟地址空间
- 私有堆:用户使用HeapCreate()来产生私用堆空间;
- 保留虚空间;
- 存储映射文件。最主要的虚存管理特性是通过存储映射支持共享虚存区域。
3.3 地址交换
虚存地址到物理内存地址的转换。即把虚存的地址编号转换成主存的地址编号。
3.4 进程空间不大于主存空间的管理
直接转换。固定分区(8K,32K,64K等)。
3.4.1 固定分区
由于进程空间(PS)的虚地址是从0开始递增编址的,因此装入模块在把它装入到分区时,必须把所有虚地址变换成从分区始址为起点的物理地址,其变换公式是:
物理地址 = 虚地址 + 分区的始址
静态重定位(static address relocation)
在程序执行之前,由装入模块完成的地址变换的过程。
重定位表示地址变换。静态重定位不需要硬件支持,只需要一个装入模块就行。
动态重定位(dynamic address relocation)(重点)
指令执行过程当中进行(链接)地址变换的过程。动态重定位需要硬件支持。
固定分区的保护是指各进程空间在主存内运行时保证其每隔物理地址都不超过自己的上下限。即保护范围之外的空间不被访问。
固定分区的保护有两种方法:
基址/限长保护法(基址寄存器BR,限长寄存器LR):BR<=物理地址<=BR+LR。
上下界保护法(上界寄存器UR,下界寄存器LR):UR<=物理地址<=LR。
3.4.2 可变分区
根据进程空间的实际大小按需分配主存空间。在这种管理下,主存分区的个数,各区域的大小,在主存内活动的进程个数等都是随时间而变化的。所以可变分区又称动态分区。
可变分区分配的算法比固定分区的算法复杂。
3.4.2.1 数据结构——刻画空闲区域的情况。
有两种数据结构,即自由区表FBT(Free Block Table)和自由区链FBC(Free Block Chain)供可变分区管理选用。
FBC的设计技巧在于,它利用自由区本身的空间记录自由区的大小及前后自由区的位置。
3.4.2.2 分区分配算法
请求x大小的的自由区,有如下三种算法可用(大部分操作系统用算法1):
- 首次适应算法——沿着链表找到第一个满足x的自由区,则分割(分配)之。
- 最佳适应算法——从满足x的各自由区中选出其大小最接近x的那个自由区。
- 最坏适应算法——总是挑选最大的自由区分割给申请者。
只要2个进程空间包含相同的虚地址,物理主存分区即被2个进程所共享。同理,允许多进程共享分区。
3.4.3 页式管理
把进程空间划分成较小的片段(称为页面Page),把主存也划分成较小的片段(称为块),使页长等于块长,恰好1页能占用主存的1块。进程页面分散在主存块中,分散的好处是可以充分利用主存中空余的块。
虚空间表:登记各个进程的(在主存)的页表的数据结构。
页表:记录页面在主存的分散情况。即XX页在主存XXX块的对应关系。主存空闲块表:空闲块表:记录主存哪些块是空闲的,当某块被使用时,记录这个快的 节点被删除。
位示图:0表示已经分配(某进程占用);1表示该块未分配(空闲);
主存分块表(MBT,memory block table):状态表示块是否被分配,进程号表示此块被分配到哪个进程,页号表示进程在哪个页号。从位示图,空闲块表,主存分块表三个数据结构中可以精确地找到主存中哪个块可以被分配。把分配情况记录到页表里。
3.4.3.1地址变换与保护措施
地址变换是硬件支持。虚空间表和有效地址寄存器——>页表——>主存中找到地址。
存储键保护法:在每一主存块上都有一个密码权限K(Key)R(读)W(写)。
页表长度也起保护作用。
3.4.3.2 性能研究
在页式管理下,指令访问主存至少要2次。第一次要访问页表,第二次要访问才能访问数据所在的主存块。这使得推进的速度降低,经过改进后,使用快表(联想寄存器)效果更佳。
通常在CPU和主存之间增设高速小型的联想寄存器组,称之为“快表”,用它存放现行进程页表中最近常用的部分表目。
3.4.4 段式管理
所谓的段(segment)是指在逻辑上有完整意义的一组连续编制的代码。段由程序员定义,能用 < 段名,段内符号地址>引用段内的信息。经过编译后,<段名,段内符号地址>转换成<段号,段内位移>。
同一作业内的各段组成二维地址空间;每个分段必须分配在主存的一片连续地址区域内,但各段之间不强求连续主存。
3.4.4.1 段式管理的实现
段到内存的映射。
段表:包括段长,主存地址等,用于记录各段段长及各段在主存的起始地址等其他信息。
段式地址变换:(控制寄存器,有效地址寄存器和主存)控制寄存器记录段表ST中段表长度(起保护作用,防止越界)和段表起始地址。
3.5 进程空间大于主存空间的管理
请求页式管理:(页部分装入)先根据主存剩余空间的大小把进程中部分页装入主存,然后剩下的等需要时候再装入主存。
请求段式管理:(段部分装入):先按顺序装入内存中一部分段,剩下的等需要时候再装入。
有两种方法能“扩充”主存,第一种是覆盖,第2种是虚拟存储器。请求页式和请求段式管理是实现虚存的2个具体方案。
3.5.1 请求页式管理
根据MBT可以看出主存是否有空闲快;一条指令的执行可以可能产生多次缺页中断;对换区管理问题。
从主存中的当前块中选出一个页面淘汰(退出主存)腾出一个空闲块,以便装入所请求的页面。所用的算法是FIFO(First In First Out)和最优质换算法OPT以及最近一段时间内最久未使用的页面LRU(Least Recently Used)算法。
3.5.1.1 性能研究
M与σ的关系。其中M是给定的主存块表;σ是页面失效率(缺页率)。
页面尺寸与σ的关系。页面过小,需要频繁进行页面置换,导致性能下降;页面过大,σ几乎等于零。
σ与主存有效存取时间的关系:EAT近似等于σ×页面传输时间t(对于每一个机器这个值不变)。
颠簸:仅在本进程空间发生的颠簸称为局部颠簸。当系统内进程总数超过一定数额时,CPU的利用率反而急剧下降——系统进入颠簸。
工作集WS(working set)是指进程运行中距时刻t最近的几次访问主存所涉及到的那些页面的集合。
3.5.1.2 对换区管理
类似于Linux中的SWAP区域。硬盘分配对换区一个位置存放被置换出的页面,当内存空间不够时,把内存中一块页面交换到磁盘上这个位置,空出这块页面。当主存需要交换出去的内容时,则再交换进来这块内容。
3.5.1.3 页面共享
当某几个进程中的块号部分相同时,在主存中这几个进程可以共享相同块号的页面。当某一进程需要删除这个块时,只能删除自己的进程块。
3.5.2 请求段页式管理
3.5.2.1 实现原理
虚拟地址是二维的:< 段号S,段内位移W >。
主要是把段分成许多页,即段内分页,主存分块。
越界中断处理
越权终端处理
缺页中断处理
缺段中断处理
链接中断处理
3.5.2.2 分段动态链接
动态链接库(DLL)机制
动态链接程序分成链接和装入两个步骤
链接步骤中扫描DLL的输入库,并把一个目标模块名和一个数字入口点嵌入到用户的可执行文件中。