MemoryManage

操作系统之存储管理

计算机系统存储器一般分为主存储器(内存)和辅助存储器(外存)两级,内存又可以分成系统区和用户区两部分,系统区用来存储操作系统等系统软件,用户区用来分配给用户作业使用,这与于内核态和用户态相呼应。由于内存一般较小却有时必须运行较多程序,需要进行调配,给用户提供方便并给予安全和足够大的存储空间,所以存储管理一般情况下讲的都是内存管理。

存储管理的任务

存储主要负责逻辑地址和物理地址之间的地址转换、内存的分配和回收、内存的地址保护、内存共享和内存扩充。

  • 内存扩充并不是指硬件设备上的扩充,而是用虚拟技术来实现逻辑上的扩充,即虚拟存储概念,在下文会出现。

存储管理方式

将一个用户程序变为一个可在内存中执行的程序,通常需要这几个步骤:编译——>链接——>装入,其中装入即是指将程序装入内存,因此我们需要清楚操作系统的存储管理方式才能明白内存时如何分配给程序的。

常见的存储管理方式有:单一连续分配方式、分区分配方式、分页、分段管理方式和虚拟存储方式,但实际上分配方式时不断发展的,后出现的技术往往包含了前面的技术,因此各种管理方式都不是独立存在的。

  • I.单一连续分配方式:内存的用户区一次只分配给一个作业使用,很明显,这种方式最简单,但缺点也是显然的——内存利用率很低

  • II.分区分配方式:为适应多道程序技术而产生的方式,将用户区分成几个连续的区域,当作业(程序)装入时分配一个适合的分区给该作业。如果固定了每个分区的大小,则很难能恰好适配作业,因此等作业装入时才分配内存——可变分区策略才是更加明智的选择。

    • 可变分区分配算法

      • ①首次适应算法:分配内存时,从空闲分区链链首开始按顺序查找,直到找到满足要求的分区

      • ②循环适应算法:从上次找到的空虚分区开始按顺序查找

      • ③最佳适应算法:将既能满足要求又是最小的分区分配给作业

      • ④最差适应算法:将既能满足要求又是最大的分区分配给作业

      这些分配算法会产生一小块一小块不足以运行作业的小分区,称为碎片,降低了内存的利用率,拼接碎片——"紧凑"策略是一种解决碎片的方法,但开销大,需要另寻方法。

      内存的回收操作:回收区会与相邻接的空闲分区合并,否则独立一个分区

  • III.分页管理技术
    将内存空间和作业地址空间按相同长度为单位进划分,把每个作业的地址空间分成一些大小相同的片段,称为“页”,把内存空也分成与页面相同的片段,称为“物理块”或“页框”。在分配存储空间时,总是以块为单位,按照作业的页数分配物理块。分页管理技术将分区切成足够小的块,分配时不存在碎片,因为分页管理技术分配块可以是不连续的,即便夹在两块非空闲分区之间的块也能被分配给作业。

    页-块示意图


    地址转换示意图

    • 地址转换例子:在分页存储管理系统中,逻辑地址的长度为16位,页面大小为4096字节,现有一逻辑地址为2F6AH,且第0、1、2页依次存放在物理块5、10、11中,由此可知逻辑地址2F6AH的页号为2,小于页表长度3,没有越界,该页存放在第11个物理块中,用十六进制表示块号为B,所以物理地址为BF6AH。

而现代计算机系统都支持非常大的地址空间,页表就会变得非常大,因此需要使用多级页表(页面指向页面)和块表(缓冲页)来支持。

  • IV.分段管理技术:每个作业按照自身逻辑关系划分成若干段,像页表一样建立段表。

  • V.段页式管理方式:将分页管理和分段管理结合起来,建立段表,段表内的地址映射页表,页表内的地址映射物理块。

  • VI.虚拟存储管理:作业一次性和驻留性严重降低了内存的利用率,而局部性原理说明了部分指令执行次数高于其他指令,因此仅需把作业一部分装入,当这部分需要调用其他部分时再请求调入其他部分。而在了解虚拟存储之前还需要了解覆盖技术和交换技术。

    • ①局部性原理

      • 时间局部性:一条指令被执行后,那么它可能很快会再次被执行

      • 空间局部性:若某一存储单元被访问,那么与该存储单元相邻的单元可能也会很快被访问

    • ②覆盖技术:装入作业时,将作业不需同时出现的程序段分配在同一内存分区

      交换技术:将内存中暂时不需要的某个作业部分或全部移到外存,并将外存中需要的某个作业移到内存中。

    通过对局部性原理、覆盖技术和交换技术的说明,虚拟存储概念呼之欲出,虚拟存储即是将作业并交由系统分配,而系统将作业一部分一部分交换覆盖到内存中执行,因此虚拟存储器还需要提供请求调入和置换功能,Linux系统采用的就是虚拟存储技术。这里我们需要了解一下页面置换(页面淘汰)的算法。

    • ①最佳置换:淘汰那些永不被使用或者长时间内不被使用的页,但无法实现,因为作业运行时动态的,几乎不可能在运行前判定页面的使用频率。

    • ②先进先出:淘汰先进入的页,效率不高,可能出现页面频繁换进唤出而没有足够时间执行的情况即“抖页”。

    • ③最近最久未使用:淘汰最近一段时间内最少使用的一页

    • ④Clock(最近未使用):设置访问位,循环遍历页面队列淘汰访问位未0的页面,这种算法还能再改进,可以增加置换代价这一因素,这样未被使用又未被修改的页面将是首选淘汰对象。

你可能感兴趣的:(Operation,System)