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

news2024/11/10 7:40:35

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

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

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

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

单一连续分配

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

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

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

当给用户区放入了用户进程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.coloradmin.cn/o/617145.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【vue3】08-vue的组件化开发-插槽(Slots)的完全指南

Vue插槽(Slots)的完全指南 插槽的作用插槽的基本使用具名插槽作用域插槽(难点) 插槽的作用 在开发中,我们会经常封装一个个可复用的组件: 前面我们会通过props传递给组件一些数据,让组件来进行展示;但是为…

【CVPR2023】TPS详解:联合令牌剪枝与压缩以实现视觉变形器更积极的压缩

【CVPR2023】TPS详解:联合令牌剪枝与压缩以实现视觉变形器更积极的压缩 0. 引言1. 为什么要使用TPS?2. TPS介绍3. TPS 详解3.1 重要性计算3.2 令牌压缩3.2.1 匹配3.2.2 融合 4. 简化版理解5. 总结 0. 引言 虽然 Vision Transformers (ViTs&a…

小文智能宣布接入ChatGPT,智能化客户服务,开创全新用户体验

小文智能是一家致力于用AI技术解放劳动力的公司,最近我们接入了ChatGPT技术,深度探索AI在智能对话机器人领域应用的更多可能,这将为我们的客户带来更为优质的人机对话服务和全新的用户体验。 ChatGPT是一种基于人工智能的自然语言处理技术&a…

案例31:基于Springboot企业员工薪酬关系系统开题报告设计

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

逍遥自在学C语言 | break-循环的中断与跳转

前言 在C语言中,break语句是一种控制流语句,它用于终止当前所在的循环结构(for、while、do-while)或者switch语句,从而跳出循环或者结束switch语句的执行。 一、人物简介 第一位闪亮登场,有请今后会一直…

ML算法——梯度下降随笔【机器学习】

文章目录 11、梯度下降 11、梯度下降 梯度下降如何帮助参数优化? 梯度下降是一种用于参数优化的常见方法。它的基本思想是通过迭代地更新参数,以减小损失函数|代价函数的值,从而找到一个最优解。 梯度方向:→|向右|正向 ←|向左|反…

PostGIS(1):PostGIS概述

作为对象关系型数据库PostGreSQL的拓展模块,PostGIS可用于存储GIS数据,并提供了对基于GiST的R树索引支持、以及面向GIS对象的分析和处理相关的函数。 以下是PostGIS官网对其特征的介绍, (1) 先看一下百度对PostGIS的介…

Langchain-ChatGLM:基于本地知识库问答

文章目录 ChatGLM与Langchain简介ChatGLM-6B简介ChatGLM-6B是什么ChatGLM-6B具备的能力ChatGLM-6B具备的应用 Langchain简介Langchain是什么Langchain的核心模块Langchain的应用场景 ChatGLM与Langchain项目介绍知识库问答实现步骤ChatGLM与Langchain项目特点 项目主体结构项目…

php7新特性详细介绍(二)

一、PHP 7 异常 PHP 7 异常用于向下兼容及增强旧的assert()函数。它能在生产环境中实现零成本的断言,并且提供抛出自定义异常及错误的能力。 assert() 配置 | 配置项默认值可选值zend.assertions11 - 生成和执行代码 (开发模式) 0 - 生成代码,但在执…

智警杯excel和sql实训盲点

目录 excel基础操作: excel函数:智警杯赛前学习1.2--excel统计函数_lulu001128的博客-CSDN博客知识点https://blog.csdn.net/lulu001128/article/details/130936259?spm1001.2014.3001.5501 excel报表实战: excel数据透视及绘图&#xff…

Amino框架无锁算法实现并发线程安装组件(一)

Amino是无锁并行框架,线程安装,该框架封装了无锁算法,提供了可用于线程安全的一些数据结构,同时还内置了一些多线程调度模式。使用Amino进行软件开发有以下的优势: 1.对死锁的问题免疫 2.确保系统并发的整体进度 3.降低高并发下无锁竞争带…

java设计模式之:建造者模式

文章目录 建造者模式介绍建造者模式适用场景案例场景一坨坨代码实现重构代码 与工厂模式区别建造者模式优缺点总结 该说不说几乎是程序员都知道或者了解设计模式,但大部分小伙伴写代码总是习惯于一把梭。好的代码不只为了完成现有功能,也会考虑后续扩展。…

springboot自动配置源码解析

概述 使用springboog的时候引入starter就自动为我们加载,例如我们引入 spring-boot-starter-web 之后,就自动引入了 Spring MVC 相关的 jar 包,从而自动配置 Spring MVC 。 自动装配原理 SpringBootApplication SpringBootApplication: Spri…

Java的引用

一、概述 其实java有4种引用,4种可分为强、软、弱、虚。我们将从这四个方面入手进行介绍。 二、强引用 首先看到我们有一个类叫M,在这个类里我重写了一个方法叫finalize(),我们可以看到这个方法是已经被废弃的方法,为什么要重写…

【jupyter】Jupyter Notebook如何导入导出文件

目录 0.系统:windows 1.打开 Jupyter Notebook 2.Jupyter Notebook导入文件 3.Jupyter Notebook导出文件 0.系统:windows 1.打开 Jupyter Notebook 1)下载【Anaconda】后,直接点击【Jupyter Notebook】即可在网页打开 Jupyte…

用户研究干货——这一篇就够啦

一、基本概念: ①工作内容:用户研究的首要目的是帮助企业定义产品目标用户群,明确、细化产品概念,并通过对用户的任务操作特性、知觉特征、认知心理特征的研究,使用户的实际需求成为产品设计的导向,使产品…

建面超72万㎡,南山红花岭旧改规划公示,配套近15万㎡宿舍

近日,深圳市南山区城市更新和土地整备局发布关于桃源街道红花岭工业南区更新单元(暂定名)03-01、02-02地块《建设工程规划许可证》及总平面图的公告。 此次批复的红花岭工业南区02-02、03-01块,总建面超72万㎡,用地单…

nginx+tomcat 负载均衡、动静分离集群

文章目录 一、NginxTomcat负载均衡的组合原因1.1 Nginx实现负载均衡的原理1.2 Nginx实现负载均衡的主要配置项1.3 NginxTomcat负载均衡的组合的优点1.4 NginxTomcat负载均衡的实验设计 二、动静分离部署2.1 部署TOMCAT后端服务器2.2部署nginx服务器2.3安装nginx动态服务器 一、…

java中try-with-resources自动关闭io流

在传统的输入输出流处理中,我们一般使用的结构如下所示,使用try - catch - finally结构捕获相关异常,最后不管是否有异常,我们都将流进行关闭处理: try {//todo } catch (IOException e) {log.error("read xxx f…

《Lua程序设计》--学习1

前言&#xff1a; --> 表示一条语句的输出或表达式求值的结果 -- 单行注释 > 标注 一些代码需要在交互模式下输入 如果需要打印表达式求值的结果&#xff0c;必须在每个表达式前加上一个等号 <--> 表示两者完全等价 语言基础 我们将Lua语言执行的每一…