操作系统内存分配-分区

  • 连续分配管理方式
    • 单一连续存储分配
    • 固定分区管理
    • 动态分区分配
      • 基于顺序搜索
      • 基于索引搜索的动态分区分配算法
    • 动态可重定位分区分配
    • 覆盖
    • 对换技术

连续分配管理方式

单一连续存储分配

将内存分成两个连续的区域:系统区和用户区
系统区只能是留给系统程序执行,用户区每次只能分配给一道程序

  • 优点:不需要进行复杂的内存保护,因为用户区每次只能存储一道程序;无外部碎片(后面有解释)、可以采用覆盖技术,不需要哦额外的技术支持
  • 缺点:只能单用、单任务使用,有内部碎片,存储器利用率极低

固定分区管理

主要分为分区大小相等和分区大小不等的情况

  • 等区划分
    缺乏灵活性,程序过大装不进去,程序过小又浪费空间

  • 非等区划分
    相对具有灵活性

  • 内存的分配:建立一个分区说明表,每一个表标注状态已经分配的不能被重新分配,一直到分配的内存被释放才可以又被分配。数据结构上可以采用链表、数组或者B+应该都没有问题(个人看法)

动态分区分配

系统存储器不预先划分分区,在每次作业装入时,根据作业大小要求,从可用存储空间中切一块大小与所要求相近的存储区分配给作业。

  • 优点:无内部碎片
  • 缺点:有外部碎片
  • 克服外部碎片的办法——紧凑,但是开销大

一、内存分配

基于顺序搜索

1、最先匹配法(首次适配算法):空闲区不排序,在空闲表中找到一个符合要求的分区,就可以分配
好处:较大的空闲分区可以被保留在内存高端。
不足:但随着低端分区不断划分而产生较多小分区,每次分配时查找时间开销会增大。

2、最佳匹配法:空闲区一开始从小到大开始排序,找到大小和要求的分区差最小的开始分配
好处:较大的空闲分区可以被保留
不足:但会形成较多无法利用的较小分区(外部碎片)
3、最差匹配法:空闲去按照大到小排序,找到最大的分区开始分配
这种方法基本不留下小空闲分区,但较大的空闲分区不被保留。
举例说明:先有作业序列:作业A要求18K;作业B要求25K,作业C要求30K。请给出采用最先、最佳、最差三种适配算法进行内存分配后的空闲区队列,哪些方法能将三个作业全部装入内存。

先分配作业A之后,内存情况:

作业B被分配:

作业C被分配

基于索引搜索的动态分区分配算法

伙伴系统:
① 算法规定每个空闲分区的大小都是2的k次幂,对于每个大小相同(也就是k相同)的分区,都会设置一个双向链表,这样系统所有的空闲分区就会被分成k个不同的空闲分区链表
② 当需要分配内存时候,(假设需要2的j次方),找到一个空间是i>j的最小的那个,将这个i分区一分为二,一部分用来分配内存,一部分存再2的 i-1次方的那个链表中,作为下次可以被分配的对象

二、内存回收:


a、不用重新分配表项,直接用上空闲区的表项和首地址,地址长度是三个分区大小的和,取消下表项的内容
b、不用重新分配表项,直接使用上空闲区的表项和首地址,地址长度是两个分区的大小和 c、修改下空闲区的首地址和长度
d、增加一个新的表项,首地址和长度就是中间分区的长度

动态可重定位分区分配

首先先明白内碎片和外碎片的概念:
1、 内碎片:对于固定分区来说的,一个固定的分区只能分配一道作业,当分区过大分配作业会有残余或者过小无法分配的时候,就会产生内碎片,这个内碎片是属于分区的。
2、外碎片:对于动态分区而言的,对于动态分区,就是有作业就割据一部分内存来存放,但是当割据后剩余的一部分过小,无法分配作业时候,就会产生一个外碎片,这个外碎片是一个独立分区,只是这个分区不能分配了而已。

以上我们知道,上面介绍的分区方式会产生一定的碎片,造成内存的浪费,所以才有动态可重定位分区的分配

一、紧凑(拼接)

  • 也就是将内存中所有的作业都进行移动,使得他们都相邻,就会留下一个连续的空闲分区,给大作业使用
    缺点:没紧凑一次,需要移动程序或者数据进行地址的修改,是一件相当麻烦的事情

二、动态重定位

  • 前面讲的动态运行时装入:作业装入内存之后不会马上就修改相对地址成绝对地址,这个时候引入一个重定位寄存器,用来存放程序(数据)在内存的起始地址
    访问的时候:绝对地址=相对地址+寄存器地址
  • 当我们要进行紧凑的时候,不需要修改程序中的地址,而是修改重定位寄存器中的起始地址。
    说明:重定位寄存器中的地址是整个程序的起始地址,图中的重定位是10000,也就是程序的开头存放在物理地址中的10000的位置上。

    三、多重分区存储管理
  • 给一个分爱分配多个内存分区,每个分区可以装入作业的一段或者多端,使得一些尺度比较小的分区可以得到利用,提高内存利用效率
    要求系统需要何止多个机制(界限寄存器)来实现内存管理安全问题(不能越界),实现难度比较大
    不足:作业分区不能太多,还是会产生一些碎片

总结:紧凑和多重分区存储管理还是会产生一些碎片,紧凑只是用一种成本比较大的方法移动程序(数据)来使得空闲分区较大,多重分区存储管理还是会产生一些更小的碎片。所以两种方法都没有从根本上解决碎片问题。



覆盖

让一个程序中没有调用关系的模块共享内存,安排装载到同一个内存块中,以缓存系统内存不足的问题
一般来说,兄弟节点之间都是没有调用关系的

对换技术

  • 在多道程序调用中,将暂时不能执行的程序送到外存中,腾出空间装入新程序
    优点:增加并发运行程序的数目
    缺点:换进换出会增加系统的开销;程序的换进换出,可能会传送很多无用的代码 或者数据,造成无用功

操作系统 内存分配-分区相关推荐

  1. 操作系统内存管理——分区、页式、段式管理

    操作系统内存管理--分区.页式.段式管理 标签: 内存管理操作系统数据结构算法 2010-07-05 11:26 20805人阅读 评论(5) 收藏 举报 分类: 操作系统(4) 版权声明:本文为博主 ...

  2. linux c 内存分配内存,Linuxc - 操作系统内存分配

    静态变量是存储在数据段的,在函数中可以共用. 全局变量也是存储在数据段的,在全局中可以共用. 指针变量本质上是地址,数组变量本质上也是地址. 数组是可靠的,不可变的地址.指针变量是不可靠的,可变的.数 ...

  3. 操作系统——内存分配管理

    文章目录 1. 连续分配 1.1 单一连续分配 1.2 固定分区分配 1.3 动态分区分配 2. 非连续分配 2.1 基本分页存储管理方式 2.1.1 基本地址变换机构 2.1.2 具有快表的地址变换 ...

  4. 操作系统——内存分配与管理

    内存的定义: 内存是用于存放数据的硬件.程序在执行前需要先放到内存中才能被CPU处理. 按字编址: 如果字长为16位的计算机"按字编址",则每个存储单元大小为1个字;每个字的大小为 ...

  5. C语言——操作系统内存分配过程

    内存分配机制的发展过程: 第一阶段--程序直接操作物理内存. 某台计算机总的内存大小是128M,现在同时运行两个程序A和B,A需占用内存10M,B需占用内存100.计算机在给程序分配内存时会采取这样的 ...

  6. 操作系统内存分配算法_操作系统基础45-伙伴系统和slab内存分配

    当在用户模式下运行进程请求额外内存时,从内核维护的空闲页帧列表上分配页面.这个列表通常使用页面置换算法来填充,如前所述,它很可能包含散布在物理内存中的空闲页面.也要记住,如果用户进程请求单个字节内存, ...

  7. 内存分配算法(FF、BF、MF)

    动态分区分配 最近在学习操作系统内存分配方面的知识点,小小的总结一下知识点. 根据进程的实际需要,动态的为之分配内存空间.在实现动态分区分配时,将涉及到分区分配中所用到的数据结构.分区分配算法和分区的 ...

  8. 内存分配与数据格式化(malloc与new)

    2019独角兽企业重金招聘Python工程师标准>>> 1. 操作系统内存分配 Linux操作系统内存分配策略采用 伙伴系统与Slab分配器 伙伴系统:按照一定单位大小(4KB),把 ...

  9. Java虚拟机内存分配策略

    1.JVM内存分配分区 Java的内存简单分为堆内存和非堆内存 其中堆内存又可以分为新生代和老年代 新生代分为1个Eden区和2个Survivor区,如下图: 2.JVM垃圾回收种类 分为2种,Min ...

  10. linux内存管理策略,Glibc内存管理—ptmalloc内存分配策略(1)

    一.linux的内存布局 1.32位模式下内存的经典布局​ 图1 32位模式下内存经典布局 ​ 注:这种内存布局模式是linux内核2.6.7以前的默认内存布局形式 说明:(1)在32的机器上,lo ...

最新文章

  1. 使用Python、OpenCV进行图像接缝雕刻
  2. java同步关键字_Java中synchronized关键字修饰方法同步的用法详解
  3. Java基础篇:equals()方法与==的区别
  4. VTK:图片之BorderPixelSize
  5. 疯子的算法总结(九) 图论中的矩阵应用 Part 1 POJ3613 Cow Relays
  6. STL17-函数对象
  7. CentOS中获取文件的前四个字节的16进制值
  8. 软件设计师历年真题与解析分享(05——17年)
  9. nfc读写软件 android手机,手机nfc万能读写软件
  10. 如何下载国家自然科学基金申请书的模板
  11. 10.计算机基础之程序设计基础
  12. HackTheBox::Blunder
  13. FFmpeg的Android平台移植—编译篇
  14. 如何准备机器学习工程师的面试 ?
  15. javaWEB如何实现一个电影票预定购票系统javaee电影选票选座平台
  16. VulnHub Billu_b0x
  17. 巴菲特的获利秘诀——“5+12+8+2”
  18. 新时达服务器说明书_新时达调试指导说明
  19. 详解为什么v-if和v-for不能同时使用
  20. CEO采访:从战略层面建立数据驱动型的客户体验策略

热门文章

  1. Java web前端——HTML常用标签
  2. win7 查看计算机位数,Win7系统电脑操作系统位数的多种查看方法
  3. 双目立体相机的基线如何求?
  4. oracle imp命令参数,oracle exp和imp命令参数详解
  5. JDk1.8(Win 10版 64位)安装、环境变量配置及第一个Java程序
  6. TCP之Delay ACK在Linux和Windows上实现的异同-Linux的自适应ACK
  7. 什么是TOC约束理论以及TOC系统业务流程
  8. excel打开oracle,Oracle PLSQL读取(解析)Excel文档
  9. [VOT7](2022CVPR) GTELT:Global Tracking via Ensemble of Local Trackers
  10. xp系统怎么关闭wmi服务器,XP系统电脑中解决wmi服务被禁用的开启方法