存储管理方案

存储管理

一、概述

​ 存储管理是对主存(内存)的管理,其中一大任务就是对虚拟内存管理,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、段页式存储

也就是以上两种的组合,先分段然后将每个段分页,所以物理内存是以页为单位。

逻辑地址=(段号,页号,页内位移)

根据段号查找对应的页表,在页表中找到页号,然后就得到了页号对应的帧号,就可以计算出物理地址。

物理地址=帧号*帧大小+页内位移

三、空闲空间管理

空闲分区表、链表、位示图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值