当前位置: 首页 > news >正文

【学习笔记】内存的连续分配管理方式

目录

  • 先决条件
  • 单一连续分配
  • 固定分区分配
  • 动态分区分配
  • 补充
    • 内部碎片和外部碎片
    • 基于顺序搜索的动态分区策略(算法)
  • 参考与扩展

先决条件

  1. 这里介绍的这些内存分配方式都是非常古老的内存分配方式,基本已经不在现代操作系统中单独使用
  2. 这里的语境是指,为一个用户程序(进程)分配一个连续的内存空间。在非连续的内存管理中,可以将一个用户进程分散装入内存空间
  3. 内存大致的分区情况是,存在一个系统区,用于存放操作系统。存在一个用户区,用于存放用户进程。至于操作系统是在高地址还是低地址则要根据其实现来判断
    在这里插入图片描述

单一连续分配

这种方式只适合于单一用户,单一任务的单道用户程序的情况,换句话说,就是一次只能有一个进程跑在内存中
在这里插入图片描述
其缺点是

  1. 内部碎片可能会非常大,比如上面这个图中,作业(暂且把它当做一个进程)只用了 64 KB,有很大的空间都不能用
  2. 显而易见的第二个缺点就是内存利用率低

固定分区分配

这是最简单的躲到程序存储管理的方式,即内存中可以跑多个进程。系统将用户区提前分成大小固定的分区

特别的是,固定分区分配有两种不同的方式(这里的固定,是指它们的大小都提前固定好,以后不能更改

  1. 分区大小都相等
  2. 分区大小不等
    在这里插入图片描述
    为了便于管理这些分区,我们使用一种叫做分区说明表的东西来管理这些固定分区。如下图所示
    在这里插入图片描述
    对固定分区来说,其缺点也是显而易见的:
  3. 可能存在一个非常大的程序无法放入任何分区
  4. 相比于现代操作系统中的内存管理,该方法的利用率还是低了点,且同样会产生大量的内部碎片

动态分区分配

动态分区分配相比于前两者就非常灵活了,它会根据进程的大小动态的建立分区,进程多大,分区就占多大。

如下图,有 4 个进程的大小依次是 20MB,14MB,18MB,8MB。总共的内存大小是 64MB。其中操作系统的系统区占 8MB,用户区占 56MB。

在上半部分中,当 1,2,3 进程被分配完后,第四个进程 8MB 大于剩余的分区 4MB。如果此时进程 2 等待被换出,那么进程 4 就可以被换入(图第二行第二幅),此时产生新的分区 6MB(仔细观察图)。同理的方式可以进行其他的换入换出操作。

【注】这里的换出,指的是从内存将,将这个进程换出到磁盘(硬盘)中
在这里插入图片描述
其缺点是容易形成外部碎片,但可以通过紧凑的方式来优化这个问题。

补充

内部碎片和外部碎片

内部碎片是已经被分配出去,但是被分配者未使用,而又不能给其他进程使用。好比如我囤积了大量的粮食,我没有吃,别人也吃不了我的

比如我们最开始讲的单一连续分配,因为整个用户区都只分配一个进程,而进程大小可能远远小于用户区大小,这时空闲的用户区又不能提供给其他进程使用,我们就可以称这些空闲用户区是内部碎片。

外部碎片是没有分配出去,但是因为空间太小了而无法提供给任何进程。好比如只有一粒粮食,给谁都没用,太少了。

比如我们最后讲的动态分区分配。因为每个进程都是“量体裁衣”式的进行分区分配,所以不存在内部碎片,但是很可能存在外部碎片,假如当前剩余的空闲分区是 2MB,而要装入的进程最小都是 3MB,那么这个空闲分区(在没有进程换出的情况下),就一直无法使用,称之为外部碎片。

基于顺序搜索的动态分区策略(算法)

上面我们介绍了三种连续分配的内存管理模式,但是,当一个进程进入一个内存中时,究竟如何选择将其放入那个空闲分区中呢,这里涉及的就动态分区的算法。

参考与扩展

  1. 非连续分配管理方式:本篇我们将的是内存连续的分配管理方式,而这一篇讲的是非连续的管理方式。

相关文章:

  • 图解 cv2.HoughLines cv2.line 参数原理
  • 使用简易网络实现二分类
  • XAML笔记
  • 5个自动化小技巧:聪明的员工和管理者如何提升效率?
  • JAVA轻量级错误码设计最佳实践
  • Nidia的Deepstream,官方给的案例介绍,deepstream-test1\deepstream-tes2\deepstream-test5
  • RESTful风格学习笔记【包含示例】
  • Java:单例模式详解
  • 第十九天人工智能课程总结
  • opencv入门 二
  • Java:在Java中使用函数接口
  • 百度小程序SEO指南
  • 【C++提高】一篇文章了解 C++ 操作 TDengine(详解)
  • CSDN客诉周报第8期|本周解决15个用户问题
  • 小白学习-ElasticSearch教程(2) -文档查询之match查询 | 分词器
  • @angular/forms 源码解析之双向绑定
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • Angular 响应式表单之下拉框
  • Angular6错误 Service: No provider for Renderer2
  • Angularjs之国际化
  • flask接收请求并推入栈
  • Java IO学习笔记一
  • java第三方包学习之lombok
  • KMP算法及优化
  • Laravel Mix运行时关于es2015报错解决方案
  • Linux下的乱码问题
  • rc-form之最单纯情况
  • Spark RDD学习: aggregate函数
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 好的网址,关于.net 4.0 ,vs 2010
  • 推荐一个React的管理后台框架
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • HanLP分词命名实体提取详解
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​linux启动进程的方式
  • #WEB前端(HTML属性)
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (9)STL算法之逆转旋转
  • (a /b)*c的值
  • (C语言)字符分类函数
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (三)终结任务
  • (十一)c52学习之旅-动态数码管
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • **PHP二维数组遍历时同时赋值
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET 指南:抽象化实现的基类
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET下的多线程编程—1-线程机制概述