【操作系统】存储管理

243 阅读7分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情

注意:下面标星*的表示会在以后补充

概念

存储管理器作用: 管理内存层次结构 监视已用内存和可用内存。 为进程分配内存。 回收(取消分配)内存。 在主内存和磁盘之间交换。

连续&不连续分配:

连续内存分配(3.1和3.2) 每个程序的数据和指令在内存中分配一个连续的空间。 单分区分配 固定大小的分区分配 可变大小分区分配 非连续内存分配 每个程序的数据和指令都分配了不连续的内存空间。 E、 g.分页内存管理、分段内存管理

无存储器抽象

三个不同的内存组织方式:

image.png

单分区分配。  使用单个连续分配的系统仍然可以通过交换内存内容在用户之间切换来执行多任务。  优势 这很简单。 它易于理解和使用。  缺点 这会导致处理器和内存的利用率低下。 用户作业仅限于可用内存的大小。

当程序大小大于分配给它的内存/分区(现有的或可以分配的)量时,该怎么办? 覆盖(过去) 动态链接(库–DLL)(现在)

Overlay(覆盖)技术

如果进程大于内存量,可以使用一种称为覆盖的技术。

  • 覆盖是为了在内存中只保留在任何给定时间(仍然)所需的指令和数据
  • 当需要其他指令时,它们将加载到以前不再需要的指令占用的空间中。
  • 覆盖层由程序员实现,不需要操作系统的特殊支持,覆盖层结构的编程设计比较复杂。

问题:

  • 程序员难以管理。
    • 要求程序员借助文件结构等组织程序的覆盖结构。
    • 要求程序员指定在不同情况下加载哪个覆盖。
  • 无法访问未加载到内存中的覆盖。

*Fixed-Partition Multiprogramming 固定分区多道程序设计

*Variable-Partition Multiprogramming

没有交换的并发运行

  • 为每个块分配一个保存在CPU内部特殊寄存器中的4位保护密钥。例如.具有1M内存的机器需要512个4位寄存器256字节的密钥存储。
  • 每个进程还具有与其关联的保护键值。(保存在PSW Program State Word中)
  • 在内存访问时,硬件检查当前进程的保护密钥是否与被访问的内存块相关的值匹配;否则,将发生异常。不交换

静态重定位 Static Relocation

  • 程序被加载到连续的内存位置,只要有空间,加载过程中不会重新定位。
  • 在加载时,操作系统会调整进程中的地址以反映内存中的位置。
  • 重新定位后,操作系统无法移动进程。

加载进程时静态修改地址(类似于链接器)

一个程序装在到地址16384时,这个常数加到每一个程序地址上面,以表示成第二个程序的地址 image.png 优点:

  • 不需要硬件支持。 缺点:
  • 减缓加载速度
  • 一旦加载,程序的代码或数据就不能在没有进一步重新定位的情况下移动到内存中。
  • 加载器需要某种方法来判断什么是地址,什么是常量。

内存抽象

将物理内存暴露给进程的主要缺点:

  • 如果用户程序可以寻址内存的每个字节,那么它们很容易破坏操作系统。
  • 很难同时运行多个程序(如果只有一个CPU,则轮流运行)

回顾: 多道程序设计的内存需要:

  • 重定位: 任务或进程如何在主内存中的不同位置运行?
  • 保护:系统如何防止进程相互干扰?

地址空间:一个进程可以用来寻址内存(程序所在的抽象内存)的地址集。每个进程都有自己的地址空间,独立于其他进程。

地址绑定:将程序指令和数据(地址)与物理内存地址关联的过程称为地址绑定或重新定位(relocation)。

动态重定位

 在某些硬件机制的支持下,虚拟地址到物理地址的运行时映射。  硬件将重定位寄存器(base)添加到虚拟地址以获取物理地址

  • 将每个进程的地址空间映射到物理内存的不同部分。
  • 需要硬件支持: 为CPU配备两个专用硬件寄存器:base和limit
    • base寄存器:地址空间的起始位置
    • limit寄存器:地址空间的大小限制
  • 这些值是在加载进程和交换进程时设置的。

image.png

image.png

优势

  • 操作系统可以在执行过程中轻松移动进程。
  • 操作系统允许进程随时间增长。
    • 操作系统只是更改或移动限制寄存器。
  • 简单、快速的硬件
    • 两个特殊寄存器
    • 每次访问内存都要加法和比较运算 缺点
  • 减慢一切(添加每个引用)。
  • 无法在进程之间共享内存。
  • 进程限制为物理内存大小。
  • 使内存管理复杂化。

*地址绑定(编译原理内容)

交换

交换是一种内存管理方法,它将每个进程全部放入,运行它,然后将其放回磁盘,以便将另一个程序加载到该空间中

  • 如果内存中没有足够的空间容纳所有进程,则可以交换一些进程以腾出空间。
    • 操作系统通过将进程的完整状态存储到磁盘来交换进程。
    • 操作系统可以回收内存中就绪或被阻止的进程所使用的空间。
  • 当进程再次激活时,操作系统必须将其交换回内存
    • 对于静态重新定位,必须在同一位置交换进程。
    • 通过动态重新定位,操作系统可以将进程放在任何空闲分区中(必须更新基寄存器和限制寄存器)。
  • 交换和动态重新定位使增加进程大小和压缩内存变得很容易(但速度很慢)

进程分配: 若进程是以固定大小创建的,那个么操作系统会精确地分配所需的内容。
如果大多数被处理的程序在运行时会增长呢? E、 g.一个增长部分:数据部分 E、 g.两个增长段:堆栈段和数据段

image.png

Compaction(压实)

Swapping会产生外部碎片,用Compaction解决

  • 内存被重新分配,将所有可用内存放在一个大块中。
  • 需要动态重新定位(运行时绑定)。

压实示例:

  • 假设所有程序都可以重新定位
  • 压实过程中必须挂起进程
  • 只有当碎片变得非常糟糕时才需要执行

image.png

Overlays覆盖

无法运行比内存更大的进程,通过覆盖解决

管理空闲内存 Managing Free Memory

两种方法:Bitmap和Linked lists

Bitmap

  • 将内存划分为小单元;对应于每个单元的是位图中的一位
  • 如果单元空闲,则为0;如果单元被占用,则为1
    • 分配时,内存管理器必须找到连续的0,预计占用k bit就得找到k个连续的0

分配单元大小决定效率:

  • 在每4KB块1位的情况下,每MB内存只需要256位(32字节)。
  • 对于较小的块,bitmap需要更多内存。
  • 在bitmap中很难找到大的连续可用区域

image.png

Linked List

  • 用链表跟踪可用/分配内存区域
    • 列表中的每个条目对应于一个连续的内存区域。
    • 条目可以指示已分配或空闲(以及可选的拥有进程)。
    • 可能有分离的的空闲和分配区域列表。
  • 如果分配单元大小较大,则效率较高。
    • 固定大小表示每个区域
    • 更多区域=>空闲列表需要更多空间

List中的每个条目都指定一个空闲区域(H)或进程、它开始的地址长度以及指向下一个条目的指针

image.png

存储分配策略 Storage Placement Strategies

  • First fit 找到第一个放得下的存储空间,产生外部碎片
  • Next fit 记住上次找到的空闲区,从上次结束的地方开始找,性能比first fit稍微差点
  • Best fit 从头到尾找一遍,找最小适配
  • Worst fit 从头到尾找一遍,找最大适配

总结

image.png