内存连续分配管理方式

内存连续分配方式,是指为一个用户程序分配一个连续的内存空间。它主要包括单一连续分配、固定分区分配和动态分区分配。

单一连续分配

内存在此方式下分为系统区和用户区,系统区仅提供给操作系统使用,通常在低地址部分;用户区是为用户提供的、除系统区之外的内存空间。这种方式无需进行内存保护。

这种方式的优点是简单、无外部碎片,不需要额外的技术支持。缺点是只能用于单用户、单任务的操作系统中,有内部碎片,存储器的利用率极低。

固定分区分配

固定分区分配是最简单的一种多道程序存储管理方式,它将用户内存空间划分为若干个固定大小的区域,每个分区只装入一道作业。当有空闲分区时,便可以再从外存的后备作业队列中,选择适当大小的作业装入该分区,如此循环。

固定分区分配在划分分区时,有两种不同的方法,如上图所示。

  • 分区大小相等:用于利用一台计算机去控制多个相同对象的场合,缺乏灵活性。
  • 分区大小不等:划分为含有多个较小的分区、适量的中等分区及少量的大分区。

为便于内存分配,通常将分区按大小排队,并为之建立一张分区说明表,其中各表项包括每个分区的起始地址、大小及状态(是否已分配),如下图(a)所示。当有用户程序要装入时,便检索该表,以找到合适的分区给予分配并将其状态置为”已分配”;未找到合适分区则拒绝为该用户程序分配内存。存储空间的分配情况如下图(b)所示。

这种分区方式存在两个问题:一是程序可能太大而放不进任何一个分区中,这时用户不得不使用覆盖技术来使用内存空间;二是主存利用率低,当程序小于固定分区大小时,也占用了一个完整的内存分区空间,这样分区内部有空间浪费,这种现象称为内部碎片。

固定分区是可用于多道程序设计最简单的存储分配,无外部碎片。固定分区分配很少用于现在通用的操作系统中,但在某些用于控制多个相同对象的控制系统中仍发挥着一定的作用。


图  固定分区说明表和内存分配情况

动态分区分配

动态分区分配又称为可变分区分配,是一种动态划分内存的分区方法。这种分区方法不预先将内存划分,而是在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。因此系统中分区的大小和数目是可变的。


动态分区

如图所示,系统有64MB内存空间,其中低8MB固定分配给操作系统,其余为用户可用内存。开始时装入前三个进程,在它们分别分配到所需空间后,内存只剩下4MB,进程4无法装入。在某个时刻,内存中没有一个就绪进程,CPU出现空闲,操作系统就换出进程2,换入进程4。由于进程4比进程2小,这样在主存中就产生了一个6MB的内存块。之后CPU又出现空闲,而主存无法容纳进程2,操作系统就换出进程1,换入进程2。

动态分区在开始分配时是很好的,但是之后会导致内存中出现许多小的内存块。随着时间的推移,内存中会产生越来越多的碎片(上图中最后的4MB和中间的6MB,且随着进程的换入/换出,很可能会出现更多更小的内存块),内存的利用率随之下降。这些小的内存块称为外部碎片,指在所有分区外的存储空间会变成越来越多的碎片,这与固定分区中的内部碎片正好相对。克服外部碎片可以通过紧凑(Compaction)技术来解决,就是操作系统不时地对进程进行移动和整理。但是这需要动态重定位寄存器的支持,且相对费时。紧凑的过程实际上类似于Windows系统中的磁盘整理程序,只不过后者是对外存空间的紧凑。

在进程装入或换入主存时,如果内存中有多个足够大的空闲块,操作系统必须确定分配哪个内存块给进程使用,这就是动态分区的分配策略,考虑以下几种算法:

  • 首次适应(First  Fit)算法:空闲分区以地址递增的次序链接。分配内存时顺序查找,找到大小能满足要求的第一个空闲分区。
  • 最佳适应(Best  Fit)算法:空闲分区按容量递增形成分区链,分配时找到第一个能满足要求的空闲分区。
  • 最坏适应(Worst  Fit)算法:又称最大适应(Largest Fit)算法,空闲分区以容量递减的次序链接。找到第一个能满足要求的空闲分区,也就是挑选出最大的分区。
  • 邻近适应(Next  Fit)算法:又称循环首次适应算法,由首次适应算法演变而成。不同之处是分配内存时从上次查找结束的位置开始继续查找。

在这几种方法中,首次适应算法不仅是最简单的,而且通常也是最好和最快的。在UNIX 系统的最初版本中,就是使用首次适应算法为进程分配内存空间,其中使用数组的数据结构 (而非链表)来实现。不过,首次适应算法会使得内存的低地址部分出现很多小的空闲分区,而每次分配查找时,都要经过这些分区,因此也增加了查找的开销。

邻近适应算法试图解决这个问题,但实际上,它常常会导致在内存的末尾分配空间分裂成小碎片(因为在一遍扫描中,内存前面部分使用后再释放时,不会参与分配)。它通常比首次适应算法的结果要差。

最佳适应算法虽然称为“最佳”,但是性能通常很差,因为每次最佳的分配会留下很小的难以利用的内存块,它会产生最多的外部碎片。

最坏适应算法与最佳适应算法相反,选择最大的可用块,这看起来最不容易产生碎片,但是却把最大的连续内存划分开,会很快导致没有可用的大的内存块,因此性能也非常差。

Kunth和Shore分别就前三种方法对内存空间的利用情况做了模拟实验,结果表明:

首次适应算法可能比最佳适应法效果好,而它们两者一定比最大适应法效果好。另外注意,在算法实现时,分配操作中最佳适应法和最大适应法需要对可用块进行排序或遍历查找,而首次适应法和邻近适应法只需要简单查找;回收操作中,当回收的块与原来的空闲块相邻时(有三种相邻的情况,比较复杂),需要将这些块合并。在算法实现时,使用数组或链表进行管理。除了内存的利用率,这里的算法开销也是操作系统设计需要考虑的一个因素。

表 三种内存分区管理方式的比较
  作业道数 内部
碎片
外部
碎片
硬件支持 可用空
间管理
解决碎
片方法
解决空
间不足
提高作
业道数
单道连续
分配
1 界地址寄存器、越界
检查机构
-- -- 覆盖 交换
多道固定
连续分配
<=N
(用户空间划
为N块)
  1. 上下界寄存器、越界检查机构
  2. 基地址寄存器、长度寄存器、动态地址转换机构
-- --
多道可变连续分配
  • 数组
  • 链表
紧凑

以上三种内存分区管理方法有一共同特点,即用户进程(或作业)在主存中都是连续存放的。这里对它们进行比较和总结,见上表。

时间: 2024-12-25 05:28:54

内存连续分配管理方式的相关文章

内存非连续分配管理方式

非连续分配允许一个程序分散地装入到不相邻的内存分区中,根据分区的大小是否固定分为分页存储管理方式和分段存储管理方式. 基本分页存储管理方式 固定分区会产生内部碎片,动态分区会产生外部碎片,这两种技术对内存的利用率都比较低.我们希望内存的使用能尽量避免碎片的产生,这就引入了分页的思想:把主存空间划分为大小相等且固定的块,块相对较小,作为主存的基本单位.每个进程也以块为单位进行划分,进程在执行时,以块为单位逐个申请主存中的块空间. 分页的方法从形式上看,像分区相等的固定分区技术,分页管理不会产生外部

连续分配管理方式

在早期的操作系统中,是通过简单的分区技术进行内存管理的,内存分区属于连续分配方式. 1.单一连续分配 只能用于单用户.单任务的操作系统. 将内存分为系统区和用户区两部分,系统区仅提供给操作系统使用,通常是放在内存的低地址部分: 用户区是指除系统区以外的全部内存空间,提供给用户使用 2.固定分区分配 系统将这些用户主存空间划分为若干个固定大小的区域,每个区域供一道程序使用,分区大小可以相等也可以不等. 存在两个问题:1)程序可能太大,而放不进任何一个分区. 2)主存利用率低,当程序小于固定分区大小

非连续分配管理方式---基本分页存储管理

原文地址:https://www.cnblogs.com/dean-SunPeishuai/p/12067919.html

非连续分配管理方式---基本地址变换机构

原文地址:https://www.cnblogs.com/dean-SunPeishuai/p/12068118.html

【操作系统总结】存储器管理-程序的装入与连接,连续分配存储管理方式

程序的装入与连接 程序要经过编译,链接,装入才能运行 绝对转入方式 将程序装入事先指定的地址,程序装入以后逻辑地址与实际内存地址相同.要求程序员非常熟悉内存地址 可重定位方式 根据内存的具体情况将程序装入适当的位置,把装入时对程序和数据的地址修改过程称为重定位. 动态运行时的装入方式 程序对换的时候内存是改变的 可重定位不允许程序运行时在内存中移动位置.动态运行时的装入程序在把装入模块装入内存后,并不立即把装入模块转换程物理地址,而是吧这中地址转换推迟到程序真正要求执行时进行. 程序的链接 静态

操作系统--内存管理方式

“碎片的内存”描述一个系统中所有不可用的空闲内存.这些资源之所以仍然未被使用,是因为负责分配内存的分配器使这些内存无法使用.这一问题通常都会发生,原因在于空闲内存以小而不连续方式出现在不同的位置.由于分 配方法决定内存碎片是否是一个问题,因此内存分配器在保证空闲资源可用性方面扮演着重要的角色. internal fragmentation:when memory allocated to a process is larger than requested memory, the differe

内存的分配方式

一.内存的分配方式 程序占用的内存分为五个区域: 1.静态区/全局区(static)存放静态变量.全局变量,内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间始终不变.2.栈区(stack)存放函数的参数值.局部变量的值等,由编译器自动分配释放.管理简单,空间使用效率高,但是生命周期很短暂,分配的内存容量有限.用来存储函数的参数和非静态局部变量.3.堆区(heap)也叫动态内存分配.程序在运行的时候new申请任意大小的内存,一般由程序员分配释放,如果程序员没有释放掉,程序会一直占用内

十天学Linux内核之第三天---内存管理方式

昨天分析的进程的代码让自己还在头昏目眩,脑子中这几天都是关于Linux内核的,对于自己出现的一些问题我会继续改正,希望和大家好好分享,共同进步.今天将会讲诉Linux如何追踪和管理用户空间进程的可用内存和内核的可用内存,还会讲到内核对内存分类的方式以及如何决定分配和释放内存,内存管理是应用程序通过软硬件协助来访问内存的一种方式,这里我们主要是介绍操作系统正常运行对内存的管理.插个话题,刚才和姐姐聊天,她快结婚了,说起了自己的初恋,可能是一句很搞笑的话,防火防盗防初恋,,嘎嘎,这个好像是的吧,尽管

C/C++语言学习——内存分配管理

1.一个由C编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.程序结束时由编译器自动释放. 2.堆区(heap) — 在内存开辟另一块存储区域.一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表. 3.全局区(静态区)(static)—编译器编译时即分配内存.全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态