分区表:记录分区的位置,大小和使用标志

 

分区存储管理:

  单一区存储管理(不分区存储管理):

    定义:用户区不分区,完全被一个程序占用。例如DOS

    优点:简单,不需要复杂

    缺点:程序运行占用整个内存,

       内存浪费,效率低

  分区存储管理:把用户区内存划分为若干大小不等的分区

         适合单用户单任务系统

    固定分区:把内存固定地划分为若干个大小不等的分区

         每个分区的大小和位置都固定,系统运行期间不再重新划分

      使用特点:

        1.在程序装入之前,内存已被分区,不再改变

        2.每个分区大小不同,适应不同大小的程序

        3.系统要维护分区表

      缺点:

        1.浪费内存

        2.大程序可能无法运行

      建议:

        根据分区表安排程序装入顺序

        当程序的大小,个数,装入顺序都固定时内存使用效率高。

    动态分区:在程序装入时创建分区,使分区的大小刚好与程序大小相等。

      特点:

        分区动态建立

        分区的大小和个数都可以改变

        存在内存碎片

      问题:

        分区的分配,选择,回收和如何解决内存碎片问题。

 

分区放置策略:

  空闲区表:描述内存空闲区的

  分区的分配:

    分配过程(假定需要空间大小为S)

      1.从空闲区表第一个区开始寻找≥S的空闲区

      2.找到后从分区中分割出大小为S的部分给用户使用

      3.分割后的剩余部分作为空闲区依然登记再空闲区表中

      //分割空闲区的时候从底部分割,这样只是大小改变但是区的地址不变。

  放置策略:

    1按照空闲区首地址递增排序:首次适应算法

    2.按照空闲区首地址递减排序

    3.按照空闲区大小的递增排序:最佳适应算法

    4.按照空闲区大小的递减排序:最坏适应算法

    

    首次适应算法:尽可能使用低地址空间

          当需要较大分区时再高地址的空间有满足可能性

    最坏适应法:

      优点:大空闲区分割后剩下部分还是可以装下较大的程序

      特点:只需要一次查找就可以找到需要的分区

    分区的回收:

      功能:回收程序释放分区,登记到空闲区表中,以便再使用

      收回算法:

        1.考虑释放区与现有空闲区是否相邻   

        2.若释放区与现有空闲区不相邻,则直接插入空闲区表

        3.若释放区与现有空闲区相邻,则与空闲区合并后更新空闲区表

 

内存覆盖技术:

  覆盖——Overlay

  目的:在较小的内存空间中运行较大的程序

  内存分区:

    常驻区:被某段单独且固定地占用,可划分多个

    覆盖区:能被多段共用(覆盖),可划分多个

  缺点:

    编程复杂:程序员划分程序模块并确定覆盖关系

    程序执行时间长:从外存装入内存耗时

 

内存交换技术:Swapping

  原理:内存不够时把进程写进磁盘(换出/Swap Out)

     当进程要运行时重新写回内存(换入/Swap In)

  优点:

    增加进程并发数

    不考虑程序结构

  缺点: 

    换入和换出增加CPU开销

    交换单位太大

  问题:

    减少交换传输的信息量

    外存交换空间的管理方法

    程序换入时的地址重定位

 

内存碎片:

  过小的空闲区,难利用

  内存碎片会降低内存有效利用率

  碎片问题:

    动态分区的缺点:

      容易产生内存碎片:内存反复分配和分割

      最佳适应法最容易产生内存碎片

    解决办法1:规定门限值

      分割空闲区时,若剩余部分小于门限值,则不分割,全部给用户

    解决办法2:内存拼接技术

      将所有空闲区集中一起构成一个大的空闲区

      拼接的时机:

       1.释放区回收的时候

        拼接频率过大,系统开销大

       2.系统找不到足够大的空闲区时

        空闲区的管理复杂

       3.定期:

        空闲区的管理复杂

      拼接技术的缺点:

        消耗系统资源

        离线拼接//需要整个系统停止运作来拼接

        重新定义作业

     解决办法3:解除程序占用连续内存才能运行的限制

        把程序拆分成多个部分装入不同分区,充分利用碎片