3.1_3 连续分配管理方式

3.1_3 连续分配管理方式

image-20240312171051385

  连续分配:指为用户进程分配的必须是一个连续的内存空间

(一)单一连续分配

  在单一连续分配方式中,内存被分为系统区用户区

  系统区通常位于内存的低地址部分,用于存放操作系统相关数据;用户区用于存放用户进程相关数据。

image-20240312171231472

  内存中只能有一道用户程序,用户程序独占整个用户区空间。

优点

  实现简单;无外部碎片;可以采用覆盖技术扩充内存;不一定需要采取内存保护(eg:早期的PC操作系统MS-DOS)。

  因为1个用户进程独占整片用户区,所以不会发生A进程访问B进程的内存空间的情况,因此不一定需要采取内存保护。但有的系统也会采取一定的内存越界保护等。

缺点

  只能用于单用户、单任务的操作系统中;有内部碎片;存储器利用率极低。

  分配给某进程的内存区域中,如果有些部分没有用上,就是“内部碎片”。

image-20240312172019300

(二)固定分区分配

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

image-20240312172417447

image-20240312172515118

  分区大小相等:缺乏灵活性,但是很适合用于用一台计算机控制多个相同对象的场合(比如:钢铁厂有n个相同的炼钢炉,就可把内存分为n个大小相等的区域存放n个炼钢炉控制程序)

  分区大小不等:增加了灵活性,可以满足不同大小的进程需求。根据常在系统中运行的作业大小情况进行划分(比如:划分多个小分区、适量中等分区、少量大分区)。

  操作系统需要建立一个数据结构——分区说明表,来实现各个分区的分配与回收。每个表项对应一个分区,通常按分区大小排列。每个表项包括对应分区的大小、起始地址、状态(是否已分配)。

image-20240312174759195

  当某用户程序要装入内存时,由操作系统内核程序根据用户程序大小检索该表,从中找到一个能满足大小的、未分配的分区,将之分配给该程序,然后修改状态为“已分配”。

优点

  实现简单,无外部碎片

缺点

  a.当用户程序太大时,可能所有的分区都不能满足需求,此时不得不采用覆盖技术来解决,但这又会降低性能;

  b.会产生内部碎片,内存利用率低。

(三)动态分区分配

  动态分区分配又称为可变分区分配。这种分配方式不会预先划分内存分区,而是在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。因此系统分区的大小和数目是可变的。(eg:假设某计算机内存大小为64MB,系统区8MB,用户区共56MB)

image-20240312175520615

问题

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

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

  例如,上图中,进程2执行完毕并离开。此时又有一个4MB的进程要进入内存,那么它是应该分配到刚刚进程2所占用的14MB空间的地方,还是最下方空闲的4MB的地方?

  3.如何进行分区的分配与回收操作?

  例如,进程2、进程3执行完毕并离开,此时,内存中会有三块空闲区域:14MB、18MB、4MB。那么这三块连续的空闲分区该如何处理、是否该进行合并?

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

  两种常用的数据结构:a.空闲分区表;b.空闲分区链。

image-20240312183406467

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

image-20240312183855608

  如上图,此时若有一个进程5(4MB)到达,则:应该用最大的分区进行分配?还是用最小的分区进行分配?又或是用地址最低的部分进行分配?

  把一个新作业装入内存时,须按照一定的动态分区分配算法,从空闲分区表(或空闲分区链)中选出一个分区分配给该作业。由于分配算法对系统性能有很大的影响,因此人们对它进行了广泛的研究。

(在下个小节中会介绍四种动态分区分配算法)

问题3:如何进行分区的分配与回收操作?

  假设系统采用的数据结构是“空闲分区表”——如何分配

分配时-情况1

image-20240312185237199

image-20240312185152005

  假设此时来了一个进程5(4MB),并且打算存入20MB的空闲分区当中。

image-20240312185315029

image-20240312185320096

分配时-情况2

image-20240312185430671

image-20240312185425161

  假设此时来了一个进程5(4MB),并且打算存入4MB的空闲分区当中。

image-20240312185507615

image-20240312185514617


  假设系统采用的数据结构是“空闲分区表”——如何回收

回收时-情况1:回收区的后面有一个相邻的空闲分区

image-20240312192434913

image-20240312192440838

  假设此时要回收进程4(即,要回收的进程,在它后面,有一个相邻的空闲分区)。——两个相邻的空闲分区合并为一个。

image-20240312192636220

image-20240312192641436

回收时-情况2:回收区的前面有一个相邻的空闲分区

image-20240312192952344

image-20240312192958345

  假设此时要回收进程3(即,要回收的进程,在它前面,有一个相邻的空闲分区)。——两个相邻的空闲分区合并为一个。

image-20240312193146700

image-20240312193200347

回收时-情况3:回收区的前、后各有一个相邻的空闲分区

image-20240312193339052

image-20240312193343797

  假设此时要回收进程3(即,要回收的进程,在它的前、后各有一个相邻的空闲分区)——三个相邻的空闲分区合并为一个。

image-20240312193452100

image-20240312193457422

回收时-情况4:回收区的前、后都没有相邻的空闲分区

image-20240312195716306

image-20240312195720591

  假设此时要回收进程2(即,要回收的进程,它的前、后都没有相邻的空闲分区)——新增一个表项。

image-20240312195819315

image-20240312195824122

  :各表项的顺序不一定按照地址递增顺序排列,具体的排列方式需要依据动态分区分配算法来确定。


  动态分区分配没有内部碎片,但是有外部碎片

  内部碎片:分配给某进程的内存区域中,有些部分没有用上。

  外部碎片:指内存中的某些空闲分区由于太小而难以利用。


外部碎片举例:

image-20240312200710890


  如果内存中空闲空间的总和本来可以满足某进程的要求,但由于进程需要的是一整块连续的内存空间,因此这些“碎片”不能满足进程的需求。

  可以通过**紧凑(拼凑,Compaction)**技术来解决外部碎片。

  紧凑技术,就是“挪位置”,把内存中的进程位置挪到一块,腾出一块连续的大空间。

image-20240312200932381


思考:

  1.再次回顾交换技术,什么是换入/换出?什么是中级调度(内存调度)?

  2.思考动态分区分配应使用哪种装入方式?“紧凑”之后需要做什么处理?

  应该用三种装入方式当中的——动态重定位。因为这种方式能最方便实现“进程在内存当中移动位置”这件事情。

  另外,“紧凑”之后,我们应该把各个进程的起始地址(一般存放在进程PCB当中)给修改一下。

总结

image-20240312201613003

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/739688.shtml

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

相关文章

原生高性能抓包工具Proxyman,送给爱学习的你

现在的抓包工具可谓是五花八门,比如Fiddler,Charles,LightProxy等,各有各的优缺点,最近又看到一个新的抓包工具,像我这样一个有强烈好奇心的人,怎么能错过,我们一起来学习下吧&#…

Python 导入Excel三维坐标数据 生成三维曲面地形图(面) 4-2、线条平滑曲面(原始颜色)但不去除无效点

环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 scipy 1.12.0 代码: import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from scipy.interpolate import griddata fro…

3.8_理解代码(3)

fliplr函数 其中fliplr函数为flip array left to right,此处fliplr(i)的输出结果为[4 3 2 1] 我的代码实验 area1 fill(i,u_up(i),cyan,FaceAlpha,0.3);把我都弄得无语了,就实现fill怎么这么难 真是不知道向量长度哪里不同,知道了哈哈 终于…

[Java安全入门]三.CC1链

1.前言 Apache Commons Collections是一个扩展了Java标准库里的Collection结构的第三方基础库,它提供了很多强大的数据结构类型和实现了各种集合工具类。Commons Collections触发反序列化漏洞构造的链叫做cc链,构造方式多种,这里先学习cc1链…

知识文档管理系统平台:企业管理的王炸

无论是企业内部的文件共享,还是团队之间的协作编辑,知识文档管理系统都能发挥巨大的作用。它帮助企业整理、存储和查找各种文档资料,这不仅能提高企业的工作效率,还能增强企业的竞争力。今天就跟着LookLook同学一起来深入了解知识…

仿牛客项目Day6:账号设置——检查登录状态

账号设置 这个功能主要就是上传头像 在账户设置页可以点击上传头像,然后在首页可以改变头像(获取头像) 访问账号设置页面 controller getSettingPage的方法就是返回html页面 前端 改一下setting页面,index账号设置的url就可…

ARMv8架构特殊寄存器介绍-1

1,ELR寄存器(Exception Link Register ) The Exception Link Register holds the exception return address。 异常链接寄存器保存异常返回地址。最常用也很重要。 2,SPSR(Saved Process Status Register)…

TypeScript 哲学 - Generic 和 ts表示构造函数

ts中 类的二义性 :做类型 和作为构造函数

基于PHP的店家服务与管理交互平台

目 录 摘 要 I Abstract II 引 言 1 1相关技术 3 1.1 PHP 3 1.2 ThinkPHP框架 3 1.2.1 Struts结构 3 1.2.2 MVC 3 1.2 Tomcat服务器 3 1.3 MySQL数据库 3 1.4 LayUI框架 4 1.5 ECharts 4 1.6 本章小结 4 2 系统分析 5 2.1 功能需求 5 2.2 用例分析 6 2.3 非功能需求 8 2.4 本章…

Vue3全家桶 - Vue3 - 【8】模板引用【ref】(访问模板引用 + v-for中的模板引用 + 组件上的ref)

模板引用【ref】 Vue3官网-模板引用;如果我们需要直接访问组件中的底层DOM元素,可使用vue提供特殊的ref属性来访问; 一、 访问模板引用 在视图元素上采用ref属性来设置需要访问的DOM元素: 该 ref 属性可采用 字符串 值的执行设…

RabbitMQ - 02 - 基本消息模型

目录 部署demo项目 什么是基本消息模型 实现基本消息模型 部署demo项目 首先配置好一个mq的练习demo,并配置好相关依赖 链接:https://pan.baidu.com/s/1oXAqgoz9Y_5V7YxC_rLa-Q?pwdv2sg 提取码:v2sg 如图 父xml文件已经配置好了 AMQP依赖了 什么…

计算机408炸了给25考研人的几点警示

25年408考研,如果只用王道的复习资料,最多考100-120分 就是这么的现实,王道的资料虽然好,但是并不能覆盖全部的知识点和考点,而且24年的408真题考的很怪,总结起来就是下面这些特点: 偏&#xff…

安装PyTorch详细过程

安装anaconda 登录anaconda的官网下载,anaconda是一个集成的工具软件不需要我们再次下载。anaconda官网 跳转到这个页面如果你的Python版本正好是3.8版,那便可以直接根据系统去选择自己相应的下载版本就可以了。 但是如果你的Python版本号不是当前页面…

seata入门到实战三

seata datasourceProxy connectionProxy statementProxy和PreparedStatementProxy abstractStatementProxy SqlRecognizer Executor AT模式二阶段提交 一阶段 二阶段提交 全部事务执行成功 释放锁 提交并删除undo日志 二阶段回滚

【LeetCode: 380. O(1) 时间插入、删除和获取随机元素 + 数据结构设计】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

【maven下载、安装、配置教程】

一、下载 maven 官网:Maven – Download Apache Maven 注意:idea 和 maven 的版本问题,不然 idea 启动项目会发生兼容性错误。如 2020 版本 idea 支持 3.6.3 左右的 maven 版本,用 3.9版本的 maven 会报错。 二、配置maven全局配置…

JS-06-数组

一、数组的创建与访问 见:JS-04-javaScript数据类型和变量 JavaScript的Array可以包含任意数据类型,并通过索引来访问每个元素。 要取得Array的长度,直接访问length属性: let arr [1, 2, 3.14, Hello, null, true]; console.l…

​LeetCode解法汇总1261. 在受污染的二叉树中查找元素

目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:. - 力扣(LeetCode) 描述: 给出一个满足下述规则的二叉树&#xff1…

京东商品详情接口数据采集—价格,库存,支持高并发

初识API调用 为帮助商家及开发者快速掌握京东API调用方法,本文为大家提供的万邦API工具为例,为读者演示一例API调用过程,并做相应讲解。 item_get-获得JD商品详情 1、API公共参数示例 请求地址: https://api-gw.onebound.cn/jd/item_get …

【汇编】#2 寄存器相关与实模式下的8086存储器寻址

文章目录 前言一、什么是寄存器二、8086寄存器1. 8086通用寄存器2. 段寄存器3.专用寄存器3.1 标志寄存器内部具体标志及其作用 tips: 不同尺寸数据在存储器中存储 三、 实模式存储器寻址逻辑段与小段物理地址计算方式 前言 本文以清华大学出版社的《80x86汇编语言设计》和李忠…