操作系统原理 —— 内存连续分配管理方式(二十)

news/2024/12/23 4:25:53/

在之前的章节中,我们到了内存管理,其中有一个很重要的功能,就是对操作系统中的内存进行分配和回收。

那如何对操作系统的内存进行分配呢? 整体上可以分为两种方式:连续分配管理方式、非连续分配管理方式。

这里提到的连续分配是指:为用户进程分配的内存空间,必须是一个连续的内存空间地址。

在连续分配管理方式,有划分了三种不同的方式,接下来我们一起来详细看看:

单一连续分配

在单一连续分配方式中,内存被划分为:系统区和用户区,系统区通常位于内存的低位置,用于存放操作系统相关数据,用户区就存放用户进程相关数据。

在单一连续分配模式中,内存空间只能有一道用户程序,用户程序独占整个用户区空间。 这样分配实现简单,可以采用覆盖技术扩充内存,但是缺点也很明显,只能用于单用户、单任务的操作系统中,有内部碎片,内存利用率低。

这里提到了一个概念:内存碎片,这里来解释一下,看下图:
在这里插入图片描述

当给用户区放入了用户进程A之后,还空闲了很大一块区域,这么区域就叫做内部碎片,也就说明这种方式内存利用率低。

固定分区分配

在后期计算机在不断的发展,为了能在内存中装入多个程序,并且这些程序之间又不会相互干扰,于是将整个用户空间划分为若干个固定大小的分区,在每一个分区中只转入一个进程,这样就形成了最早的,最简单的一种可运行多道程序的内存管理方式。

固定分配也分为了两种方式:分区大小相等、分区大小不相等,如图:

在这里插入图片描述

那这两种方式有什么优缺点呢?

分区大小相等:缺乏灵活性,比如说一个进程只需要 2 MB、5 MB,但他们都需要各占 10 MB ,内部碎片太严重了,利用率很低。 但是这种方式比较合适用于一台计算机,同时执行相同进程的进程,每个进程所占用的内存大小都是相等的。

分区大小不等:增加了灵活性,可以满足不同大小的进程需求,可以根据系统中运行的进程大小,进行划分。

既然固定分配支持多个进程在内存中同时运行,那操作系统是如何管理哪些分区是空闲的,哪些分区是非空闲的呢?

在这个时候,操作系统需要建立一个分区说明表,来实现各个分区的分配和回收:如下图:

在这个表中就能记录各个分区的使用情况,以及大小和起始地址。如果现在有一个进程需要转入到内存中,操作系统就可以根据这个分区说明表来检索,从里面找到一个能满足大小的、未分配的区分,分配给这个进程,然后修改状态为:已分配.

但是大家思考一下,这种固定划分的方式,如果有一个进程所需要的内存大小很大,可能所有的分区都不能满足的时候,这个时候又需要采用覆盖或者交换的技术来扩充,这样又会增加复杂度,并且降低新性能。 固定分配也有可能产生内部碎片,内存利用率低。

动态分区分配

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

在这里,我们也来思考三个问题:

1、系统要用什么样的数据结构来记录内存的使用情况?

两种常用的数据结构:

空闲分区表:每个空闲分区对应一个表项,表项里面包含了分区号、分区大小、起始地址、状态
在这里插入图片描述

空闲分区链:每个分区的起始部分和末尾部分分别设置向前指针和向后指针。

在这里插入图片描述

2、当很多空闲分区都能满足需求的时候,应该选择哪个分区进行分配?

把一个新的进程装入到内存时,必须按照一定的动态分区分配算法,从空闲的分区表中挑选一个分区分配给当前所需要的进程。 这个动态分区分配算法再加一个章节中,我们再来详细的讲解。

3、如何进行分区的分配和回收操作?

回收分为了几种情况:

情况一:回收区的后面有一个相邻的空闲分区,如图:

在这里插入图片描述

假设现在我们需要回收掉进程4,但是进程4后面有一个空闲的分区,所以空闲分区表会发生以下的变化:

在这里插入图片描述

我们可以看到,分区1号中的分区大小:由之前的10变成了14、起始地址也发生了改变,在这种情况,会把两个相邻的空闲分区合并为一个。

如果是回收区前面有一个相邻的空闲分区,那么也是采用同样的方式,两者合并成一个空闲分区。

情况二:如果说回收区前后都有一个相邻的空闲分区,如图:
在这里插入图片描述

那在这种情况下,空闲分区表会发生如下变化:
在这里插入图片描述

当进程4移除之后,会把三个空闲空间,都合并成一个。

情况三:在回收区前、后都没有相邻的空闲分区,那么当进程4移除后,会在空闲分区表中新增一条数据来记录分区。

在这里插入图片描述

动态分区分配有什么缺点吗? 缺点当然有的,动态分区分配虽然没有内部碎片,因为是根据进程所需来分配空间,所以不存在内部碎片问题,但是会存在外部碎片。

外部碎片是指:内存中的某些空闲分区由于太小了而难以利用。 举个例子,有一个 1 M 的进程使用完内存后释放了,然后在后续的进程中,1 M 都不能满足需求,所以导致这个 1 M 的空闲内存一直无法被利用,从而产生外部碎片。

那有解决办法吗? 当然有,如果内存中空闲空间的总和,可以满足某些进程的需求,但是由于进程需要一块连续的内存空间,因此这些外部碎片不能满足进程的要求,在这个时候就可以通过紧凑(拼凑)技术来解决外部碎片的问题。

紧凑技术就是把一些外部碎片合并起来,从而获得一块连续的内存空间,这样就解决了外部碎片的问题。

本章总结在这里插入图片描述


http://www.ppmy.cn/news/245002.html

相关文章

数据中台浅析(之二)

数据中台浅析 1. 引言 在当今的数字化时代,数据被誉为"新的石油",越来越多的企业和组织开始深度挖掘数据的价值。在这个过程中,数据中台逐渐成为了数据管理和分析的核心架构,让我们来深入了解一下它。 1.1 数据中台…

智能电能表采集失败的原因和解决方法

智能电能表采集失败的原因和解决方法 智能电能表作为现代电力系统中的重要组成部分,在电能计量、电费结算等方面发挥着关键作用。然而,在实际应用过程中,有时会出现电能表采集失败的情况,这可能源于网络连接故障、数据传输错误等…

vue props传值层级多,子级孙子级怎么修改传参

vue props传值层级多了,子级孙子级怎么修改传参 1.出现背景2.怎么在孙组件里改变传过来的值呢2.1这样改是不行的2.2可行的方法2.2.1 引用对象只改变单属性2.2.2 provide和inject 1.出现背景 本来自己写页面的话是直接全部写在一个vue文件里,一个vue文件…

微服务之间调用几种方法

微服务之间调用几种方法 一、RestTemplate方式 Bean public RestTemplate getRestTemplate(){ return new RestTemplate(); } 服务的消费者(order)调用服务的提供者(Goods) Autowired private RestTemplate restTemplate; GetM…

DataSecurity Plus:数字化时代的数据安全护卫者

引言: 在数字化时代,数据成为企业和个人生活中不可或缺的资产。然而,随之而来的是日益增长的数据安全威胁。为了保护数据的机密性、完整性和可用性,数据安全解决方案——DataSecurity Plus应运而生。本文将深入探讨DataSecurity …

POJ1050题解

POJ1050题解 #include <bits/stdc.h> using namespace std; const int N 510; int a[N][N], maxrow[N], row[N]; int main() {int n;cin >> n;//读入矩阵数据for(int i 0; i < n; i )for(int j 0; j < n; j ) cin >> a[i][j];int ans 0;//在求…

8脚 tja1050t_TJA1050T设计的CAN总线通信硬件电路原理图解

分析TJA1050T设计的CAN总线通信硬件电路图。 如图中F040的CAN信号接收引脚RX和发送引脚TX并不直接连接到TJA1050T的RXD和TXD端&#xff0c;而是经由高速光耦6N137进行连接&#xff0c;这样做的目的是为了实现CAN总线各节点的电气隔离。为了实现真正意义上完全的电气隔离&#x…

1050: 阶乘的累加和 C语言

1050: 阶乘的累加和 时间限制: 1 Sec 内存限制: 30 MB 提交: 26798 解决: 21791 [状态] [讨论版] [提交] [命题人:admin] 题目描述 求1! 2! ……n! 输入 输入一个整数n&#xff0c;你可以假定n不大于10。 输出 输出一个整数&#xff0c;即阶乘累加的结果&#xff0c;单独占一…