操作系统概念学习笔记 第九章 内存管理

背景

  地址绑定:

    在磁盘上等待调入内存以便执行的进程形成了输入队列。

  逻辑地址空间与物理地址空间:

    CPU所生成的地址通常称为逻辑地址(虚拟地址)

    内存单元所看到的地址通常称为物理地址

    由程序所生成的所有逻辑地址的集合称为逻辑地址空间

    与这些逻辑地址相对应的所有物理地址的集合称为物理地址空间

    运行是从虚拟地址到物理地址的映射是由称为内存管理单元的硬件设备来完成的。

  动态加载:

    为了获得更好的内存空间使用率,可以使用动态加载。采用动态加载时,一个子程序只有在调用时才被加载。

    动态加载的优点是不用的子程序绝不会被装入内存。

  动态链接与共享库:

    将链接延迟到运行时,

  覆盖:

    为了能让进程比它所分配到的内存空间大,可以使用覆盖。

    覆盖的思想是在任何时候只在内存中保留所需的指令和数据。当需要其他指令时,它们会装入到刚刚不再需要的指令所占用的内存空间内。

    覆盖需要覆盖驱动程序和使用特殊的重定位、链接算法。

    覆盖的使用通常局限于微处理机和只有有限物理内存且缺乏更先进硬件支持的其他系统。

 

 

交换:

  进程可以暂时从内存中交换出来到备份存储上,当需要再执行时再调回到内存中。

  注意交换时间的主要部分是转移时间,总的转移时间与所交换的内存空间直接成正比。

  普通交换使用不多,交换需要很多时间,而且提供很少的执行时间,因此这不是一种有效内存管理解决方案。

 

 

连续内存分配:

  内容必须容纳操作系统和各种用户进程,因此应该尽可能有效地分配内存的各个部分。

  内存通常分为两个区域:一个用于驻留操作系统,另一个用于用户进程。

  采用连续内存分配时,每个进程位于一个连续地内存区域

  内存保护:

    保护操作系统不受用户进程所影响,保护用户进程不受其他用户进程所影响。

    通过采用重定位寄存器和界限寄存器,可以实现这种保护。

    重定位寄存器含有最小的物理地址值;界限寄存器含有逻辑地址的值。

    每个逻辑地址必须小于界限寄存器,MMU动态地将逻辑地址加上重定位寄存器的值后映射成物理地址

    由于CPU所产生的每一个地址都需要与寄存器进行核对,所以可以保证操作系统和其他用户程序及数据不受该进程的运行所影响。

  内存分配:

    最为简单的内存分配方法之一就是将内存分为多个固定大小的分区。每个分区只能容纳一个进程。现在已不再使用。

    固定分区方案的推广(MVT),主要用于批处理环境,也可用于采用纯分段内存管理的分时操作系统:

      操作系统有一个表用于记录哪些内存可用和哪些内存已用。

      一开始,所有内存都可用于用户进程,因此能够作为一大块可用内存,称为孔。

      新进程需要内存,查找足够大的孔,分配所需的内存,未分配的可以下次再用。

      在任意时候,有一组可用空间和输入队列。操作系统根据调度算法来对输入队列进行排序。

      内存不断地分配给进程,直到下一个进程的内存需求不能满足为止。

      通用动态存储分配问题:

        首次适应:分配第一个足够大的孔,查找可以从头开始,也可以从上次首次适应结束时开始,一旦找到足够大的空闲孔,就可以停止。

        最佳适应:分配最小的足够大的孔,必须查找整个列表,除非列表按大小排列,这种方法可以产生最小剩余孔。

        最差适应:分配最大的孔,同样必须查找整个列表,除非列表按大小排列。这种方法可以产生最大剩余孔,该孔可能比最佳适应产生的较小剩余孔更为有用。

      模拟结果显示首次适应和最佳适应在执行时间和利用空间方面都好于最差适应。

      首次适应和最佳适应在利用空间方面难分伯仲,但首次适配要快些。

      这些算法都有外部碎片问题,

  碎片:

    内存碎片可以是外部的也可以是内部的。

    通常将内存以固定大小的块为单元来分配。采用这种方案,进程所分配的内存可能比所需要的要大,这两个数字只差称为内部碎片,这部分内存在分区内,而又不能用。

 

分页:

  分页内存管理方案允许进程的物理地址空间可以是非连续地。各种形式的分页,由于比以前所描述的方法更加优越,因此通常为绝大多数操作系统所采用。

  传统的分页支持一直由硬件来处理,最近的设计是通过将硬件和操作系统相配合来实现分页。

  基本方法:

    物理内存分为固定大小的块,称为帧。

    逻辑内存也分为同样大小的块,称为页。

    备份存储也分为固定大小的块,其大小与内存的帧一样。

    当进程需要执行时,其页从备份存储中调入到可用的内存帧中。

    CPU所生成的每个地址分为两个部分:页码和页偏移。页号作为页表中的索引。页表包含每页所在物理内存的基地址。这些基地址与页偏移的组合就形成了物理地址,就可送交物理单元。

    分页也是一种动态重定位。

    分页技术不会产生外部碎片,不过有内部碎片。

    页表中的每项也有一定的开销,该开销随着页的增大而降低。

    一般来说,随着时间的推移,页的大小也随着进程、数据和内存的不断增大而增大。

    分页的一个重要特点是用户观点的内存和实际的物理内存的分离。

    用户程序将内存作为一整块来处理,而且它只包括一个进程。

    事实上,一个用户程序与其他程序一起,分布在物理内存上。

    用户观点的内存和实际的物理内存的差异是通过地址转换硬件来调和的。逻辑地址转变成物理地址。

    用户进程根据定义是不能访问非它所占用的内存的。它无法访问其页表所规定之外的内存,页表只包括进程所拥有的那些页。

    帧表:每个条目对应着一个帧,以表示该帧是空闲还是已被占用,如果被占用,是为哪个进程的哪个页所占用。

  硬件支持:

    每个操作系统都有自己的方法来保存页表。绝大多数都为每个进程分配一个页表。

    页表的指针与其他信息(如指令计数器)一起存入进程控制块中。

    页表的硬件实现有很多方法,最为简单的一种方法是将页表作为一组专用寄存器来实现。

    如果页表比较小,那么使用寄存器还是比较合理的。现代计算机都允许页表非常大,一百万个条目,采用快速寄存器来实现就不可行

    因此需要将页表放在内存中,并将页表基寄存器指向页表。但是这种方案,访问一个字节需要两次内存访问(一次用于页表条目,一次用于字节),内存访问的速度就减半。这种延迟是无法忍受的。

    对这一问题的标准解决是采用小但专用且快速地硬件缓冲,这种缓冲称为翻译后备缓冲器(TLB)。

    TLB是关联的快速内存。TLB条目由两部分组成:键和值。

  保护:

    在分页环境下,内存保护是通过与每个帧相关联的保护位来实现的。这些位保存在页表中,任何一位都能定义一个页是可读、可写或只可读。

    还有一个位通常与页表中的每一条目相关联:有效-无效位。有效时,是合法的页。无效时,不在进程的逻辑地址空间内。

  页表结构:

    1 层次化分页:将页表再分页

    2 哈希页表:

    3 反向页表

  共享页:

    分页的另一个优点是可以共享共同代码,如果代码是重入代码,那么就可以共享

 

 

分段:

  基本方法

posted @ 2013-10-02 13:20  褐色键盘  阅读(306)  评论(0)    收藏  举报