【操作系统】连续分配存储管理方式

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

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

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

连续分配方式(分区技术)

  • 单一连续分区分配(静态分区技术) :仅用于单用户单任务系统
  • 固定分区分配(静态分区技术) :可用于多道系统
  • 动态分区分配(动态分区技术)
  • 动态可重定位分区分配(动态分区技术) :引入了动态
  • 重定位和内存紧凑技术
  • 伙伴系统(动态分区技术)

单一连续分区分配

存储管理方法:将内存分为系统区(内存低端,分配给OS 用)和用户区(内存高端,分配给用户用) 。

采用静态分配方式,即作业一旦进入内存,就要等待它运行结束后才能释放内存。

最简单的一种存储管理方式,但只能用于单用户、单任务的 OS 中。

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

一个容量为 256KB 的内存,操作系统占用 32KB,剩下224KB 全部分配给用户作业,如果一个作业仅需64KB,那么就有 160KB 的存储空间被浪费。

图示

固定分区分配方式

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

图示

划分分区的方法

分区大小相等
用于利用一台计算机去控制多个相同对象的场合。缺点是缺乏灵活性。

分区大小不等
把内存区划分成含有多个较小的分区、适量的中等分区及少量的大分区。

内存分配

当某个用户程序要装入内存时,通常将分区按大小进行排队,由内存分配程序检索分区说明表,从表中找出一个满足要求的尚未分配的分区分配该程序,同时修改说明表中相应分区的状态;若找不到大小足够的分区,则
拒绝为该程序分配内存。
程序执行完毕,释放占用的分区,管理程序修改说明表中相应分区的状态为未分配,实现内存资源的回收。
主要特点:管理简单,但因作业的大小并不一定与某个分区大小相等,从而使一部分存储空间被浪费。所以主存的利用率不高。

例:在某系统中,采用固定分区分配管理方式,内存分区(单位:字节)情况如图所示,现有大小为 1K、9K、33K、121K 的多个作业要求进入内存。

图示

根据分区说明表,将 4 个分区依次分配给 4 个作业,同时修改分区说明表,其内存分配和分区说明表如下所示:

图示

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

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

例:一个计算机有 2560K 内存,采用可变分区模式管理内存,操作系统占用低地址的 400K 空间,剩余 2160K 的空间为用户区。

最初整个用户区是空闲的,只有一个分区。然后随着用户程序的创建和撤销。分区的个数和大小位置开始变化。

图示

图示

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

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

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

状态位 0:未分配
状态位 1:已分配

图示

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

系统利用某种分配算法,从空闲分区表/链中找到所需大小的分区。

分配内存

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

图示

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

  • 回收分区上邻接一个空闲分区,合并后首地址为空闲分区的首地址,大小为二者之和。
  • 回收分区下邻接一个空闲分区,合并后首地址为回收分区的首地址,大小为二者之和。
  • 回收分区上下邻接空闲分区,合并后首地址为上空闲分区的首地址,大小为三者之和。
  • 回收分区不邻接空闲分区,这时在空闲分区表中新建一表项,并填写分区大小等信息。

图示

动态分区分配算法

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

  • 首次适应算法(First Fit)
  • 循环首次适应算法(Next Fit)
  • 最佳适应算法(Best Fit)
  • 最坏适应算法(Worst Fit)

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

  • 快速适应算法(Quick Fit)
  • 伙伴系统(Buddy system)
  • 哈希算法

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

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

首次适应算法

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

例:系统中的空闲分区表如下表示,现有三个作业分配申请内存空间 100K、30K 及 7K,给出按首次适应算法的内存分配情况及分配后空闲分区表。

图示

按首次适应算法,申请作业 100k,分配 3 号分区,剩下分区为 20k,起始地址 160K ;申请作业 30k,分配 1 号分区,剩下分区为 2k,起始地址 50K ;申请作业 7k,分配 2 号分区,剩下分区为 1k,起始地址59K。

图示

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

循环首次适应算法

循环首次适应算法又称为下次适应算法,由首次适应算法演变而来。在为作业分配内存空间时,不再每次从空闲分区表/链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直到找到第一个能满足其大小要求的空闲分区为止

然后再按照作业大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲分区表(链)中。

例:系统中的空闲分区表如下表示,现有三个作业分配申请内存空间 100K、30K 及 7K,给出按循环首次适应算法的内存分配情况及分配后空闲分区表。

图示

按循环首次适应算法,申请作业 100k,分配 3 号分区,剩下分区为20k,起始地址 160K;申请作业 30k,分配 4 号分区,剩下分区为301k,起始地址 210K ;申请作业 7k,分配 1 号分区

图示

循环首次适应算法的特点:使存储空间的利用更加均衡,不致使小的空闲区集中在存储区的一端,但这会导致缺乏大的空闲分区。

最佳适应算法

空闲分区表/链按容量大小递增的次序排列。在进行内存分配时,从空闲分区表/链首开始顺序查找,直到找到第一个满足其大小要求的空闲分区为止。

按这种方式为作业分配内存,就能把既满足作业要求又与作业大小最接近的空闲分区分配给作业。将剩余空闲分区仍留在空闲分区表/链中。第一次找到的能满足要求的空闲区必然是最佳的。

例:系统中的空闲分区表如下表示,现有三个作业分配申请内存空间 100K、30K 及 7K,给出按最佳适应算法的内存分配情况及分配后空闲分区表。

图示

图示

图示

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

最坏适应算法

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

例:系统中的空闲分区表如下表示,现有三个作业分配申请内存空间 100K、30K 及 7K,给出按最佳适应算法的内存分配情况及分配后空闲分区表。

图示

图示

图示

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

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

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

快速适应算法

快速适应算法,又称为分类搜索法,把空闲分区按容量大小进行分类,经常用到长度的空闲区设立单独的空闲区链表。系统为多个空闲链表设立一张管理索引表。
优点是查找效率高,仅需要根据进程的长度,寻找到能容纳它的最小空闲区链表,取下第一块进行分配即可。
该算法在分配时,不会对任何分区产生分割,所以能保留大的分区,也不会产生内存碎片。
缺点是在分区归还主存时算法复杂,系统开销较大。在分配空闲分区时是以进程为单位,一个分区只属于一个进程,存在一定的浪费。空间换时间。

伙伴系统

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

图示

伙伴系统的内存分配

图示

图示

伙伴系统的内存释放

图示

图示

图示

图示

哈希算法

哈希函数(Hash) ,也叫散列函数,是把任意长度的输入通过散列算法,变换成固定长度的输出,该输出就是散列值。

哈希既是一种查找技术,也是一种存储技术。可以用哈希函数建立从关键字空间到存储地址空间的映射。

若关键字为 k,计算出 Hash 函数值 Hash(k),把这个值(Hash 地址)存储为一个线性表,称为散列表或哈希表。

查找时,对于给定关键字,求哈希值,然后直接在哈希表中取得所查记录。 (不必顺序查表,查找速度比较快)

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

图示

上述的分类搜索算法和伙伴系统算法中,都是将空闲分区根据分区大小进行分类,对于每一类具有相同大小的空闲分区,单独设立一个空闲分区链表。

哈希算法:构造一张以空闲分区大小为关键字的哈希表,该表的每一个表项记录了一个对应的空闲分区链表表头指针。

进行空闲分区分配时,根据所需空闲分区大小,通过哈希函数得到在哈希表中的位置,从中得到相应的空闲分区链表的表头指针。

系统中的碎片

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

内部碎片:指分配给作业的存储空间中未被利用的部分,如固定分区中存在的碎片。

单一连续区存储管理、固定分区存储管理、分页式存储管理和请求页式存储管理都会出现内部碎片。

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

内部碎片无法被整理,但作业完成后会得到释放。它们其实已经被分配出去了,只是没有被利用。

外部碎片才是造成内存系统性能下降的主要原因。外部碎片可以被整理后清除。

另一种浪费内存的方式是额外开销(Overhead) 。Overhead:内存头,记录一些分配信息以便释放内存。

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

紧凑技术(Compaction)

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

目标:消除外部碎片,使本来分散的多个小空闲分区连成一个大的空闲区。

紧凑时机:找不到足够大的空闲分区且总空闲分区容量可以满足作业要求时。

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

图示

动态重定位的实现

图示

动态可重定位分区分配算法

在分区存储管理方式中,必须把作业装入到一片连续的内存空间。如果系统中有若干个小的分区,其总容量大于要装入的作业,但由于它们不相邻接,也将致使作业不能装入内存。

动态可重定位分区分配相当于引入了动态重定位和内存紧凑技术的动态分区分配。

图示

分区的存储保护

存储保护是为了防止一个作业有意或无意地破坏操作系统或其它作业。常用的存储保护方法有:

界限寄存器方法:

  • 上下界寄存器方法
  • 基址、限长寄存器 (BR,LR) 方法

存储保护键方法:给每个存储块分配一个单独的保护键,它相当于一把锁。进入系统的每个作业也赋予一个保护键,它相当于一把钥匙。当作业运行时,检查钥匙和锁是否匹配,如果不匹配,则系统发出保护性中断信号,停止作业运行。

图示

  • 13
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值