存储器的层次结构

存储器的层次结构

1.存储器的多层结构

对于通用计算机而言,存储层次至少应具有三级:最高层为CPU寄存器,中间为主存,最底层是辅存。在较高档的计算机中,还可以根据具体的功能细分为寄存器、高速缓存、主存储器、磁盘缓存、固定磁盘、可移动存储介质等6层。如下图所示。
存储器的层次结构

2.多层结构的存储器系统

  • 可执行存储器
    在计算机系统的存储层次中,寄存器和主存储器又被称为可执行存储器。对于存放于其中的信息,与存放于辅存中的信息相比较而言,计算机所采用的访问机制是不同的,所需耗费的时间也是不同的。进程可以在很少的时钟周期内使用一条load或store指令对可执行存储器进行访问。但对辅存的访问则需要通过I/O设备实现,因此,在访问中将涉及到中断、设备驱动程序以及物理设备的运行,所需耗费的时间远远高于访问可执行存储器的时间,一般相差3个数量级甚至更多。
  • 主存储器
    主存储器—内存,保存进程运行时的程序和数据。CPU与外围设备交换的信息一般也依托于主存储器地址空间。为缓和主存储器的访问速度远低于CPU执行指令的速度,在计算机系统中引入了寄存器和高速缓存。
  • 寄存器
    寄存器—与CPU协调工作,用于加速存储器的访问速度,如用寄存器存放操作数,或用作地址寄存器加快地址转换速度等。
  • 高速缓存
    高速缓存—根据程序执行的局部性原理将主存中一些经常访问的信息存放在高速缓存中,减少访问主存储器的次数,可大幅度提高程序执行速度。
  • 磁盘缓存
    磁盘缓存—将频繁使用的一部分磁盘数据和信息,暂时存放在磁盘缓存中,可减少访问磁盘的次数。它依托于固定磁盘,提供对主存储器存储空间的扩充,即利用主存中的存储空间,来暂存从磁盘中读/写入的信息。
  • 计算机使用三级两层制解决了速度问题。

3.程序的装入和链接

在多道程序环境下,程序要运行必须为之创建进程,而创建进程的第一件事,就是要将程序和数据装入内存。如何将一个用户源程序变为一个可在内存中执行的程序,通常需要经过以下几步:
(1)编译
由编译程序将用户源代码编译成若干个目标模块。
(2)链接
由链接程序将编译后形成的目标模块以及它们所需要的库函数,链接在一起,形成一个装入模块。
(3)装入
由装入程序将装入模块装入内存。
下图给出了这样的三步过程。
存储器的层次结构

1) 程序的装入

将一个装入模块装入内存时,可采用三种方式:绝对装入方式、可重定位方式和动态运行时装入方式。

    1. 绝对装入方式(Absolute Loading Mode)
      在编译时,如果知道程序将驻留在内存的什么位置,那么,编译程序将产生绝对地址的目标代码。
      绝对装入程序按照装入模块中的地址,将程序和数据装入内存。装入模块被装入内存后,不须对程序和数据的地址进行修改,程序中所使用的绝对地址,既可在编译或汇编时给出, 也可由程序员直接赋予。但在由程序员直接给出绝对地址时, 不仅要求程序员熟悉内存的使用情况,而且一旦程序或数据被修改后,可能要改变程序中的所有地址。因此,通常是宁可在程序中采用符号地址,然后在编译或汇编时,再将这些符号地址转换为绝对地址。
    1. 可重定位装入方式(Relocation Loading Mode)
      可重定位装入程序,根据内存当前使用情况,将装入模块装入到内存的某个位置。
    1. 动态运行时装入方式(Denamle Run-time Loading)
      动态运行时的装入程序,在把装入模块装入内存后,并不立即把装入模块中的相对地址转换为绝对地址,而是把这种地址转换推迟到程序真正要执行时才进行。因此, 装入内存后的所有地址都仍是相对地址

2) 程序的链接

根据链接时间的不同,可把链接分成如下三种:
(1) 静态链接。在程序运行之前,先将各目标模块及它们所需的库函数,链接成一个完整的装配模块,以后不再拆开
(2) 装入时动态链接。将用户源程序编译后所得到的一组目标模块,在装入内存时,采用边装入边链接的链接方式
(3) 运行时动态链接。对某些目标模块的链接,是在程序执行中需要该模块时,才对它进行的链接

    1. 静态链接方式(Static Linking)
      在将多目标模块装配成一个装入模块时,须解决以下两个问题:
      (1) 对相对地址进行修改。
      (2) 变换外部调用符号。
    1. 装入时动态链接(Loadtime Dynamic Linking)
      用户源程序经编译后所得到的目标模块,是在装入内存时,边装入边链接的。即在装入一个目标模块时,若发生一个外部模块调用,将引起装入程序去找出相应的外部目标模块,并将它装入内存,还要按照静态链接方式来修改目标模块中的相对地址。装入时动态链接方式有以下优点: 
      (1) 便于修改和更新
      (2) 便于实现对目标模块的共享
      OS能够将一个目标模块链接到几个应用模块,即实现多个应用程序对该模块的共享。
    1. 运行时动态链接(Run-time Dynamic Linking)
      近几年流行起来的运行时动态链接方式,是对上述在装入时链接方式的一种改进。这种链接方式是将对某些模块的链接推迟到执行时才执行,亦即,在执行过程中,当发现一个被调用模块尚未装入内存时,立即由OS去找到该模块并将之装入内存, 把它链接到调用者模块上。凡在执行过程中未被用到的目标模块,都不会被调入内存和被链接到装入模块上,这样不仅可加快程序的装入过程,而且可节省大量的内存空间。