精华内容
下载资源
问答
  • 内存分配算法 紧凑
    2021-05-26 18:33:25

    组号 成绩

    计算机操作系统

    课程设计报告

    题目 内存的连续分配算法

    基于动态分区分配的内存管理的模拟设计与实现

    专业:

    班级:

    学号+姓名:

    指导教师:

    2016年12月 22 日

    一.设计目的

    掌握内存的连续分配方式的各种分配算法。

    二.设计内容

    本系统模拟操作系统内存分配算法的实现,实现动态分区分配,算法,采用PCB定义结构体来表示一个进程,定义了进程的名称和大小,进程内存起始地址和进程状态。内存分区表采用单链表来模拟实现。定义与算法相关的数据结构,如PCB,空闲分区;在使用动态分区分配算法时必须实现紧凑功能。

    三.设计原理

    1.首次适应算法分配内存:空闲分区链以地址递增的次序链接。进行内存分配时,从链首开始顺序查找,直到找到一个大小能满足要求的空闲分区为止。然后再按照作业的大小,从该分区中划出一块内存空间,分配给请求者,余下的空闲分区仍留在空闲链中。若从链首直至链尾都不能找到一个能满足要求的分区,则表明系统中已没有足够大的内存分配给该进程,内存分配结束,返回。

    2.回收内存:当进程运行完毕释放内存时,系统根据回收区的首址,从空闲区链中找到相应的插入点:

    (1)回收区与插入点的前一个空闲分区F1相邻接,此时应将回收区与插入点的前一分区合并,不必为回收分区分配新表项,而只需要修改前一分区F1的大小。

    (2)回收区与插入点的后一个空闲分区F2相邻接,此时将两分区合并形成新的空闲分区,但用回收区的首址作为新空闲区的首址,大小为两者之和。

    (3)回收区与插入点的前后两个空闲分区相邻接,此时将三个分区合并,使用F1的表项和F1的首址,取消F2的表项,大小为三者之和。

    (4)回收区与插入点的前后两个空闲分区均不相邻接,此时应为回收区单独建立一个新表项,填写回收区的首址和大小,并根据其首址插入到空闲链中的适当位置。

    3.紧凑:将内存中的所有作业移动,使他们全都相邻接。可以把原来分散的多个空闲小分区拼接成一个大分区,可将一个作业装入该区。这种技术称为“紧凑”。

    四.详细设计及编码

    1.模块分析

    ①paixu():排序算法。按分区的起始位置以递增的次序排序。

    ②compact():紧凑算法。记录每个忙碌分区的首址及大小,改变其首址。计算所有空闲分区的大小为新空闲分区的大小,首址为所有忙碌分区的大小总和。

    ③show(FENQU *p):输出函数。输出分区信息(首址,大小,状态,进程号)。

    ④input():输入函数。输入分区信息(分区个数,各分区首址,大小,状态,进程号)。调用show(FENQU *p)函数。

    ⑤FENQU *scsf():(递归算法)首次适应算法。进行内存分配时,从链首开始顺序查找,直到找到一个大小能满足要求的空闲分区为止。调用compact()函数。

    ⑥FENQU * huishou():回收算法。当进程运行完毕释放内存时,系统根据回收区的首址,从空闲区链中找到相应的插入点,判断相应情况进行后续动作。

    ⑦void function():逻辑函数。从键盘输入选择,实现相应操作。调用scsf(),huishou(),show(p)函数。

    ⑧int main():主函数。调用input(),function()函数。

    流程图

    检索空闲分区链

    检索空闲分区链

    进行紧凑形成连续空闲区

    空闲分区总和≥u.size?

    N

    Y

    N

    找到>u.size的分区?

    无法分配,返回

    请求分配u.size分区

    修改有关的数据结构

    进行紧凑形成连续空闲区

    按动态分区方式进行分配

    Y

    返回分区号及首址

    代码实现

    #include

    #include

    #include

    typedef struct memory{

    int startaddress;//首址

    int size;//大小

    char state[10];//状态

    int number;//进程号

    struct memory *next;

    }FENQU;

    FENQU *ready=NULL, *p;

    void paixu();

    int len();

    void compact();

    void show(FENQU *p){

    printf("%d\t",p->startaddress);

    printf("%d\t",p->size);

    printf("%s\t",p->state);

    printf("%d\t\n\n",p->number);

    }

    //输入分区信息

    vo

    更多相关内容
  • 内存分配方式与内存分配算法

    千次阅读 2018-03-14 20:24:56
    内存分配算法,其实就是:有一大块空闲的资源,如何合理地分配资源?内存分配的思想可以用到很多其他的领域。比如Java虚拟机是如何将内存分配与回收的?再比如文件系统是如何将磁盘块分配与回收的?其本质就是如何把...

    内存分配方式有两种,连续内存分配方式和离散内存分配方式。不同的分配方式又有不同的分配算法。

    内存分配算法,其实就是:有一大块空闲的资源,如何合理地分配资源?内存分配的思想可以用到很多其他的领域。比如Java虚拟机是如何将内存分配与回收的?再比如文件系统是如何将磁盘块分配与回收的?其本质就是如何把空闲的资源分配出去,分配之后又如何回收?目标就是分配快,回收也快,而且还不浪费。那么,就需要根据资源的特点、以及应用场景做权衡从而选择何种方式进行分配与回收。

    ①连续内存分配方式

    1)固定分区分配

    将内存划分成若干个固定大小的块。将程序装入块中即可。内存划分成各个块之后,块大小不再改变。当然,划分块的方式有:所有的块大小相等;划分的块大小不相等。

    这种方式,在实际的内存分配之前,就已经知道了所有的内存块大小了。

    2)动态分区分配

    需要一个空闲表 或者 空闲链 来记录目前系统中空间的内存区域。在内存分配时,需要查找空间表或空闲链找到一块内存分配给当前进程。

    动态分区分配算法:

    a)首次适应法

    b)循环首次适应法

    c)最佳适应法

    d)最坏适应法

    e)快速适应法

    3)可重定位分区分配

    说白了,就是增加了内存移动的功能。由于若干次内存分配与回收之后,各个空闲的内存块不连续了。通过“重定位”,将已经分配的内存“紧凑”在一块(就类似于JVM垃圾回收中的复制算法)从而空出一大块空闲的内存出来。

    ”紧凑“是需要开销的,比如需要重新计算 地址,这也为什么JVM垃圾回收会导致STW的原因。

    而离散分配方式–不管是分页还是分段,都是直接将程序放到各个离散的页中。从而就不存在“紧凑”一说了。

    连续内存分配方式涉及两种操作:内存分配操作 和 内存回收操作

    ②离散内存分配方式

    内存资源是有限的,程序要运行,必须得加载到内存。如果内存已经满了,而现在又有新的程序要运行,怎么办?—SWAP

    把当前不用的程序(数据)先换出内存,从而就有空间 加载当前需要运行的程序的一部分数据进入内存,这样大大提高了内存的利用率。

    由于牵涉到换入与换出,前面的连续内存分配方式就有点不适用了。因为,最明显的一个问题:对于连续内存分配方式,究竟换出哪部分数据呢?

    而这种只装入部分”数据”就可以使程序运行的机制,就是虚拟存储器的本质。

    1)分页存储管理

    将进程的逻辑地址空间分成若干大小相等的页面;同时,也将物理内存分成相等大小的页面(称为块或frame)。在为进程分配内存时,以块为单位将进程的若干页 可以 装入到内存中多个不邻接的物理块中。

    从上可以看出:“离散” 体现在:进程在内存中分配的空间(物理块)是不连续的。而对于连续分配方式,进程在内存的分配的空间是连续的。

    现在考虑32位系统,每个物理块的大小为4KB。如何把逻辑地址 转换成 物理地址?

    对每个进程而言,都有着自己的页表。页表的本质就是逻辑地址到物理地址的映射。

    分页存储中的逻辑地址的结构如下:

    这里写图片描述

    1)由于进程的逻辑页面大小与物理块(页帧)大小相同,故都为4K,因此需要12个位表示4K的大小(2^12=4K),即图中的【0-11】

    2)【12-31】表示的是页号。一共有20个位表示页号,也即:对于一个进程而言,一共可以有1M(2^20=1M)个页。

    3)每个进程的逻辑地址空间范围为0-2^32-1,因为:每个页大小为4K,一共有1M个页。故进程可用的逻辑空间为2^32B

    逻辑地址到物理地址的转换需要用到页表。具体细节是有一个“地址变换机构”,它有一个寄存器保存页表在内存的起始地址 以及 页表的长度。

    上面提到,一个进程最多可以有1M个页,故页表就有1M个页表项。假设每个页表项只有1B,那页表的大小也有1MB,所以:一般而言,页表也是很大的,不能全放在寄存器中,故页表也是存储在内存中的。(有些机器有“快表”,快表就是一个寄存器,它保存了页表中的部分表项);其次,也可以使用多级页表以解决单个页表太大的问题。

    那现在给定一个逻辑地址,怎么知道其物理地址呢?

    ①将【12-31】位的页号与 页表的长度比较。页号不能大于页表长度,否则越界。

    ②根据页号 找到 该页号所在的页表项,即该页号对应着哪个页表项。因为,页表项里面就存放着物理地址。

    那如何查找页表项呢?将页号乘以页表项的长度(每个页表项,其实就是一个逻辑的页 到 物理页 的映射信息),就知道了该逻辑页对应着哪个页表项(根据页号匹配页表项一般是由硬件完成的)

    然后,正如前面提到,页表也是保存在内存中的,故需要页表的内存始址(这是也为什么地址变换机构 保存 页表在内存的起始地址的原因),将页表始址 与 上面的乘积相加,就得到了该逻辑页对应的页表项的物理地址。读这个页表项的物理地址中的内容,就知道了该逻辑页对应的物理块地址(物理地址)。从而,就完成了逻辑地址到物理地址的转换。

    从上面可以看出,CPU每存取一个数据时,需要两次访问主存。一次是访问页表项的物理地址,得到了数据的物理块地址。第二次拿着物理块地址去取数据。

    在分页存储管理方式下:由于取一个数据,需要二次访存,CPU处理速度降低了一半,正由于这个原因:引入了“快表”(又称TLB(Translation Lookaside Buffer)),快表是个寄存器,用来保存那些当前访问过的页表项。从而,读页表项时,不需要再访存了,而是直接从寄存器中读取。

    虚拟存储器

    谈到虚拟存储器,总是说它从逻辑上扩充了内存的容量,why?

    内存是有限的,作业初始时保存在磁盘上的,如果要运行,必须得将相应的程序(数据)加载到内存中。那如果要运行的作业特别多,无法一下子装入内存,怎么办?

    一种方式是加内存条,这是从物理上扩充内存的容量。

    另一种方式是:先把作业的一部分程序(数据)装入内存,先让它运行着,运行过程中发现: 咦,我还需要其他的数据,而这些数据还未装入内存,因此就产生中断(缺页中断)再将数据加载到内存。

    采用这种方式,系统一次就可以将很多作业装入内存运行了。这时,从物理上看,内存还是原来的大小,但是它能运行的作业多了,因此说从逻辑上扩充了内存。

    将虚拟存储器这种思想与分页存储管理结合,一次只将作业的部分页面加载到内存中,形成了一个强大的内存分配与管理系统了。引入了虚拟存储器,同样需要有页表,记录逻辑地址到物理地址的映射,只不过此时的页表更复杂了,因为,有些页可能还在磁盘上。;还需要有缺页中断处理机构,因为毕竟只将一部分数据装入内存,会引起缺页中断嘛,就需要处理中断嘛;还需要地址变换机构,这里的地址变换机构功能更多,因为需要处理中断情况下的地址变换。

    转载自:https://www.cnblogs.com/hapjin/p/5689049.html

    展开全文
  • 内存分配方式及分配算法优劣

    千次阅读 2020-08-30 09:31:05
    内部碎片的产生:因为所有的内存分配必须起始于可被 4、8 或 16 整除(视 处理器体系结构而定)的地址或者因为MMU的分页机制的限制,决定内存分配算法仅能把预定大小的内存块分配给客户。假设当某个客户请求一个 43 ...

    什么是内存碎片?

    内部碎片的产生:因为所有的内存分配必须起始于可被 4、8 或 16 整除(视 处理器体系结构而定)的地址或者因为MMU的分页机制的限制,决定内存分配算法仅能把预定大小的内存块分配给客户。假设当某个客户请求一个 43 字节的内存块时,因为没有适合大小的内存,所以它可能会获得 44字节、48字节等稍大一点的字节,因此由所需大小四舍五入而产生的多余空间就叫内部碎片。
    外部碎片的产生: 频繁的分配与回收物理页面会导致大量的、连续且小的页面块夹杂在已分配的页面中间,就会产生外部碎片。假 设有一块一共有100个单位的连续空闲内存空间,范围是0-99。如果你从中申请一块内存,如10个单位,那么申请出来的内存块就为0-9区间。这时候你 继续申请一块内存,比如说5个单位大,第二块得到的内存块就应该为10-14区间。如果你把第一块内存块释放,然后再申请一块大于10个单位的内存块,比 如说20个单位。因为刚被释放的内存块不能满足新的请求,所以只能从15开始分配出20个单位的内存块。现在整个内存空间的状态是0-9空闲,10-14 被占用,15-24被占用,25-99空闲。其中0-9就是一个内存碎片了。如果10-14一直被占用,而以后申请的空间都大于10个单位,那么0~9就 永远用不上了,变成外部碎片。

    内存分配方式

    内存分配方式主要有连续型分配方式和非连续型分配方式,顾名思义,连续型分配方式就是分配连续的空间,非连续型分配方式就是分配非连续的内存空间。

    -连续型分配内存方式:

    • 单一连续分配:
      最简单的分配方式,采用覆盖技术。优点是无外部碎片,缺点是只能用于单用户、有内部碎片、存储利用率低。
      内存在此方式下分为系统区和用户区,系统区仅提供给操作系统使用,通常在低地址部分;用户区是为用户提供的、除系统区之外的内存空间。这种方式无需进行内存保护。

    • 固定分区分配:
      最简单的多道程序存储管理方式,它将用户内存空间划分为若干个固定大小(可以相等,也可以不等,同为4的倍数或其他 如图1所示),每个分区只装入一道作业。图1
      为便于内存分配,通常将分区按大小排队,并为之建立一张分区说明表,其中各表项包括每个分区的起始地址、大小及状态(是否已分配),如图2所示。当有用户程序要装入时,便检索该表,以找到合适的分区给予分配并将其状态置为”已分配”;未找到合适分区则拒绝为该用户程序分配内存。存储空间的分配情况如图3所示。
      图2

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

    固定分区是可用于多道程序设计最简单的存储分配,无外部碎片,但不能实现多进程共享一个主存区,所以存储空间利用率低。固定分区分配很少用于现在通用的操作系统中,但在某些用于控制多个相同对象的控制系统中仍发挥着一定的作用。

    -动态分区分配:
    不预先划分内存,在程序装入内存时,根据进程的大小动态地建立分区,并使得分区的大小正好适合进程的需要,因此系统中分区的大小和数目是可变的。
    图4
    如图4所示,系统有64MB内存空间,其中低8MB固定分配给操作系统,其余为用户可用内存。开始时装入前三个进程,在它们分别分配到所需空间后,内存只剩下4MB,进程4无法装入。
    在某个时刻,内存中没有一个就绪进程,CPU出现空闲,操作系统就换出进程2,换入进程4。由于进程4比进程2小,这样在主存中就产生了一个6MB的内存块。之后CPU又出现空闲,而主存无法容纳进程2,操作系统就换出进程1,换入进程2。

    动态分区分配内存方式刚开始是很好地,但是,之后会导致内存出现很多的小的内存块,也就是外部碎片。外部碎片可以通过紧凑来解决,就是操作系统不时地对进程进行移动和整理。 但是这需要动态重定位寄存器的支持,且相对费时。紧凑的过程实际上类似于Windows系统中的磁盘整理程序,只不过后者是对外存空间的紧凑。

    动态分区的分配策略

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

    1)首次适应:地址递增,顺序查找,第一个能满足的即分配给进程。

    2)最佳适应:容量递增,找到第一个能满足要求的空闲分区。

    3)最坏适应:容量递减,找到第一个能满足要求的分区。

    4)邻近适应:循环首次适应算法。

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

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

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

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

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

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

    展开全文
  • 精品文档 课程设计报告 设计题目 内存的连续分配算法 班级 : 学号 姓名 指导老师 设计时间 摘要 精品文档 精品文档 1主要算法包括 固定分区分配动态分区分配伙伴算法可重定位分区分配 2 内容要求 1定义与算法相关的...
  • 课程设计报告 设计题目内存的连续分配算法 班级 : 学号 姓名 指导老师 设计时间 2012年8月 1 摘要 1主要算法包括 固定分区分配动态分区分配伙伴算法可重定位分区分配 2内容要求 1定义与算法相关的数据结构如PCB空闲...
  • 使用C语言实现了操作系统可变分区分配算法,实现了首次。循环首次、最佳、最坏等算法,可以运行在Linux系统上,只是算法的模拟,没有调用Linux系统内核数据
  • 内存分配

    前言

    我们都知道,计算机工作的过程概括起来就是 CPU 去内存中读取指令并执行的过程,但是如果运行我们的程序直接操作物理内存,将会引发很多的问题(比如不同进程之间访问/修改的隔离、权限等等),所以爱操心的操作系统就帮我们实现了内存管理。

    暂时可以先简单地理解为操作系统通过虚拟内存技术实现了内存管理,首先抽象出一层虚拟的内存空间,当进程创建时,给每个进程都分配一个虚拟的内存空间,这样程序所使用的地址就是虚拟内存地址,然后实际运行时,再把虚拟地址映射到物理地址,从而给程序分配物理内存地址使用。

    这样,在编写程序的时候就可以尽情地使用虚拟地址了,其他的一系列工作都交由操作系统帮我们完成。

    操作系统的内存管理需要实现以下几个功能:

    • 地址转换:将程序中的逻辑地址转换成内存中的物理地址(抽象)
    • 存储保护:保证个个作业在自己的内存空间内运行,互不干扰(保护)
    • 内存的分配与回收:当作业或进程创建后系统会为他们分配内存空间,当结束后内存空间也会被回收。
    • 内存空间的扩充:利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存(虚拟化)
    • 进程间通信(共享)

    本文将从分配物理内存开始介绍:

    内存分配指的是操作系统将物理内存分配给程序以使用。(和编程语言的分配内存不同,如 C 中的 mallocmmap 等,后续会慢慢讲到的)

    分配内存经历了两个发展阶段,一开始是使用连续型分配的方式,后面慢慢发展到了非连续型分配,现代的操作系统基本上都是使用非连续型分配的方式。这里的连续和非连续,指的是分配给程序的物理内存空间是否连续

    连续型分配

    连续分配方式是最早出现的一种存储器分配方式,分配的策略为一个用户程序分配一个连续的物理内存空间

    缺点:

    • 内存利用率低
    • 有外碎片、内碎片的问题

    连续型分配有以下四种方式:单一连续分配、固定分区分配、动态分区分配、动态重定位分配。

    内存碎片指的是不可用的空闲内存。外部内存碎片指的是未被分配,但是由于太小而无法被分配的内存空间。内部碎片指的是已经被分配,但是未被进程使用的内存空间。

    先把内存简单理解为一个大数组,假设把 0~50 分配给了进程A,把 55~100 分配给了进程B,那么 50~55 就是外部碎片。假如进程A实际只用了 40 的空间,那还有 10 就是内部碎片。

    单一连续分配

    单道程序环境下经常使用的分配方式,将整个内存直接交由一个程序独占,当其他程序需要使用的时候,需要覆盖(Overlay)整个内存,即一次只能运行一个程序。

    优点是简单高效,无外部碎片。缺点是可能存在大量内部碎片,内存利用率低,且只能用于单用户。

    固定分区分配

    是最简单的多道程序存储管理方式,将用户内存空间划分为若干个固定大小(不同分区大小可以不相等),每个分区只装入一道作业。

    为便于内存分配,通常将分区按大小排队,并为之建立一张分区使用表,其中各表项包括每个分区的起始地址、大小及状态。

    这种方式不会产生外部碎片,但是内部碎片可能较大,也有可能因为程序太大而无法放入任何一个分区。

    动态分区分配

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

    为了实现动态分区分配,通常有两种方式:空闲分区表和空闲分区链。

    这种方式在开始时很好,但是随着时间的推移,内存中会产生越来越多的碎片。

    在这里插入图片描述

    紧凑

    可以通过紧凑技术减少外部碎片。通过移动内存中作业的位置,把原来多个分散的小分区拼接成一个大分区的方法。

    系统每紧凑一次,就要对移动了的程序或数据的地址进行修改,这个功能不仅实现复杂,而且还大大地影响到系统的效率。

    紧凑分为两种,其中静态重定位是通过软件的方式实现的,也是动态分区分配中所使用的;而动态重定位是结合硬件支持的,是动态重定位分配中所使用的。

    • 静态重定位:在程序装入内存的过程中完成,即在程序运行前,完成程序各个地址的重定位。
    • 动态重定位:在程序运行的过程中完成,需要动态重定位寄存器的支持。
    动态分区分配算法

    把一个新作业装入内存,需要按照一定的分配算法选出一个分区分配给作业。常见的动态分区分配算法有以下四种:

    FF,首次适应算法,First Fit。从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给作业。

    NF,循环首次适应算法,Next Fit。从上次找到的空闲分区的下一个空闲分区开始查找,直至找到一个能满足要求的空闲分区。

    BF,最佳适应算法,Best Fit。从全部空闲区中找出能满足作业要求的、且大小最小的空闲分区。最小化外部碎片的产生。

    WF,最差适应算法,Worst Fit。从全部空闲区中找出能满足作业要求的、且大小最大的空闲分区。避免产生太多微小碎片。

    除了这四种最常用的,还有其他的分配算法:

    QF,快速适应算法,Quick Fit。将空闲分区按照大小进行分类,并使用链表将同一大小的分区进行连接,然后使用索引表进行管理。

    在这里插入图片描述

    伙伴系统,buddy system。使用二进制优化的思想,将内存以2的幂为单位进行分配,合并时只能合并是伙伴的内存块。两个内存块是伙伴的三个条件是:

    • 大小相等
    • 地址连续
    • 两个内存块分裂自同一个父块

    不同的适应算法在不同的情况下各有优劣。

    动态重定位分配

    动态重定位分配,是在动态分区分配的基础上,加上硬件的支持,从而实现动态重定位的分配方式。

    单纯用软件实现紧凑的效率非常低,需要频繁地移动内存位置,且只有在程序未占用 CPU 时才能移动。

    除了软件的方式外,还可以用硬件协助实现。通过在系统中增设一个重定位寄存器,用它来存放程序在内存中的起始地址。程序在执行时,真正访问的内存地址是相对地址与重定位寄存器中的地址相加而形成的。当系统对内存进行了紧凑时,不需对程序做任何修改,只要用该程序在内存的新起始地址去置换原来的起始地址即可。

    非连续型分配

    非连续型分配有分段分页两种。非连续分配允许一个程序分散地装入到不相邻的物理内存分区中,根据分区的大小是否固定分为分页存储管理方式和分段存储管理方式。非连续型分配是现代操作系统常用的分配方式,比如 Linux 就是结合两种方式的段页式管理。

    优点:

    • 更好的内存利用和管理
    • 允许共享代码和数据
    • 支持动态加载和动态链接

    缺点:

    • 内存管理的开销大(建立虚拟地址和物理地址之间的转化)

    针对分段和分页,后续文章将作详细介绍。

    总结

    内存分配主要有连续型分配和非连续型分配两种,其中现代操作系统使用的通常为非连续型分配。

    连续型分配主要有四种方式,分别为单一连续分配、固定分区分配、动态分区分配、动态重定位分配。

    扩展

    1. 程序使用的虚拟内存是否连续?

    答:操作系统实际分配给程序的物理内存不一定是连续的,但是程序所使用的虚拟内存是连续的。因为根据 CPU 的工作原理,CPU 需要从 PC 指针(Program Counter,程序计数器,指向下一条指令的地址)读取指令、到执行、再到下一条指令,不断循环。由于 PC 指针是顺序地指向下一个虚拟地址,所以程序所使用地虚拟内存需要是连续的。

    1. 两个不同的程序,能否使用同一个虚拟内存地址?

    答:可以。由于操作系统的内存管理,分配给每个进程的虚拟内存都是独立且隔离的。

    展开全文
  • 分配功能:要求至少使用两种算法,用户可以选择使用。 回收功能: 空闲块的合并:即紧凑功能,用以消除碎片。当做碎片整理时,需要跟踪分配的空间,修改其引用以保证引用的正确性。 显示当前内存的使用状态...
  • 动态分区分配算法5.1首次适应算法5.2最佳适应算法5.3最坏适应算法5.4邻近适应算法5.5总结6.基本分页存储管理6.1把“固定分区分配“改造为”非连续分配版本“6.2分页存储管理的基本管理6.3如何实现地址的转换?6.4...
  • 为一个用户程序分配连续的内存空间 早期的分类:单一连续分配 固定分区分配 动态分区分配 动态重定位分区分配 其他    1.单一连续分配  内存分为系统区(仅供给OS使用,通常放在内存的低址部分)和用户区...
  • 操作系统的课程设计报告...用C语言编写的程序,实现了可重定向动态分区分配算法,选取首次适应算法,实现紧凑功能,用单链表模拟内存状态。因为网上几乎没有紧凑功能的代码,所以自己写了,希望造福人类。可能有些小bug
  • 掌握可变分区存储管理方式的内存分配过程、内存回收过程和紧凑算法的实现过程。 C/C++语言编译器
  • 在多道程序当中,如果要让我们的程序运行,必须先创建进程。而创建进程的第一步便是要将程序和对应的数据装入内存。...第二种:固定分区分配此种分配方式把内存空间分为固定大小的区域,每个分区允许一个...
  • 操作系统 内存分配-分区

    千次阅读 2021-04-08 22:54:45
    单一连续存储管理 将内存分成两个连续的区域:系统区和用户区 系统区只能是留给系统程序执行,用户区每次只能分配给一道程序 固定分区管理 1、等区划分 缺乏灵活性,程序过大装不进去...一、内存分配——基于顺序搜索
  • 动态分区分配算法

    2020-09-17 11:06:19
    1.实验步骤: ...然后再按照作业的大小,从该分区中划出一块内存分配给请求者,余下的空闲分区仍留在空闲分区链中。 2.循环首次适应算法:该算法是首次适应算法的变种。在分配内存空间时,不再每次从表
  • 在划分时,若剩余的内存小于等于minsize,则将整块内存分配给该进程不再进行划分。 根据菜单选择相应的操作: 1.初始化:输入内存的大小和阈值minsize,初始状态下空闲分区名字为“void”。 2.分配:输入申请进程的...
  • 给予一块内存把三角形分配内存里面去。 要求: 三角形不能重叠,不能缩放,不能分割,不能变形。 可以旋转,反转。 使内存尽可能小,尽可能紧凑 1万个三角形尽可能耗时不超过0.6ms [img=...
  • 内存分配方式

    千次阅读 2018-05-05 20:14:42
    不同的分配方式又有不同的分配算法。①连续内存分配方式1)固定分区分配将内存划分成若干个固定大小的块。将程序装入块中即可。内存划分成各个块之后,块大小不再改变。当然,划分块的方式有:所有的块大小相等;...
  • 该分配方式为一个用户程序分配一个连续的内存空间,即程序中代码或数据的逻辑地址相邻,体现在内存分配时物理地址的相邻。 连续分配方式可分为四类: 单一连续分配 固定分区分配 动态分区分配 动态可重定位分区分配...
  • 动态内存分配之循环首次适应算法

    千次阅读 2016-12-22 17:11:04
    1.已分配区和空闲区是分别表示的 2.采用的是单向链表 3.采用了尾指针tail,单纯的用来指向尾空闲区域 4.写了3天,好吧,我确实很菜,但是引用请注明出处,谢谢了 #include #include #include <malloc.
  • 利用动态分区分配算法 常见的动态分区分配算法: 1.首次适应算法(从头到尾找最合适的空闲分区) 基本思想:查找空闲分区表/链,每次都从低地址开始查找,找到第一个满足大小的空闲分区,即要进入内存的进程需要的分区大小...
  • 深入理解Java虚拟机-垃圾回收器与内存分配策略

    万次阅读 多人点赞 2020-01-04 13:08:32
    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来。 文章目录概述对象已死吗引用计数法可达性分析算法再谈引用生存还是死亡回收方法区垃圾收集算法标记-清除...
  • 演示实现下列三种动态分区分配算法 ...能够自动进行内存分配与回收,可根据需要自动进行紧凑与拼接操作,所有过程均有动态图形变化的显示 采用可视化界面,可随时暂停显示当前内存分配和使用情况图。
  • 这篇文章为大家讲解的是操作系统当中内存分配方式——连续分配管理方式,连续分配方式是指一个由用户程序分配一个连续的内存空间,就比如说用户需要一块100MB的内存空间,那么就在内存当中为用户分配一块连续的并且...
  • 内存分配(malloc) 小内存(small_class)分配 大内存(large_class)分配 内存释放(free) 小内存释放 大内存释放 内存再分配(realloc) 小内存再分配 大内存再分配 内存 GC 1. tcache GC 2. extent GC ...
  • 在60-80年代的时候, 由于硬件条件, 软件条件多个方面的限制, 操作系统都停留在只允许一个或少许的程序运行, 于是需要管理的内存空间就不是很复杂, 只需要对内存进行连续的分配即可, 所以最初时期采用连续分配的方式
  • 连续分配 3.1 单一连续分配 3.2 固定分区分配 3.3 动态分区分配 3.3.1 首次适应算法 3.3.2 最佳适应算法 3.3.3 最坏适应算法 3.3.4 循环首次适应算法 3.3.5 四种算法总结 3.3.6 分类搜索算法 3.3.7 伙伴系统算法 ...
  • 目录逻辑地址与物理地址地址重定位绝对装入可重定位装入动态运行时装入连续内存...算法(Next Fit)非连续内存分配管理方式分页存储管理不含有快表的地址转换两级页表分段存储管理分段段表地址变换分页分段管理的对比...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,522
精华内容 7,008
热门标签
关键字:

内存分配算法 紧凑

友情链接: bt.zip