本文主要参考《计算机操作系统(第四版)》(西安电子科技大学出版社)以及清华大学操作系统公开课(向勇、陈渝),整理操作系统的基本概念,供自己复习查阅。
存储器
存储器是计算机系统的重要组成部分,尽管其容量一直在扩大,但还是难以满足现代软件的需要。只有存储器得到有效的管理,才能保证系统的性能。计算机的指令几乎每条都涉及对存储器的访问,这也就要求对存储器的访问速度要跟上处理机的运行速度。同时,对存储器的一般要求是容量大、价格便宜。但显然,这三个条件是很难同时满足的,现代操作系统的应对方法是:采用多层结构的存储器系统,对应地,这也就要求操作系统配备有对应的存储器管理策略。
多层结构
通用计算机的存储层次至少应该有三级:CPU寄存器、主存、辅存。在存储层次中,越靠近CPU层次越高,存储介质访问速度越快,价格也越高,同时容量也越少。CPU寄存器是直接和处理机打交道的,是最高层的存储器。其中,寄存器和主存归操作系统管理,断电不可工作;而辅存是设备管理的管辖范畴。
寄存器和主存储器又被称为可执行存储器,进程可以在很少的时钟周期内使用load
或store
指令对其中的内容进行访问。但对辅存的访问则需要通过I/O设备实现,访问中会涉及到中断、设备驱动和物理设备的运行等等,耗费的时间远高于访问可执行存储器。
主存储器
主存储器简称内存或主存,用于保存进程运行时的程序和数据。通常处理机都是从主存取指令和数据,取得的指令放入指令寄存器,数据则装入数据寄存器。
寄存器
主存的访问速度远低于CPU1的执行速度,故又引入了寄存器和高速缓存。其中,寄存器的速度和处理机相同,可以和CPU协调工作,但价格比较昂贵,故在计算机中的数量很少。
高速缓存
高速缓存(Cache)是介于寄存器和存储器之间的存储器,基于程序执行的时空局部性,主要用于备份主存中较常用的数据,以减少对主存的访问。高速缓存的容量远大于寄存器,而比内存小两至三个数量级,但其速度快于主存。有的计算机系统还会设置多级缓存。
磁盘缓存
磁盘的I/O速度远低于对主存的访问速度,故设置磁盘缓存,它可以暂时存放频繁使用的一部分磁盘数据和信息,减少对磁盘的访问次数。但与高速缓存不同的是,磁盘缓存并不实际存在,它利用主存的部分空间暂存磁盘数据。
程序的装入与链接
程序只有在装入内存后才能运行。程序变为可执行的进程通常需要经过如下步骤:
- 编译(Compile),由编译程序(Compiler)对源程序进行编译,形成若干个目标模块(Object Module);
- 链接(Link),由链接程序(Linker)把编译后的模块以及模块所需的库函数链接到一起,形成一个完整的装入模块(Load Module);
- 装入(Load),由装入程序(Loader)把装入模块装入内存。
装入
如果编译后只有一个目标模块且不依赖库函数,显然就无须链接,这时的目标模块即装入模块。为了更好地说明,故先介绍单目标模块的装入。
绝对装入方式
当计算机系统仅能运行单道程序时,很多时候都可以事先知道程序在内存中驻留的位置,此时可以采用绝对装入方式。编译程序会直接从事先知道的程序驻留地址处开始向上扩展;装入程序则直接按照装入模块的地址把程序和数据装入内存,装入后程序的逻辑地址(相对地址)与实际地址完全相同。
可重定位装入方式
在多道程序环境下,编译程序无法预知编译后的目标模块所处的内存位置。因此,编译形成的目标模块的起始地址通常是从0开始,在装入时,装入程序会把装入模块装入到内存合适的位置,即重定位地址。重定位即装入时对目标程序中指令和数据地址的修改过程。此时的地址变换在进程装入时一次完成,故又称为静态重定位。
动态运行时的装入方式
由于在运行过程中,程序和数据的地址经常会发生变化(如进程的换入换出),此时则不能采用静态重定位,而应把地址转换推迟到程序真正执行时才进行。在动态重定位装入方式中,装入地址均为逻辑地址,且为了不影响指令的执行速度,还需配置重定位寄存器以提供对运行时重定位的支持。
链接
根据链接时机的不同,可以把链接分为三类。
静态链接
在程序链接时即把目标模块以及它们所需的库函数链接成一个完整的装配模块的方式即静态链接。静态链接会在链接时修改相对地址(由于所有原程序的起始地址均为0,故除了第一个程序无须修改外,其余均需进行地址偏移),并变换所有的外部调用符号(即变换调用的相对地址)。
装入时动态链接
发生在装入时的链接称为装入时动态链接。即在装入一个模块时若发生一个外部调用,则装入程序会去找出相应的外部目标模块并将其装入内存,同时修改块内的相对地址。这个方式的优点是便于修改和更新(因为目标模块是分开存放的),便于实现对目标模块的共享(一个目标模块可以链接到几个应用模块上)。
运行时动态链接
有时我们并不知道程序运行时会运行哪些模块,在装入时动态链接方式中,只能把可能会用的模块提前装入,这显然是低效的。故将装入时动态链接法改进为运行时动态链接,即把链接推迟到程序执行时才进行。