操作系统 内存分配-分区

操作系统内存分配-分区

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

连续分配管理方式

单一连续存储分配

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

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

固定分区管理

主要分为分区大小相等和分区大小不等的情况
操作系统 内存分配-分区_第1张图片

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

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

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

动态分区分配

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

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

一、内存分配

基于顺序搜索

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

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

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

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

二、内存回收:

操作系统 内存分配-分区_第6张图片
a、不用重新分配表项,直接用上空闲区的表项和首地址,地址长度是三个分区大小的和,取消下表项的内容
b、不用重新分配表项,直接使用上空闲区的表项和首地址,地址长度是两个分区的大小和 c、修改下空闲区的首地址和长度
d、增加一个新的表项,首地址和长度就是中间分区的长度

动态可重定位分区分配

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

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

一、紧凑(拼接)

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

二、动态重定位

  • 前面讲的动态运行时装入:作业装入内存之后不会马上就修改相对地址成绝对地址,这个时候引入一个重定位寄存器,用来存放程序(数据)在内存的起始地址
    访问的时候:绝对地址=相对地址+寄存器地址
  • 当我们要进行紧凑的时候,不需要修改程序中的地址,而是修改重定位寄存器中的起始地址。
    说明:重定位寄存器中的地址是整个程序的起始地址,图中的重定位是10000,也就是程序的开头存放在物理地址中的10000的位置上。
    操作系统 内存分配-分区_第7张图片
    三、多重分区存储管理
  • 给一个分爱分配多个内存分区,每个分区可以装入作业的一段或者多端,使得一些尺度比较小的分区可以得到利用,提高内存利用效率
    要求系统需要何止多个机制(界限寄存器)来实现内存管理安全问题(不能越界),实现难度比较大
    不足:作业分区不能太多,还是会产生一些碎片

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



覆盖

让一个程序中没有调用关系的模块共享内存,安排装载到同一个内存块中,以缓存系统内存不足的问题
一般来说,兄弟节点之间都是没有调用关系的
操作系统 内存分配-分区_第8张图片

对换技术

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

你可能感兴趣的:(操作系统,操作系统,内存管理)