存储器管理_OS

目录

1.存储器的层次结构

2.程序的装入和链接

逻辑地址

物理地址

地址映射

3. 程序的装入

绝对装入方式

可重定位装入

静态重定位

动态重定位

3. 程序的链接

静态链接

装入时动态链接

运行时动态链接

4. 连续分配存储管理方式

单一连续分区分配

固定分区分配技术

动态分区分配方式(可变分区分配)

动态分区分配中的数据结构

分区分配操作(分配内存)

分区分配操作(回收内存)

  5. 动态分区分配算法(连续分配)

基于顺序搜索的动态分区分配算法

首次适应算法

循环首次适应算法

最佳适应算法

最坏适应算法

基于索引搜索的动态分区分配算法

快速适应算法

伙伴系统

哈希算法

6.系统中的碎片

7. 动态可重定位分区分配用到的技术

8. 分区的存储保护


1.存储器的层次结构

2.程序的装入和链接

逻辑地址

逻辑地址又叫相对地址或虚地址

物理地址

物理地址又叫绝对地址或实地址,是内存中存储单元的地址,可以直接寻址。

地址映射

3. 程序的装入

绝对装入方式

可重定位装入

注意此时cpu指令中包含的地址也需要调整

 

  根据地址变换进行的时间及采用技术手段不同,可分为静态重定位和动态重定位两类

静态重定位

  当用户程序被装入内存时,一次性实现逻辑地址到物理 地址的转换,以后不再转换。 一般在装入内存时由软件完成。

动态重定位

  在程序运行过程中要访问数据时再进行地址变换(即在 逐条指令执行时完成地址映射)。一般为了提高效率, 此工作由硬件地址映射机制来完成。 硬件(寄存器)支持,软硬件结合完成

   可重定位装入方式不允许程序运行时在内存中移动位 置。而实际情况是程序在内存中的位置经常要改变。 程序在内存中的移动意味着它的物理位置发生了变化, 这时必须对程序和数据的地址 (绝对地址) 进行修改后方能运行。 为了保证程序在内存中的位置可以改变。装入程序把装入模块装入内存后,并不立即把装入模块中相对地址转 换为绝对地址,而是在程序运行时才进行。 这种方式需要一个重定位寄存器来支持,在程序运行过 程中进行地址转换

3. 程序的链接

静态链接

  静态链接方式是一种事先链接方式,即在程序运行之前,先将各目标模块及它们所需的库函数,链接成一个 完整的装入模块 (执行文件),以后不再拆开。

  静态链接方式存在的问题: 不便于对目标模块的修改和更新。 无法实现对目标模块的共享。

  实现静态链接需要解决的问题: 1 相对地址的修改 2 变换外部调用符号

注意在进行静态链接后,首先需要进行相对地址的修改,然后再进行外部访问符号的修改。

装入时动态链接

  装入时动态链接方式是把一组目标模块在装入内存时边装入边链接的方式。 各目标模块分开存放,便于修改和更新。 便于实现对目标模块的共享。

  存在问题: 由于把程序运行所有可能用到的目标模块在装入时均全 部链接在一起,所以将会把一些可能不会运行的目标模 块也链接进去。如程序中的错误处理模块。

运行时动态链接

  由于事先无法知道要运行哪些模块,装入时动态链接方 式只能是将所有可能要运行到的模块都全部装入内存, 并在装入时全部链接在一起,显然这是低效的。 运行时动态链接方式在程序运行中需要某些目标模块时才对它们进行链接的方式。具有高效且节省内存空 间的优点。   

4. 连续分配存储管理方式

  连续分配方式(分区技术):指为一个用户程序分配一片 连续的内存空间。

  静态分区:作业装入时一次完成,分区大小及边界在运 行时不能改变。

  动态分区:根据作业大小动态地建立分区,分区的大 小、数目可变。

具体可分为:

单一连续分区分配

   存储管理方法:将内存分为系统区内存低端,分配给 OS 用)和用户区内存高端,分配给用户用)。 采用静态分配方式,即作业一旦进入内存,就要等待它 运行结束后才能释放内存。 最简单的一种存储管理方式,但只能用于单用户、单任 务的 OS 中。

  主要特点:管理简单,只需少量的软件和硬件支持,便 于用户了解和使用。但因内存中只装入一道作业运行, 内存空间浪费大,各类资源的利用率也不高。

固定分区分配技术

  固定分区分配方式是最早使用的一种可运行多道程序的存储管理方法。 存储管理方法:将内存空间划分为若干个固定大小的分区,除 OS 占一区外,其余的一个分区装入一道程序。 分区的大小可以相等,也可以不等,但事先必须确定, 在运行时不能改变。即分区大小及边界在运行时不能改变。 系统需建立一张分区说明表或使用表,以记录分区号、 分区大小、分区的起始地址及状态(已分配或未分配)

  划分分区的方法分区大小相等 用于利用一台计算机去控制多个相同对象的场合。

  缺点是缺乏灵活性。 分区大小不等,把内存区划分成含有多个较小的分区、适量的中等分区 及少量的大分区

  另外,固定分区会产生内部碎片。

  当某个用户程序要装入内存时,通常将分区按大小进行 排队,由内存分配程序检索分区说明表,从表中找出一 个满足要求的尚未分配的分区分配该程序,同时修改说明表中相应分区的状态;若找不到大小足够的分区,则拒绝为该程序分配内存。 程序执行完毕,释放占用的分区,管理程序修改说明表 中相应分区的状态为未分配,实现内存资源的回收。

  主要特点:管理简单,但因作业的大小并不一定与某个分区大小相等,从而使一部分存储空间被浪费。所以主 存的利用率不高

动态分区分配方式(可变分区分配)

  动态分区分配是一种动态划分存储器的分区方法。 存储管理方法 内存不是预先划分好的,作业装入时,根据作业的需求 和内存空间的使用情况来决定是否分配。 若有足够的空间,则按需要分割一部分分区给该进程; 否则令其等待内存空间。 主要特点:管理简单,只需少量的软件和硬件支持,便 于用户了解和使用,主存的利用率有所提高。

   会导致不同大小的孔(可用的内存块)分布在整个内存中。

   即动态分区会导致外部碎片的出现。

动态分区分配中的数据结构

   空闲分区表用来登记系统中的空闲分区(分区号、分区起始地址、分区大小及状态)。

   空闲分区链: 前、后向链接指针用于把所有的空闲分区链接成一个双向链。 当分区被分配出去以 后,前、后向指针无 意义。 状态位 0:未分配 状态位 1:已分配

分区分配操作(分配内存)

  系统利用某种分配算法,从空闲分区表/链中找到所需大小的分区。 分配内存 事先规定 size 是不再切割的剩余分区的大小。 设请求的分区大小为 u.size,空闲分区的大小为 m.size。 若 m.size-u.size≤size,将整个分区分配给请求者。 否则,从该分区中按请求的大小划分出一块内存空间分 配出去,余下的部分仍留在空闲分区表/链中

分区分配操作(回收内存)

  5. 动态分区分配算法(连续分配)

基于顺序搜索的动态分区分配算法:

首次适应算法(First Fit)

循环首次适应算法(Next Fit)

最佳适应算法(Best Fit)

最坏适应算法(Worst Fit)

基于索引搜索的动态分区分配算法:

快速适应算法(Quick Fit)

伙伴系统(Buddy system)

哈希算法

基于顺序搜索的动态分区分配算法

  按照一定的分配算法从空闲分区表(链)中选出一个满足作业需求的分区分割,一部分分配给作业,剩下的部分仍 然留在空闲分区表(链)中,同时修改空闲分区表(链)中 相应的信息。

首次适应算法

  空闲分区(链)按地址递增的次序排列

  在进行内存分配时,从空闲分区表/链首开始顺序查找, 直到找到第一个满足其大小要求的空闲分区为止。 然后再按照作业大小,从该分区中划出一块内存空间分 配给请求者,余下的空闲分区仍留在空闲分区表(链) 中

 

  首次适应算法的特点:优先利用内存低地址部分的空闲分区但由于低地址部分不断被划分,留下许多难以利用的很 小的空闲分区(碎片或零头),而每次查找又都是从低地址 部分开始,增加了查找可用空闲分区的开销。

循环首次适应算法

  循环首次适应算法又称为下次适应算法,由首次适应算 法演变而来。在为作业分配内存空间时,不再每次从空 闲分区表/链首开始查找,而是从上次找到的空闲分区 的下一个空闲分区开始查找,直到找到第一个能满足其 大小要求的空闲分区为止。 然后再按照作业大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲分区表(链)中。

 

  最佳适应算法的特点:若存在与作业大小一致的空闲分区, 则它必然被选中,若不存在与作业大小一致的空闲分区,则 只划分比作业稍大的空闲分区,从而保留了大的空闲分区。 最佳适应算法往往使剩下的空闲区非常小,从而在存储器中 留下许多难以利用的小空闲区(碎片)。

最佳适应算法

  空闲分区表/链按容量大小递增的次序排列。

  在进行内 存分配时,从空闲分区表/链首开始顺序查找,直到找 到第一个满足其大小要求的空闲分区为止。 按这种方式为作业分配内存,就能把既满足作业要求又 与作业大小最接近的空闲分区分配给作业。将剩余空闲 分区仍留在空闲分区表/链中。 第一次找到的能满足要求的空闲区必然是最佳的。

   每次对于作业分配完后,需要对于空闲分区表按大小进行重新排列

最坏适应算法

  空闲分区表/链按容量大小递减的次序排列。

  在进行内 存分配时,从空闲分区表/链首开始顺序查找,直到找 到第一个满足其大小要求的空闲分区为止。 总是挑选一个最大的空闲区分割给作业使用,其优点是 可使剩下的空闲区不至于太小,产生碎片的几率最小, 对中、小作业有利。

  最坏适应算法的特点:总是挑选满足作业要求的最大的分区 分配给作业。这样使分给作业后剩下的空闲分区也较大,可 装下其它作业。由于最大的空闲分区总是因首先分配而划 分,当有大作业到来时,其存储空间的申请往往会得不到满 足

 

   作业在不同算法下装入内存的位置不同

  总的来说,顺序相当于从头开始一个一个查

基于索引搜索的动态分区分配算法

  基于顺序搜索的动态分区分配算法一般只是适合于较小 的系统,如果系统的分区很多,空闲分区表(链)可能很大 (很长),检索速度会比较慢。为了提高搜索空闲分区的速 度,大中型系统采用了基于索引搜索的动态分区分配算法。

快速适应算法

  快速适应算法,又称为分类搜索法,把空闲分区按容量大小进行分类,经常用到长度的空闲区设立单独的空闲区链表。系统为多个空闲链表设立一张管理索引表。 优点是查找效率高,仅需要根据进程的长度,寻找到能容纳它的最小空闲区链表,取下第一块进行分配即可

  该算法在分配时,不会对任何分区产生分割,所以能保留大的分区,也不会产生外部碎片。

  缺点是在分区归还主存时算法复杂,系统开销较大。在 分配空闲分区时是以进程为单位,一个分区只属于一个 进程,存在一定的浪费。空间换时间。

伙伴系统

  固定分区方式不够灵活,当进程大小与空闲分区大小不 匹配时,内存空间利用率很低。 动态分区方式算法复杂,回收空闲分区时需要进行分区合并等,系统开销较大。 伙伴系统 (buddy system)是介于固定分区与可变分区之间的动态分区技术。 伙伴:在分配存储块时将一个大的存储块分裂成两个大小相等的小块,这两个小块就称为“伙伴”。

 向上去取整

  伙伴系统利用计算机二进制数寻址的优点,加速了相邻空闲分区的合并。 当一个 2 i 字节的块释放时,只需搜索 2 i 字节的块,而 其它算法则必须搜索所有的块,伙伴系统速度更快。

  伙伴系统的缺点:不能有效地利用内存。进程的大小不一定是 2 的整数倍,由此会造成浪费,内部碎片严重。 例如,一个 257KB 的进程需要占用一个 512KB 的分配 单位,将产生 255KB 的内部碎片。 伙伴系统不如基于分页和分段的虚拟内存技术有效

哈希算法

  哈希函数(Hash),也叫散列函数,是把任意长度的输 入通过散列算法,变换成固定长度的输出,该输出就是 散列值。 哈希既是一种查找技术,也是一种存储技术。可以用哈 希函数建立从关键字空间到存储地址空间的映射。 若关键字为 k,计算出 Hash 函数值 Hash(k),把这个值(Hash 地址)存储为一个线性表,称为散列表或哈 希表。 查找时,对于给定关键字,求哈希值,然后直接在哈希 表中取得所查记录。(不必顺序查表,查找速度比较快。

  哈希函数是一种单向密码体制,即它是一个从明文到密 文的不可逆映射,只有加密过程,没有解密过程。 哈希函数可用于文件校验和数字签名。 哈希函数的构造 哈希函数应是一个压缩映像函数,应具有较大的压缩性 以节省存储空间。 哈希函数应具有较好的散列性,以尽量减少冲突 (collision)现象的出现。 冲突:不同的关键字可能得到相同的哈希值。即 key1̸=key2,而 Hash(key1)=Hash(key2)。

6.系统中的碎片

  内存中无法被利用的存储空间称为碎片。

  内部碎片:指分配给作业的存储空间中未被利用的部 分,如固定分区中存在的碎片。 单一连续区存储管理、固定分区存储管理、分页式存储 管理和请求页式存储管理都会出现内部碎片。

  外部碎片:指系统中无法利用的小的空闲分区。如分区 与分区之间存在的碎片。这些不连续的区间就是外部碎 片。

7. 动态可重定位分区分配用到的技术

紧凑技术(Compaction)

  通过移动作业从把多个分散的小分区拼接成一个大分区 的方法称为紧凑(拼接或紧缩)。

  目标:消除外部碎片使本来分散的多个小空闲分区连 成一个大的空闲区。 紧凑时机:找不到足够大的空闲分区且总空闲分区容量 可以满足作业要求时。

动态重定位

作业在内存中的位置发生了变化,这就必 须对其地址加以修改或变换。

8. 分区的存储保护

9. 覆盖与对换

  覆盖与对换技术是在多道程序环境下用来扩充内存的两 种方法。 覆盖与对换可以解决在小的内存空间运行大作业的问 题,是“扩充”内存容量和提高内存利用率的有效措 施。 覆盖技术主要用在早期的 OS 中,对换技术则用在现代 OS 中

  覆盖技术主要用在早期的 OS 中(内存 <64KB),可用 的存储空间受限,某些大作业不能一次全部装入内存, 产生了大作业与小内存的矛盾。

  程序段先保存在磁盘上,当有关程序段的前一部分执行 结束,把后续程序段调入内存,覆盖前面的程序段(内 存“扩大”了)。 一般要求作业各模块之间有明确的调用结构,程序员要 向系统指明覆盖结构,然后由操作系统完成自动覆盖。 缺点:对用户不透明,增加了用户负担。

 

 换出到外存的对换区,对换区是连续存储

 

 可以理解成覆盖对程序员是不透明的,对换对程序员是透明的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值