操作系统 | 第四章 存储器管理(一)

一、存储器的层次结构

  • 存储层次越往上,存储介质的访问速度越快,相对存储容量也越小。
  • 寄存器、高数缓存、主存储器和磁盘缓存属于操作系统存储管理的管辖范畴,掉电后(关机)他们存储的信息不再存在。
  • 固定磁盘和可移动存储介质(如U盘)属于设备管理范畴,存储信息将会长期保存。

其中寄存器和主存储器又称为可执行存储器,进程可以在很少的时钟周期内使用一条load或store指令对可执行存储器进行访问,但对辅存的访问则需要通过I/O设备实现。

1.主存储器(内存或主存)

用于保存进程运行时的程序和数据。CPU中的控制部件只能从内存中取得指令和数据,数据能够在内存和寄存器之间传递。

内存的访问速度元低于CPU的执行指令速度,因此在系统中引入寄存器和高速缓存,提升CPU与内存之间的信息交换效率。

2.寄存器

寄存器的访问速度最快,但容量较小,长度一般以字(word)为单位。寄存器用于加速存储器的访问速度,如用寄存器存放操作数,或用地址寄存器加快地址转换速度等。

3.高速缓存

高速缓存的容量大于寄存器而小于内存,访问速度比内存快。高速缓存用于存放主存中经常被访问到的信息,减少访问主存的次数,提高程序的执行速度。当CPU访问一组特定信息时,先检查它是否在高速缓存中,若已存在则直接取出避免访问内存,若没有再从内存中寻找。

4.磁盘缓存

由于磁盘的I/O速度远低于主存的访问速度,因此将磁盘中频繁使用的数据和信息存入磁盘缓存中,以减少对磁盘的访问。磁盘缓存本身并不是单独的存储介质,而是利用主存的存储空间暂存磁盘中读出(或写入)的数据。

二、程序的装入和链接

在系统中,要运行一个程序必须先为程序创建一个进程。要将用户程序转换为一个在内存中可执行的程序一般需要经过以下几个步骤:

  1. 编译,将用户代码编译成若干目标模块
  2. 链接,将目标模块与需要用到的库函数链接在一起,形成完整的装入模块
  3. 装入,将装入模块装入内存

程序的装入

将装入模块装入内存的方式有:绝对装入、可重定位装入和动态运行时装入;

1.绝对装入

在编译时如果已知程序将驻留在内存的什么位置,编译程序将会产生绝对地址的目标代码。绝对装入程序按照模块中的地址将程序和数据装入内存。模块装入后,程序中的逻辑地址和实际地址相同,不需对程序和数据的地址进行修改。

程序中使用的绝对地址可以在编译中由系统给出,也可以由程序员直接赋予(但不建议);

绝对装入方式只能将目标模块装入到内存中事先指定的位置。在多道程序环境下,编
译程序不可能预知所编译的目标模块应放在内存的何处,因此,绝对装入方式只适用于单
道程序环境。

2.可重定位装入

可重定位装入是根据内存的当前情况,将模块装入到内存的适当位置。

采用可重定位装入的方式会使模块中的所有逻辑地址和实际装入内存的地址不同,需要修改指令和数据地址,把对目标程序中指令和数据的修改过程称为重定位。

eg:

在用户程序的 1000 号 单元处有一条指令 LOAD 1,2500,该指令的功 能是将 2500 单元中的数 365 取至寄存器 1。 但若将该用户程序装入到内存的 10000~15000号单元而不进行地址变换,则在执行 11000 号单 元中的指令时,它将仍从 2500 号单元中把数据,取至寄存器 1 而导致数据错误。
正确的方法应该是将取数指令中的地址 2500 修 改成 12500,即把指令中的相对地址 2500 与本程序在内存中的起始地址 10000 相加,才得 到正确的物理地址 12500。将指令的相对地址 1000 与起始地址 10000 相加,得到绝对地址 11000。
地址变换通常是在装入时一次性完成的,后面不再改变,故称为静态重定位。
可重定位装入方式可将装入模块装入到内存中任何允许的位置,故可用于多道程序环
境;但这种方式并不允许程序运行时在内存中移动位置。

3.动态运行时转入方式

程序在内存中的移动,意味着它的物理位置发生了变化,这时必须对程序和数据的地址( 是绝对地址 ) 进行修改后方能运行。

动态运行时装入方式在模块装入内存后并不立即把装入模块的相对地址转换为绝对地址,而是等待程序真正需要执行时才进行转换。为使地址转换不影响指令的执行速度,这种方式需要一个重定位寄存器的支持。

程序的链接

链接方式可分为:静态链接、装入时动态链接、运行时动态链接。

1.静态链接方式

在程序运行之前,先将各目标模块及它们所需的库函数,链接成一个完整的装配模块,以后不再拆开。
2.装入时动态链接
指将用户源程序编译后所得到的一组目标模块,在装入内存时,采用边装入边链接的链接方式。
3.运行时动态链接
指对某些目标模块的链接,是在程序执行中需要该 ( 目标 ) 模块时,才对它进行的链接

三、连续分配方式(存储管理)

连续分配方式指一个用户程序分配一个连续的内存空间。

连续分配方式可进一步分为单一连续分配、固定分区分配、动态分区分配及动态重定位分区分配;

单一连续分配

单一连续分配只能用于单用户、单任务的操作系统中,这种方式将内存分为系统区和用户区两部分,系统区仅提供给系统使用。

固定分区分配

固定分区分配是最简单的可运行多道程序的存储管理方式。这种方法是将用户空间划分为若干个固定大小(各分区之间大小可以不相同,一旦划分大小不变)的分区,每个分区只装入一个作业,因此有几个分区就能并发几个作业。

动态分区分配(重点!)

动态分区分配是根据进程的实际需要,动态分配内存空间(即分区大小可变)。实现可变分区分配时,将涉及到分区分配中所有的数据结构、分区分配算法和分区的分配与回收操作。

1.分区分配中的数据结构

分区分配中的数据结构用来描述空闲分区和已分配的分区情况,主要有空闲分区表和空闲分区链两种。

空闲分区表:用于记录每个空闲分区的情况,每个空闲分区占一个表目,表目中包含分区序号,分区始地址及分区大小等数据。

空闲分区链:在每个分区的起始部分及分区尾部设置设置前后向指针,将空闲分区链接成一个双向链。分区起始部分包含控制分区分配的信息。

 2.分区分配算法(重点!)

(1)首次适应算法(first fit)简称FF

        算法要求空闲分区链以地址递增的次序链接,在分配内存时从链首开始查找,直到找到一个大小满足要求的空闲分区再按照作业大小从该空间中分配给作业,其余空闲空间仍留着空闲链中。若直至链尾都找不到合适的分区则分配失败。算法每次都要从链首开始查找,查询效率低。

(2)循环首次适应算法(next fit)

        与首次适应算法大致相同,区别是循环首次适应不再是每次都从链首开始查找而是从上一次分配后的空闲分区的下一个分区开始。算法也会导致缺乏大的空闲分区。

(3)最佳适应算法(best fit)

        最佳表示的是满足要求且最小的空闲分区。为提升查找效率,算法要求空闲分区按空间大小由小到大排序。该算法会导致空间中产生大量难以利用的小空闲区。

(4)最坏适应算法(worst fit)

        该算法与最佳适应算法相反,要查找到满足要求且空间最大的分区进行分配。可以使产生小分区的几率变小。算法要求分区按空间大小从大到小排序。

(5)最快适应算法(quick fit)

       又称分类搜索。是将空闲分区按照大小进行分类,对于有相同大小的空闲分区单独建立一个空闲分区链表,因此系统中包含多个空闲分区链表,提高了查找效率但使系统开销变大。

  3.分区分配操作

    在动态分区存储管理方式中,主要的操作是分配内存和回收内存

可重定位分区分配

在连续分配方式中,必须把一个系统或用户程序装入一连续的内存空间。如果在系统 中只有若干个小的分区,即使它们容量的总和大于要装入的程序,但由于这些分区不相邻 接,也无法把该程序装入内存。此时需要将作业进行移动,是小分区拼接成一个大分区。重定位则表示对移动后的程序或数据进行重定位。

 对换:是指把内存中暂时不能运行的进程或者暂时不用的程序和数据调出到外存上,以便腾出足够的内存空间,再把已具备运行条件的进程或进程所需要的程序和数据调入内存

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_61756086

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值