存储管理
一、概述
存储管理是对主存(内存)的管理,其中一大任务就是对虚拟内存管理,OS必须提供一种很好的策略来实现内存管理,使CPU尽量处于忙的状态,最大限度的降低内存读写对性能的影响。
1、内存管理目标:
-
地址保护:一个程序不能访问另一个程序的地址空间;
-
地址无关:用户不必关心程序中使用的是何种地址,此时程序是在内存还是在辅存,这些工作应由内存管理自动完成。
2、内存管理基本功能
- 内存空间的分配与回收:按程序要求进行内存分配,当程序完成后适时回收内存。
- 地址转换:实现程序中的逻辑地址到内存物理地址的转换。
- 内存共享:实现多个进程对同一个块内存区域的访问
- 内存保护:对内存中的程序和数据实施保护。
- 内存空间的扩充:实现内存的逻辑扩充,提供给用户更大的存储空间,允许比内存容量还大的程序运行。
3、地址重定位
地址重定位即地址转换,是将逻辑地址(相对地址)转化为物理地址(绝对地址)。因为只有当程序地址转化为物理地址,CPU才能执行。
(1)静态重定位
在程序执行之前进行的重定位,在程序装入内存时一次性完成指令中地址的修改
根据装配模块将程序装入的内存起始地址,直接修改程序中有关使用地址的指令
例如:MOV AX,[100],装入位置为500,则在内存中为MOV AX,[600]
缺点:程序装入内存后,不允许移动在内存中的位置,并且程序在内存中的位置必须是连续的
(2)动态重定位
将程序原封不动的装入内存中,在执行程序的过程中,动态的进行地址的重定位
动态重定位必须有硬件的支持:
- 重定位寄存器:存放程序载入的起始地址
- 加法器:将起始地址与相对地址相加获得物理地址
- 页表:分页存储管理中记录程序每页的分配情况
- 页表控制寄存器:页表起始地址和长度信息等
- 段表:分段存储中记录段的基本信息和分配信息
- 段表控制寄存器:段表起始地址和长度信息等
优点:装入内存后代码可以移动,内存空间可以不连续
二、存储管理方案
1、分区存储(静态分区)
将内存划分为若干连续区域,成为分区,每个分区只能存储一个程序,程序只能在它所驻留的分区中运行。但是内存利用率低,不能实现对内存的扩充。
(1)单一连续分区
主存被划分为两部分:
- 系统区:供OS使用(驻留监控程序、内核…)
- 用户区:供当前正在执行的程序使用
优点:
①管理简单,开销小;
②安全性高,除了系统区外,用户区中只有一个程序,不存在多个程序相互影响的问题;
③可以采用静态重定位,地址转换可以不需要硬件支持。
缺点:
①不支持多用户,内存利用率低;
②程序的地址空间受用户区空间大小的限制,若程序的地址空间比用户区大则无法装入;
③仅支持单道,资源利用率低。
(2)固定分区
将内存划分成边界固定的区域,进程运行时装入其中一个分区运行。
对于固定分区,系统为其保持了一张分区表,记录了分区的大小、起始地址、是否已分配等信息。
有两种方案:
1> 划分成大小相等的区域
优点:
所有分区都是无差别的,管理简单,可以采用静态重定位。
缺点:
程序可能太大,无法装入分区;如果很小的程序,内存会严重浪费,产生内部碎片。
2> 划分成大小不等的区域,程序装入时可以根据自身大小选择合适大小的分区
优点:
划分大小不等的分区灵活度高,也可以采用静态重定位,不需要硬件支持。
缺点:
内部碎片无法避免,如果程序太大还是不能运行。
(3)可变分区(动态分区)
在程序装入时,在可用内存中划分一段连续的区域分配给作业,这个区域大小与作业大小相等,这样就避免了内部碎片的产生。
但是随着不断地划分,会产生越来越多的外部锁片,也就是不同分区之间的无法分配的区域,这种现象可以通过压缩(拼接)技术来解决,但是这样很费时,并且需要动态重定位。
分配算法:最佳适应法、最先适应法、最坏适应法、下次适应法
2、分页式存储
将内存划分为大小固定且相等的块,块的大小相对比较小,每一块曾为帧或页帧
将进程也分割成与页帧大小相同的块,称为页(2^n)
进程的每一页可以装入内存中的任何一帧,且进程装入内存时可以是离散的,次序也可以任意。
类似于固定分区,不同之处在于,页帧很小。一个程序可以占据多个页帧,这些页帧不需要连续,也就是采用动态重定位。每个进程只有最后一页会产生内部碎片。
页表:系统为每个进程维护一个页表,给出了进程的每一页对应的页帧位置。
逻辑地址表示:(页号,页内位移)
- 页号=相对地址/页面大小
- 页内位移=相对地址%页面大小
物理地址计算公式:
帧号*帧大小+页内位移
页式存储有很多问题,如不同页面访问的权限不同,例如代码可读可执行,常量只能读,并且页式管理是离散的,对于页的划分无法形成完整的逻辑意义单位。
3、段式存储
根据用户程序本身的逻辑结构,划分成若干分段,每个分段有自己的名字,放在连续的存储区域上。例如代码段、数据段、堆栈段
分段存储是以段为单位分配内存,一个段分配一个与其大小相等的连续内存区域,同一进程的不同段可以分配在不连续的内存中且次序任意。但是每个段有最大界限,取决于硬件或操作系统。
类似于动态分区,使用大小不等的段,所以会产生外部碎片,但是一个进程被分成许多小块,因此外部碎片很小。
类似于分页,每个进程都有一个段表,其中存储段在主存中的起始地址、段的长度。
4、段页式存储
也就是以上两种的组合,先分段然后将每个段分页,所以物理内存是以页为单位。
逻辑地址=(段号,页号,页内位移)
根据段号查找对应的页表,在页表中找到页号,然后就得到了页号对应的帧号,就可以计算出物理地址。
物理地址=帧号*帧大小+页内位移
三、空闲空间管理
空闲分区表、链表、位示图