OS(六):存储器管理之存储器结构

发布时间 2023-08-22 16:36:34作者: 无虑的小猪

  存储器管理的主要对象是内存。

1、存储器的层次结构

1.1、多级存储器结构

  存储器至少应具有三级:最高层为CPU寄存器,中间为主存,最底层是辅存。可以根据功能分工细分为 寄存器、高速缓存、主存储器、磁盘缓存、固定磁盘、可移动存储介质。

  0

  如上图,存储层次越往上,存储介质访问速度越快,相对存储容量越小。

  由于主存储器的访问速度远低于CPU执行指令的速度,为缓解速度不匹配的问题,引入了寄存器和高速缓存。

  寄存器和主存储器也被称为可执行存储器。

  不同层次的存储介质,由操作系统统一管理。操作系统的存储管理,负责对可执行存储器的分配、回收以及提供在存储层次间数据移动的管理机制。

1.2、主存储器与寄存器

1.2.1、主存储器

  主存储器,简称内存或主存,用于保存进程运行时的程序和数据,也称可执行存储器。

  CPU的控制部件只能从哪个主存储器中取得指令和数据,数据从主存中读取并将它们装入到寄存器,或从哪个寄存器存入到主存处器。

1.2.2、寄存器

  寄存器访问速度最快,与CPU协调工作,用于加速存储器的访问速度,如寄存器存放操作数,或用作地址寄存器加快地址转换速度。

  寄存器的长度以 字(word) 为单位。

1.3、高速缓存和磁盘缓存

1.3.1、高速缓存

  高速缓存用于存放主存中经常被访问的信息,以减少访问主存储器的次数,可大幅度提高程序执行速度。

  进程的信息(程序和数据)存放在主存储器中,当使用时被临时复制到一个速度较快的高速缓存中。当CPU访问特定信息时,先检查它是否在高速缓存,如果已经存在,直接从高速缓存中取出使用,避免访问主存;否则,再从主存中读出信息。

1.3.2、磁盘缓存

  磁盘I/O速度远低于对主存的访问速度,将频繁使用的一部分磁盘数据和信息,暂时存放在磁盘缓存中,以减少访问磁盘的次数。

  主存可以看做是辅存的高速缓存,因为辅存中的数据必须复制到主存才能使用;处理后的数据必须先存在主存,再输出到辅存。

2、程序的装入和链接

  多道程序环境下,程序若要运行,必须先创建进程,创建进程首要完成的事就是将程序和数据装入内存。

  将源程序变为可执行程序的需要经过如下步骤:1、编译;2、链接;3、装入。

  

  编译:将源代码编译成若干个目标模块;

  链接:由链接程序将编译后形成的一组目标模块,及它们锁需要的库函数链接在一起,形成一个完整的装入模块;

  装入:有装入程序将装入模块转入内存。

2.1、程序的装入

  程序装入有三种方式,分别是 绝对装入、可重定位装入和动态运行时装入。

2.1.1、绝对装入

  绝对装入程序按照装入模块中的地址,将程序和数据装入内存。装入模块被装入内存后,由于程序中的逻辑地址与实际内存地址完全相同,不须对程序和数据的地址进行修改。

  绝对装入方式只能将目标模块装入到内存中事先指定的位置,仅适用于单道程序环境。在多道程序环境下,编译程序无法预知锁编译的目标模块应放在内存的哪个位置。

2.1.2、可重定位装入

  装入时对目标程序中指令和数据的修改过程称为重定向。因为地址变换通常是在装入时一次完成的,以后不再改变,故称为静态重定向。

  在多道程序环境下,得到的目标起始地址通常是从0开始的,程序中的其它地址是相对于起始地址计算的。

  可重定位装入方式,根据内存的当前情况,将装入模块装入到内存的适当位置。

  采用可重定位装入,装入模块中的所有逻辑地址和实际装入内存的物理地址不同。

  可重定位装入可将转入模块装入到内存中任何允许的位置,可用于多道程序环境,但不允许程序运行时在内存中移动位置。

2.1.3、动态运行时装入

  程序运行过程中,它在内存的位置可能要改变,这也就意味着它的物理位置发生了变化,必须对程序和数据的绝对地址进行修改后才能运行,此时采用动态运行时装入方式。

  动态运行时的装入程序把装入模块装入内存后,并不立即把装入模块中的相对地址转换为绝对地址,而是把这中地址转换推迟到程序真正要执行时才进行,因此装入内存后的所有地址仍是相对地址。

2.2、程序的链接

  源程序经过编译得到一组目标模块,利用链接程序形成装入模块。

  链接的方式有三种,分别是静态链接、装入时动态链接、运行时动态链接。

2.2.1、静态链接

  静态链接是实现进行链接的方式。

  在程序运行前,将各目标模块及所需库函数,链接成一个完整的装配模块,以后不再拆开。

  静态链接:1、对相对地址进行修改;2、变换外部调用符号。

2.2.2、装入时动态链接

  编译后的一组目标模块,在装入内存时,边装入边链接。

2.2.3、运行时动态链接

  编译后的一组目标模块,程序执行中需要用到哪个目标模块,才对哪个目标模块进行链接。

  某些模块的链接推迟到程序执行时才进行链接,在执行过程中,发现一个被调用的模块尚未装入内存,立即由OS去检索该模块并装入内存,把它连接到调用者模块上。