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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

11 vector的实现

注意 实现仿cplus官网的的string类&#xff0c;对部分主要功能实现 实现 文件 #pragma once #include <string> #include <assert.h>namespace myvector {template <class T>class vector{public://iteratortypedef T* iterator;typedef const T* const_…

【Leetcode每日一题】 位运算 - 面试题 01.01. 判定字符是否唯一(难度⭐)(33)

1.题目解析 题目链接&#xff1a;面试题 01.01. 判定字符是否唯一 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 核心在于判断题目所给字符串是否存在相同字母&#xff0c;存在返回false即可&#xff0c;不存在返回true即可。 …

光电容积脉搏波PPG信号分析笔记

1.脉搏波信号的PRV分析 各类分析参数记参数 意义 公式 参数意义 线性分析 时域分析 均值MEAN 反应RR间期的平均水平 总体标准差SDNN 评估24小时长程HRV的总体变化&#xff0c; SDNN &#xff1c; 50ms 为异常&#xff0c;SDNN&#xff1e;100ms 为正常&#xff1b;…

灵魂指针,教给(三)

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看&#xff0c;已成习惯 创作不易&#xff0c;多多支持&#xff01; 目录 一、 字符指针变量 二、数组指针变量 2.1 数组指针变量是什么 2.2 数组指针变量如何初始化 三、二维数组传参本质 四、函数…

如何在Linux系统安装SVN并配置固定公网地址远程访问【内网穿透】

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

qsort函数

目录 1.qsort函数是什么 1.1qsort函数的原型 2.qsort函数的使用 2.1使用qsort函数排序整型数据 2.2使用qsort排序结构数据 3.qsort函数的模拟实现 1.qsort函数是什么 很多小伙伴们都没有听说过qsort这个函数&#xff0c;qsort函数是C语言标准库中的一个排序函数&#xf…

前端精准测试调用链路分析

精准测试在评估需求的测试范围时&#xff0c;需要评估一下代码的影响范围&#xff0c;这个范围有两部分&#xff1a;一是需求直接修改的代码&#xff1b;二是修改代码影响到的功能模块。代码影响到的功能一般是通过调用链路分析来实现的&#xff0c;java和kotlin代码可以由java…

【Java从入门到精通】Java异常处理

异常是程序中的一些错误&#xff0c;但并不是所有的错误都是异常&#xff0c;并且错误有时候是可以避免的。 比如说&#xff0c;你的代码少了一个分号&#xff0c;那么运行出来结果是提示是错误 java.lang.Error&#xff1b;如果你用System.out.println(11/0)&#xff0c;那么…

每日OJ题_路径dp②_力扣63. 不同路径 II

目录 力扣63. 不同路径 II 解析代码 力扣63. 不同路径 II 63. 不同路径 II 难度 中等 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;…

week06 day04 (数据库高级函数 procedure 、sql写函数)

一. ER模型 矩形&#xff1a; 代表实体椭圆&#xff1a;代表实体的属性菱形&#xff1a;relation 代表实体之间的关系 二. 存储过程&#xff08;procedure&#xff09; 1. 语法 语法: create procedure 存储过程名(参数,…) begin//代码 end// 注意&#xff1a; 因为在存储…

C语言 —— 图形打印

题目1&#xff1a; 思路&#xff1a; 如果我们要打印一个实心正方形&#xff0c;其实就是一个二维数组&#xff0c;i控制行&#xff0c;j控制列&#xff0c;行列不需要控制&#xff0c;arr[i][j]直接打印星号即可。 对于空心正方形&#xff0c;我们只需要控制行和列的条件&…

MyBatis学习笔记|2024最新版Mybatis

Mybatis简介 MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下,iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到GithubiBatis一词来源于“internet”和“aba…

应对电子邮件危害:垃圾邮件的特征、影响和预防策略

垃圾邮件是一种侵入性的未经请求的电子通信形式&#xff0c;主要通过电子邮件传播。它将大量无关、欺骗性或恶意内容发送给邮箱用户&#xff0c;内容涵盖令人讨厌的广告和欺诈行为、以及网络钓鱼链接。 截至 2022 年 12 月&#xff0c;垃圾邮件占电子邮件流量的 45% 以上。除了…

数据结构---C语言栈队列

知识点&#xff1a; 栈&#xff1a; 只允许在一端进行插入或删除操作的线性表&#xff0c;先进后出LIFO 类似一摞书&#xff0c;按顺序拿&#xff0c;先放的书只能最后拿&#xff1b; 顺序栈&#xff1a;栈的顺序存储 typedef struct{Elemtype data[50];int top; }SqStack; SqS…

Window部署Oracle并实现公网环境远程访问本地数据库

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 前言 Oracle&#xff0c;是甲骨文公司的一款关系…

掌握Redis,看完这篇文章就够了!

目录 1.Redis介绍 2.Redis服务器与客户端 3.Redis配置文件 4.Redis数据类型操作 4.1使用python连接数据库 4.2 字符串 4.3 哈希 4.4 键对应操作 4.5 列表 4.6 集合 4.7 有序集合 1.Redis介绍 Redis 是一个开源的内存数据库&#xff0c;它提供了一个高性能的 key-val…

基于PyTorch深度学习实战入门系列-Numpy基础全

Numpy的使用 导入Numpy模块 import numpy as np创建数组&#xff08;一维数组、小数数组、二维数组&#xff09; # 创建一个一维数组 n1 np.array([1, 2, 3]) # 创建一个含有小数的一维数组 n2 np.array([0.1, 0.2, 0.3]) # 创建一个简单的二维数组 n3 np.array([[1, 2], [3…

基于Java+SpringBoot+vue+element实现前后端分离牙科诊所管理系统详细设计

基于JavaSpringBootvueelement实现前后端分离牙科诊所管理系统详细设计 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 ** 作者主页 央顺技术团队** 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式…

【阿里云系列】-基于云效构建部署NodeJS项目到ACK

准备工作 01、编写Dockerfile文件可以根据不同的环境&#xff0c;新建不同的Dockerfile文件&#xff0c;比如Dockerfile-PROD # Deliver the dist folder with NginxFROM nginx:stable-alpine ENV LANGC.UTF-8 ENV TZAsia/ShanghaiCOPY dist/ /usr/share/nginx/html COPY ngi…

字节跳动也启动春季校园招聘了(含二面算法原题)

字节跳动 - 春招启动 随着各个大厂陆续打响春招的响头炮&#xff0c;字节跳动也官宣了春季校园招聘的正式开始。 还是那句话&#xff1a;连互联网大厂启动校招计划尚且争先恐后&#xff0c;你还有什么理由不马上行动&#xff1f;&#xff01; 先来扫一眼「春招流程」和「面向群…