存储管理(一)

1.1 存储管理的概念

计算机存储结构

  • 寄存器是中央处理器的组成部分,速度最快,长度一般以字(word)为单位

  • 主存(内存)用于保存当前进程运行时的程序和数据,以字节为基本存储单位,每个存储单元分配一个唯一的地址,称为内存地址

  • 高速缓存介于中央处理器和主存储器之间的高速小容量存储器,其容量大于寄存器而小于主存储器,访问速度要快于主存储器而低于寄存器。缓存中存放的都是CPU频繁访问的数据,所以缓存越大处理器效率就越高

程序的运行过程

链接阶段

静态链接(可执行程序全部进入内存方可执行)

  • 在程序运行之前,先将各目标模块及它们所需的库函数,链接成一个完整的装配模块,以后不再拆开

  • 特点

    • 不能更新和修改

装入时的动态链接(执行程序全部进入内存方可执行)

  • 用户源程序编译后得到的一组目标模块,在装入内存时,采用边装入内存边链接的链接方式

  • 特点

    • 便于修改和更新,静态链接则要重新编译、链接

    • 便于实现目标模块的共享

    • 节省内存空间

运行时的动态链接(执行程序部分进入内存即可执行)

  • 对某些目标模块的链接,是在程序执行中需要该模块时,才对它进行链接

  • 特点:

    • 加快程序装入过程

    • 节省大量内存空间

装入阶段
解释:
        用户程序经编译之后的每个目标模块都以0为基地址进行顺序编址,这种地址称为相对地址或逻辑地址;
        内存中的各物理存储单元的地址是从统一的基地址开始顺序编址的,这种地址称为绝对地址或物理地址。

绝对装入方式

  • 装入程序按照装入模块中的绝对地址将程序和数据装入内存

    • 装入模块可以把用户程序装入到指定的位置,这时程序中用到的所有地址都是内存中的绝对地址

    • 程序中的逻辑地址与实际物理地址完全相同

  • 只适合于单道程序系统(只能将目标模块装入到内存中事先指定的位置)

可重定位的装入方式

  • 目标模块的地址从0开始,其它地址相对于起始地址计算

  • 装入程序根据内存使用状况,将程序装入内存

    • 用户程序中使用的地址是相对地址,地址的定位由装入程序在装入是完成。

  • 适合于多道程序系统

  • 特点:

    • 编译程序在进行编译时,产生相对地址的目标模块。目标模块地址从0开始

    • 重定位:装入时对目标程序中的指令和数据地址的修改过程

    • 实际装入内存的物理地址=逻辑地址+程序起始地址

    • 静态重定位:地址变换只在装入时一次完成,以后不再改变

动态运行时的装入方式

  • 在把装入模块装入到内存后,并不立即把装入模块中的相对地址转换为绝对地址,地址转换推迟到程序要真正执行时才进行;这种装入方式允许程序在内存中搬家

  • 概念:

    • 在程序执行过程中,每当访问指令或数据时,将要访问程序或数据的逻辑地址转换成物理地址。需要重定位寄存器的支持

    • 重定位寄存器:装入程序在内存中的起始地址

  • 特点:

    • 目标模块起始地址从0开始

    • 将内存转换推迟到运行时才完成。

存储管理的任务和功能

任务:

  • 支持多道程序的并发执行

  • 方便用户

  • 提高存储器的利用率和系统吞吐量

  • 从逻辑上扩充内存空间

功能:

  • 存储空间的分配和回收

    • 任务:

      • 为每道程序分配内存空间

      • 提高存储器的利用率

      • 允许正在运行的程序申请附加内存空间

  • 地址转换

    • 静态地址重定位

      • 在用户程序执行之前完成地址映射工作,即把程序的逻辑地址都转换为实际的内存物理地址

      • 只在装入时一次完成,在程序运行期间不再变化

      • 优点:

        • 不需要硬件支持

        • 实现存储管理的软件算法简单

      • 缺点:

        • 要求给每个作业分配一个连续的存储空间,并且在作业执行期间不能再移动,从而也就不能实现重新分配内存

        • 静态地址重定位必须占用连续的内存空间,这就难以做到程序和数据的共享

        • 用户必须事先确定所需的存储量,若所需的存储量超过可用存储空间时,用户必须考虑覆盖结构

    • 动态地址重定位

      • 在程序执行过程中,CPU在访问内存之前,将要访问的程序或数据地址转换为内存地址

      • 地址重定位机构需要一个(或多个)基地址寄存器BR和一个(或多个)程序逻辑地址寄存器VR

        • 指令或数据的内存地址MA与逻辑地址的关系为

          • MA=(BR)+ (VR)

      • 过程:

        • (1) 初始化基地址寄存器BR,逻辑地址寄存器VR

        • (2) 将程序段装入内存,且将其占用的内存区首地址送到BR中。例如,在图5-4中,(BR)=4000

        • (3) 在程序执行过程中,将所要访问的逻辑地址送入VR中,例如,在图5-4中执行LOAD 1,400语句时,将所要访问的逻辑地址400放入VR中

        • (4) 地址变换机构把VR和BR的内容相加,得到实际访问的物理地址

      • 优点:

        • 可以对内存进行非连续分配

        • 用户作业在执行过程中,可以动态申请存储空间和在主存中移动。动态地址重定位提供了实现虚拟存储器的基础

        • 有利于程序段的共享

      • 缺点:

        • 需要附加的硬件支持(逻辑地址与物理地址映射过程)

        • 实现存储管理的软件算法比较复杂

存储管理方式

  • 连续分配方式

  • 离散分配方式

  • 虚拟存储系统

1.2 连续内存分配

单一连续分配方式

  • 内存区划分:

    • 系统区(仅供操作系统使用)

    • 用户区(仅驻留一道程序,整个用户区为一用户独占)

  • 通常只能用于单用户、单任务的操作系统中

分区式分配方式

解释:
        可能产生多个不可利用的零头(也称“碎片”)
固定分区

划分分区的方法:

  • 分区大小相等,连续存储各个进程的程序和数据

内存分配与回收:

  • 将内存分区根据其大小进行排队,并为之建立一张分区说明表,表中包含各分区的区号、大小、起始地址及状态(是否为空闲)等信息

  • 固定分区的回收比较简单,当程序执行完毕不再需要内存资源时,释放程序占用的内存分区空间,管理程序只需将对应分区的状态信息设置为未分配即可

数据结构:

  • 分区说明表——含有内存中的分区个数、使用状况等内存分配程序

  • 检索分区说明表,寻找空闲分区分配给程序

动态分区

基本思想

  • 新进程到达时,为其分配所需的确切数量的空间,进程终止时,释放分区,并且和相邻的空闲区合并

  • 分区的大小可变,分区数目可变

内存分配与回收:

  • 进程运行结束释放内存时,系统要回收已经使用完毕的空闲区,并将其插入空闲分区表(链)

空闲分区表

包含分区号、分区起始地址、分区大小以及状态等信息

空闲分区链

空闲分区链使用链表指针将内存中的空闲分区链接起来

分配算法

  • 首次适应算法(最先适应算法)

    (查找速度、回收区释放速度最快、利用率最高)

    • 过程:

      • 空闲分区以地址递增次序排列

      • 内存分配从空闲分区表首开始查找

      • 找到大于或等于所要求内存长度的分区,结束查找

      • 从该分区中划出所要求的内存长度分配给请求者,余下的空闲分区仍留在空闲分区表(链)中,同时修改其相应的表(链)项

    • 特点:

      • 优先利用内存低地址部分的空闲分区,留高地址部分的大空闲区

      • 低地址部分易留下许多难以利用的小空闲分区

      • 每次查找从低地址部分开始,增加了查找可用空闲分区的开销

  • 循环首次适应算法(下次适应算法)

    • 过程:(同首次适应算法)

      • 循环链表

      • 上次找到的空闲分区的下一个开始找

    • 特点:

      • 使存储空间的利用更加均衡

      • 减少了查找空闲分区的开销

      • 会导致缺乏大的空闲分区

  • 最佳适应算法

    • 过程:

      • 空闲分区按大小递增次序排列

      • 从空闲分区表(链)首开始顺序查找,当找到第一个满足要求的空闲区时,停止查找

      • 如果空闲分区大于作业的大小,则与最先适应算法相同

    • 特点:

      • 尽可能为作业选择大小一致的空闲分区,保留大的空闲分区

      • 在存储器中留下许多难以利用的小空闲分区

  • 最坏适应算法

    • 过程:

      • 空闲分区按大小递减次序链接

      • 作业申请一个空闲区时,先检查空闲分区表(链)的第一个空闲分区的大小是否大于或等于所要求的内存长度

      • 若第一项长度小于所要求的大小,则分配失败,否则从该空闲分区中划出与作业大小相等的一块内存空间分配给作业,余下的空闲分区仍然留在空闲分区表(链)中

    • 特点:

      • 挑选满足作业要求的最大分区分配给作业

      • 有大作业到来时,其存储空间的申请往往得不到满足

可重定位分区

拼接技术

将内存中的所有作业进行移动,使它们相邻接,从而使得原来多个离散的小分区可以合并成一个大分区(缺点:代价太大)

  • 碎片

    • 内部碎片

      • 在一个分区内部出现的碎片称作内部碎片,如固定分区法就会产生内部碎片

    • 外部碎片

      • 在所有分区之外新增的碎片称作外部碎片,如在动态分区法实施过程中出现的越来越多的小空闲块就是外部碎片,由于它们太小,无法装入一个进程,因而被浪费掉

  • 解决碎片:拼接(紧凑、紧缩)

    • 内存拼接方法

      • 紧凑要求地址变换采用动态重定位

    • 拼接的时机

      • 第一种方案是在某个分区回收时立即进行拼接

        • 该实现方案因拼接频率过高而使系统开销加大

      • 第二种方案是当找不到足够大的空闲分区且空闲分区的总容量可以满足作业要求时进行拼接

        • 该实现方案空闲分区的管理稍微复杂一些

可重定位分区分配技术

  • 算法思想

    • 可重定位分区分配算法与动态分区分配算法基本相同,差别仅在于前者增加了拼接功能

  • 优点:

    • 可以消除碎片,分配更多的分区

    • 有助于多道程序设计及提高内存利用率

  • 缺点:

    • 拼接技术复杂

    • 需要花费大量CPU时间

  • 分配算法

其他拼接方法
  • 目前解决外部碎片问题很少采用拼接技术,而是采用非连续内存分配技术,即允许物理空间为非连续的,这样只要有物理内存就可以分配给进程

  • 实现技术

    • 分页

    • 分段

伙伴系统

  • 基本思想

    • 任何大小为2i的空闲块可以被分割成2个大小为2i-1的块,它们称为伙伴,以提供给进程使用,空闲时,又可以把它们合并为大小为2i的块

1.3 内存不足时的管理

覆盖技术

  • 覆盖:一个相对独立的程序单位

  • 覆盖段:程序执行时不用同时装入内存的覆盖

  • 覆盖区:覆盖段分配到同一个存储区中;大小由最大覆盖来确定

    • 按照逻辑功能把程序划分为若干个相对独立的程序段,按照程序的逻辑结构让那些不会同时执行的程序段共享同一块内存区。通常,这些程序段都被保存在外存中,当有关程序段的先头程序段执行结束后,再把后续程序段调入内存中,并覆盖前面的程序段。

交换技术

  • 基本思想:

    • 把内存中暂不能运行的进程,或暂不用的程序和数据,换至外存上,以腾出内存空间,换入外存上具备运行条件的程序或进程运行需要的程序和数据

  • 交换进程

    • 由换入和换出两个过程组成

交换技术与覆盖的比较

  • 交换技术不需要corder给出覆盖结构

  • 交换的对象为进程或作业,覆盖对象为程序内程序段

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值