操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)

目录

一.连续分配管理

1.1单一连续分配

1.2固定分区分配

1.2.1概念简介

1.2.2记录内存使用情况的数据结构

1.3动态分区分配

1.3.1概念简介

1.3.2紧凑技术

 1.3.3记录内存使用情况的数据结构

1.3.4如何分配内存空间(动态分区分配算法)

二.非连续分配管理

2.1基本分页存储管理

2.1.1分页存储的概念

2.1.2页表

2.1.3逻辑到物理的地址转换

2.1.4多级页表

2.2基本分段存储管理

2.2.1什么是分段

2.2.2段表

2.2.3地址转换

2.2.4分页与分段的对比

一.连续分配管理

1.1单一连续分配

早期系统中,内存分配是通过将内存中的单个连续区域分配给进程来完成的。内存被划分为:系统区用于操作系统,用户区用于用户进程。这种方式无须进行内存保护。因为内存中永远只有一道程序。只能用于单用户、单任务的操作系统中,存储器的利用率极低。又可能产生内部碎片

操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)_第1张图片

1.2固定分区分配

1.2.1概念简介

20世纪60年代出现了支持多道程序的系统,为了能在内存中装入多道程序,且这些程序之间又不会相互干扰,于是将整个用户空间划分为若干个固定大小的分区,在每个分区中只装入一道作业,这样就形成了最早的、最简单的一种可运行多道程序的内存管理方式。

固定分区是在系统生成时进行内存分区的一种方法。分区可以是固定的,也可以是可变的,但一旦确定,就不能更改。如果需要更改分区大小,则必须使用修改后的分区再次生成操作系统。所以本质上是静态的。

在划分分区时有两种方法:

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

操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)_第2张图片

1.2.2记录内存使用情况的数据结构

为了将内存分配给分区中的进程,操作系统将创建一个表来存储关于内存中的分区的信息。此表称为分区描述表(PDT,partition description table) 

由前到后分别为分区号,起始地址,大小,分配状态。

操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)_第3张图片

操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)_第4张图片

固定分区是可用于多道程序设计的最简单的存储分配,无外部碎片,但不能实现多进程共享一个主存区,所以存储空间(内存)利用率低。

例题:三个进程P1、P2和P3,大小分别为19900、19990和19888字节,需要内存空间。如果分区大小为20000字节,分配给P1、P2和P3,是否存在碎片?可以再容纳一个200个字节的进程吗?

解答:在将分区分配给进程后,第一、第二和第三个分区分别剩余100个字节、10个字节和112个字节。每个分区中的剩余空间是内部碎片。

剩余的总空间 = 100 + 10 + 112 = 222 bytes

不能容纳200字节的进程,即使剩余的总空间超过200字节。因为剩下的空间不是连续的。

1.3动态分区分配

1.3.1概念简介

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

该方法的内存分配过程与固定分区相同。唯一的区别是,当进程被带到就绪队列时,进程的分区在运行时创建。

通过一个例子来理解动态分区。考虑P1、P2和P3三个进程。最初,内存中有空闲空间120M。P1先分配一个30M的分区,留下了90M的空间。同样地,P2和P3分别被分配了40M和48M的内存,留下了一个2M的空间。

操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)_第5张图片

 在(e)中,P1释放内存。在(f)中,P4到达并获得28M。在(g)中,P3释放内存。在(h)中,P1再次到达,占用P3留下的空间的30M。

操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)_第6张图片

可变分区的优点是,进程得到了所需的空间,减少了固定分区中面临的内部碎片。但它仍然可能导致碎片,在内存分区中会有一些小的空间。这些空间不能分配给任何进程,因为它们不是连续的,因此会导致外部碎片。

1.3.2紧凑技术

克服外部碎片可以通过紧凑 (Compaction) 技术来解决,即操作系统不时地对进程进行移动和整理。但这需要动态重定位寄存器的支持,且相对费时。

操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)_第7张图片

显示了内存中三个进程的状态。这里,内存的损耗是6M+2M+2M=10M。不能为此空间分配任何进程。但是,通过紧缩,即通过合并这些内存空间,可以获得10M的连续空间,并且可以用于分配一个小于或等于10M的进程。为了紧缩,进程应该被重新定位到不同的地址。这可能会消耗时间,从而使这种方法代价昂贵。

 1.3.3记录内存使用情况的数据结构

 操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)_第8张图片

一种是空闲分区表:

记录了分区号,分区大小,起始地址和分配状态;

一种是空闲分区链:

令每个分区的起始位置和末尾位置分别指向前面空间的末尾指针和后面空间的开头指针。起始部分处还可以记录分区大小等信息;

1.3.4如何分配内存空间(动态分区分配算法)

当很多个空闲分区都可以满足进程需求的时候,我们应该选择哪个分区进行分配?

操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)_第9张图片

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

首次适应(First Fit)算法。空闲分区以地址递增的次序链接。分配内存时顺序查找,找到大小能满足要求的第一个空闲分区。

邻近适应(Next Fit)算法。又称循环首次适应算法,由首次适应算法演变而成。不同之处是,分配内存时从上次查找结束的位置开始继续查找。

最佳适应(Best Fit)算法。空闲分区按容量递增的方式形成分区链,找到第一个能满足要求的空闲分区。

最坏适应(Worst Fit)算法。又称最大适应(Largest Fit)算法,空闲分区以容量递减的次序链接,找到第一个能满足要求的空闲分区,即挑选出最大的分区。

例题:考虑如图所示的内存分配场景。为4K和10K的请求分配内存(按此顺序)。使用邻近适应、最佳适应和最差适应的分配方法,比较其内存分配以及碎片。

操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)_第10张图片

邻近适应:它分配了列表中第一个足够大的空闲空间。10K的空间被分配给4K的进程,在内存中留下一个6K的空间。下一个请求是10K。所以,列表中的下一个空间是5K,它不能适应这个进程。因此,分配了下一个可用的15K的空间,留下一个5K的空间。留下了6K+5K=11K的碎片。

 最佳适应:它分配了足够大的最小的空闲空间。5K的空间被分配给4K的进程,只留下一个1K的空间。下一个请求是10K。在比较了剩下所有空闲空间的大小后,分配了10K的空间。留下0K+1K=1K的碎片。

最差适应:它分配了列表中最大的空闲空间。对于4K进程,分配最大空间22K,在内存中留下了一个18k的空间。下一个请求是10K。比较剩下所有空闲空间的大小,18K空间是列表中最大的。因此,它被分配给了进程。留下了22K−4K−10K=8K的碎片。

操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)_第11张图片

 操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)_第12张图片


二.非连续分配管理

连续内存分配方法存在许多缺点。这方法的两种类型会导致内部/外部的碎片。因此,连续分配方法浪费了大量的内存空间。进程的地址空间需要完整地加载到内存中,栈和堆之间存在大块“空闲”空间。还有不支持内存共享,等。

这些缺点导致我们采用了非连续的分配方法。在这种方法中,这些空闲空间不需要是连续的。它们可能被分散在内存中,并可以被分配给一个进程。

非连续的内存分配也被分为固定分区和可变分区。前者被称为分页,后者被称为分段。

2.1基本分页存储管理

首先介绍一些地址空间:

操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)_第13张图片

2.1.1分页存储的概念

内存空间分为一个个 大小相等的分区 (比如:每个分区 4KB),每个分区就是一个“ 页框 ”( 页框 = 页帧 = 内存块 = 物理块= 物理页面 )。每个页框有一个编号,即“ 页框号 ”( 页框号= 页帧号 = 内存块号 = 物理块号 = 物理页号 ),页框号 0 开始 。 将 进程的逻辑地址空间 也分为 与页框大小相等 的一个个部分, 每个部分称为一个“ ”或“ 页面 ” 。每个页面也有一个编号, 即“ 页号 ”,页号也是 0 开始

操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)_第14张图片

操作系统 以页框为单位为各个进程分配 内存空间。进程的每个页面分别放入一个页框中。也就是说,进程的 页面 与内存的 页框 有一 一 对应 的关系。各个页面不必连续存放,可以放到不相邻的各个页框中。

 (注:进程的最后一个页面可能没有一个页框那么大。也就是说,分页存储有可能产生内部碎片,因此页框不能太大,否则可能产生过大的内部碎片造成浪费

2.1.2页表

分页概念中的逻辑地址有两部分:页号(p)及其在页中的位移或偏移量(d)

按之前的重定位方法,此逻辑地址将被转换为一个物理地址,必须知道内存中页的起始地址,即基址寄存器中的地址。但是,单个基址寄存器将不足以实现此目的。代替每个页的基址寄存器,页的起始地址以表的形式存储,称为页表(page table)。页表是用于存储进程中每个页的基址的数据结构,即页表中的项表示内存中页的框位置。

操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)_第15张图片

1. 一个进程对应一张页表
2. 进程的每个页面对应一个页表项
3. 每个 页表项 由“页号”和“块号”组成
4. 页表记录进程 页面 和实际存放的 内存块 之间的 映射关系
5. 每个页表项的大小(长度)是相同的

例题:

操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)_第16张图片  

 页表项的大小:

eg:假设某系统物理内存大小为 4GB ,页面大小为 4KB ,则每个页表项至少应该为多少字节?
内存块大小 = 页面大小 =4KB
4GB 的内存总共会被分为 2** 32 / 2** 12 = 2** 20 个内存块
内存块号的范围应该是 0 ~ 2**( 20 -1)
内存块号至少要用 20 bit 来表示
至少要用 3B 来表示 块号 (3*8=24bit)
(页表项的大小 <= 块号所占的大小 <= 求块号占多少位(bit) <= 内存块的数量)

2.1.3逻辑到物理的地址转换

逻辑到物理地址转换的步骤如下:

(1)处理器生成一个二维逻辑地址(p, d)

(2)从逻辑地址中提取页号p,并用作页表中的索引。

(3)检索对应于页码的基址f。

(4)f被添加到偏移量d中,以得到相应的物理地址。

操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)_第17张图片

该逻辑地址将不会由处理器生成为二维地址。处理器只生成一个简单的一维二进制地址,但是页号和偏移量从逻辑地址的位中分离出来。一些较低的位(最右边)用于偏移量,而较高的位(最左边)用于页码。

地址中有多少位应该被固定为页码和偏移量。这是由页大小决定的。如果一个进程的大小为65536字节(2^16),并且页面大小取为1024字节(2^10),则页数将为64(2^6)。这意味着页码有6位(最左边),其余的10位(最右边)用于偏移量。 

分页存储管理的 逻辑地址结构 如下所示:

操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)_第18张图片

 操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)_第19张图片

 这个方案只有在页大小为2的次方的情况下才可能实现。否则,就无法以这种方式划分逻辑地址。从逻辑地址中提取页号后,将其用作页表中的索引,并检索该页的基址。然后将这个基址附加到偏移量上,并且不需要计算它们的和。因此,该方法也减少了计算量。

 例题:

操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)_第20张图片

 (例5中提及的在分页中使用16位地址代表共有2^16bit的逻辑空间大小)

操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)_第21张图片

 操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)_第22张图片

例7分析:

有一个64页并且页面大小为512字节的逻辑地址空间。

所以逻辑空间大小为64*512=2^15bit

页码总数数为64=2^6 所以表示页码的应该用6位

页面大小为512字节=2^9 ,所以表示偏移量应该用9位

故逻辑空间地址应该为15位

同理,页框的大小应与页面相同,同为2^9bit,故偏移量应该为9位,

而页框数量为32=2^5,所以表示页框码应该为5为

故物理地址应该为14位

2.1.4多级页表

操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)_第23张图片

那么,这种情况下,只有将内存按非连续分配给页表。由于进程的页表分散在内存中,那么需要另一个表来维护保存页表的记录,它也占用内存空间。这意味着页表也是分页的,称为两级分页。此外,如果这个二级页表也不能容纳在一个连续的空间中,它可能会再次被划分,并且分配内存是不连续的。这样一来,内存中的页表可能有几个层次来管理。这称为多级或层次页表结构。 

操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)_第24张图片

要在进程的页中执行操作,首先会在外部页表中查找页表的地址,然后在页表中查找页的地址。因此,逻辑地址中的页码字段分为两部分:一部分用于外部页表,另一部分用于页表。对于 32 位逻辑地址空间,逻辑地址布局为: 

操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)_第25张图片

例题:

操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)_第26张图片 分析:

页面大小为2^10,故页内偏移量表示用10位数。

外部页表用8位地址访问,共32位则页表为14位。

所以访问页表需要14位

页表目录中有2^8=256个页表目录项

页表中有2^14=16384个页表项

 层次或多级分页的缺点是它增加了内存访问。随着层数的增加,内存访问的次数也增加。在一个简单的页表实现中有两次内存访问。如果有两级分页结构,则有 3 次内存访问。同样,如果有三级分页结构,则有四次内存访问,以此类推。一般来说各级页表大小不应超过一个页面。

两级页表的访存次数分析(假设没有快表机构)

  1. 第一次访存:访问内存中的页目录表
  2. 第二次访存:访问内存中的二级页表
  3. 第三次访存:访问目标内存单元


2.2基本分段存储管理

程序员不是根据页面编写程序,而是根据模块编写程序,以降低问题的复杂性。可能有很多模块:主程序、过程、堆栈、数据等。如果内存管理也按照这些模块来实现就更好了。

2.2.1什么是分段

进程的地址空间:按照程序 自身的逻辑 关系 划分为若干个段 ,每个段都有一个段名(在低级语言
中,程序员使用段名来编程), 每段从 0 开始编址。
内存分配规则:以段为单位进行分配, 每个段在内存中占据连续空间 ,但 各段之间可以不相邻

操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)_第27张图片

分段系统的逻辑地址结构由段号(段名)和段内地址(段内偏移量)所组成。如: 

在上述例子中,若系统是按字节寻址的,则段号占16 位,因此在该系统中,每个进程最多有 2^ 16 = 64K 个段 ,段内地址占 16 位,因此每个段的最大长度是 2^ 16 = 64KB

以段的形式管理内存有两个明显的优点:段作为逻辑内存更接近程序员的思维方式;段与页相比不必具有相同的大小,可消除分页概念中的内部碎片问题。

2.2.2段表

问题:程序分多个段,各段离散地装入内存,为了保证程序能正常运行,就必须能从物理内存中
找到各个逻辑段的存放位置。为此,需为每个进程建立一张段映射表,简称“ 段表 ”。

 操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)_第28张图片

各个段表项的长度是相同的 。例如:某系统按字节寻址,采用分段存储管理,逻辑地址结构为(段号16 , 段内地址 16 位),因此用 16 位即可表示最大段长。若物理内存大小为4GB (可用 32 位表示整个物理内存地址空间)。因此,可以让每个段表项占 16+32 = 48 位,即 6B 。由于段表项长度相同,因此 段号可以是隐含的 不占存储空间 。若段表存放的起始地址为 M ,则 K 号段对应的段表项存放的地址为 M + K*6。

 2.2.3地址转换

1. 处理器生成一个由 s 和 d 组成的二维逻辑地址。

2. 段号s是从逻辑地址中提取出来的,用作段表的索引。

3. 在得到段表中所需的段号后,用段的界限检查它的偏移量d。 如果 d ≤ 长度,则进行下一步。 否则,将产生一个中断以指示该段中的地址无效。

4. 检索对应于段号的基地址。

5. 将基地址添加到 d 以获得物理地址。

操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)_第29张图片

例题:

操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)_第30张图片

解答:物理映射如下:

操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)_第31张图片

 逻辑地址对应的物理地址如下:

操作系统-内存空间的分配与回收(连续分配管理,非连续分配管理)_第32张图片


2.2.4分页与分段的对比

  • 信息的物理单位。分页的主要目的是为了实现离散分配,提高内存利用率。分页仅仅是系统管
  • 理上的需要,完全是系统行为,对用户是不可见的
  • 信息的逻辑单位。分页的主要目的是更好地满足用户需求。一个段通常包含着一组属于一个逻
  • 辑模块的信息。分段对用户是可见的,用户编程时需要显式地给出段名。
  • 页的大小固定且由系统决定。段的长度却不固定,决定于用户编写的程序。
  • 分页的用户进程地址空间是一维的,程序员只需给出一个记忆符即可表示一个地址。
  • 分段的用户进程地址空间是二维的,程序员在标识一个地址时,既要给出段名,也要给出段内地址。
分段 比分页 更容易实现信息的共享和保护。 不能被修改的代码称为 纯代码 可重入代码 (不属于临
界资源),这样的代码是可以共享的。可修改的代码是不能共享的
访问一个逻辑地址需要几次访存?
分页(单级页表) :第一次访存 —— 查内存中的页表,第二次访存 —— 访问目标内存单元。总共 两次访存
分段 :第一次访存 —— 查内存中的段表,第二次访存 —— 访问目标内存单元。总共 两次访存
与分页系统类似,分段系统中也 可以引入 快表 机构 ,将近期访问过的段表项放到快表中,这样 可以
少一次访问 ,加快地址变换速度。

你可能感兴趣的:(操作系统学习笔记,jvm)