一,多级存储器结构
对计算机而言,存储层次至少拥有三级:最高层为CPU寄存器、中间层是主存(内存)、最底层是辅存(硬盘)。
1,主存储器
主存储器(简称内存)是计算机系统的一个重要的部件,用于保存进程运行时的程序和数据。CPU只能从主存储器中取得指令和数据,由于主存储器的访问速度远低于CPU执行指令的速度,为缓和这一矛盾,在计算机系统中引入了寄存器和高速缓存。
2,寄存器
寄存器的访问速度很快,完全能与CPU协调工作,但是价格比较的昂贵,因此容量不能做的很大。
二,程序的装入和链接
在多任务操作系统中,要使程序运行,必须先为之创建进程。而创建进程的第一件事,就是把程序和数据装入内存。如何将一个应用程序变为可在内存中执行的进程,需要经过下面几个步骤:
(1),编译:首先编译器将程序源代码编译成若干个目标模块。
(2),链接:由连接器把目标模块与使用的函数库链接起来,形成一个完整的装入模块。
(3),装入:由装入程序将装入模块装入内存。
三,连续分配方式
为程序分配一块连续的内存空间,这是一种最简单的存储管理方式,但只能用于单任务、单用户的操作系统中。使用这方内存分配方式可能会产生很多内存"碎片"。
四,分页存储管理方式
连续分配方式会产生很多的碎片,虽然可以通过紧凑的方式,可以将碎片拼接成可以可用的大块空间,要付出很大的开销。如果允许将进程直接装入到许多不相邻的分区中,则无需再进行紧凑。基于这一思想便产生了离散分配方式,如果离散分配方式的基本单位是页,则成为分页存储管理方式;如果离散分配的基本的单位是段,则成为分段存储管理方式。
1,页面和物理块
分页存储管理是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面,并加以编号。相应地,把内存空间分成与页面大小相等的若干个存储块,也同样为他们加以编号。在为进程分配内存时,以块为单位将进程中的若干个页分别装入到多个可以不邻接的物理块中。
2,页表
分页存储管理方式,允许将进程的各个页离散的存储到内存的不同物理块中,但系统应保证进程运行时,能在内存中找到每个页面所对应的物理块。为此,系统为每个进程创建了一个页表,其中记录了相应页在内存中对应的物理块号。
五,分段存储管理方式
1,分段
在分段存储管理方式中,进程的逻辑地址空间被分成若干个段,每个段都是从0开始编号,并采用一段连续的内存空间,段的长度由相应的逻辑信息的长度决定,因而各段长度不等。
2,段表
在分段存储管理系统中,为每一个分段分配一个连续的内存空间,而进程的各个段可以离散地移入到内存中不同的分区中。为了找到每个逻辑段对应的物理位置,系统为每个进程创建一个段表。每个段在表中占用一个表项,其中记录了该段在内存中的起始位置和段的长度。段表主要用于从逻辑段到物理段的映射。
六,分段与分页的主要区别
(1),页是信息的物理单位,分页是为了实现离散分配方式,为了减少内存碎片,提高内存的利用率。分页是系统管理内存的需要而不是用户的需要。段是信息的逻辑单位(例如:某个函数),分段的目的是为了更好的满足用户编程的需要。
(2),页的大小固定且由系统决定,段的长度不固定取决于用户所编写的程序。
七,虚拟存储器
1,为什么要引入虚拟存储器?
前面介绍的几种存储管理方式有一个共同的特点,即他们都要求将一个作业全部装入内存之后才能运行,但是会经常出现下面这两种情况
(1),有的作业很大,其要求的内存超出了内存的容量,作业不能全部装入内存。
(2),有大量的作业需要运行,但内存容量不足以支持同时运行这么多的作业,只能将少数的作业放到内存中运行,把大量的作业放到外存上等待。
出现上面两种情况的根本原因是内存的容量不足,但是又不能无限制的扩大内存的容量。我们可以从逻辑上扩大内存的容量,这正是虚拟存储技术要解决的主要问题。
2,局部性原理
程序在执行时呈现出局部性的规律,即在一短的时间内,程序的执行具有时间局部性与空间局部性
时间局部性:如果程序的某条指令被执行,则不久以后该指令可能被再次执行。
空间局部性:如果程序访问了某个内存单元,则不久后其附近的内存单元也将被访问。
3,虚拟存储器
基于局部性原理,程序在运行之前,没有必要全部装入内存,仅需要将当前那些需要运行的页面装入内存即可,其余的部分先放到外存上。在程序运行时,如果所需要的页没有在内存中,此时程序使用OS提供的请求调页功能,将它们调入内存,以便程序能继续执行下去。如果此时内存已满,无法再装入新的页,则要使用OS提供的置换功能,将内存中暂时用不到的页放到外存上,腾出足够的内存空间,再将要访问的页调入内存中,让程序继续执行下去。从用户的角度来看,该系统所拥有的内存容量比实际的内存容量大的多,但是用户看到的大容量只是一种感觉,是虚的,因此把这样的存储器称为虚拟存储器。所谓虚拟存储器,是指具有请求调入功能和置换功能,能从逻辑上对内存进行扩充的一种存储器系统。
八,页面置换算法
内存中的进程在运行的过程中,如果其所需要的页面不在内存中,需要将其所需页面调入内存,但是此时内存已满,为了保证进程能继续执行,系统必须把内存中暂时不用的也调到外存上。但应将哪个页面调出,要根据一定的算法来确定,这个算法就叫做页面置换算法。置换算法的好坏将直接影响系统的性能。下面是一些常见的页面置换算法
1,最佳置换算法
其选择的要被淘汰的页面是以后永远不会用到,或许是在很长的一段时间内都不会用到的页面。
优点:可以保证最低的缺页率。
缺点:人们无法预知进程的哪一个页面是未来最长时间内不会被访问的。
2,先进先出(FIFO)页面置换算法
这是最早出现的页面置换算法,该算法总是淘汰最先进入内存的页面。
优点:实现简单。
缺点:该算法与进程实际运行的规律不相适应,页面调入的先后顺序不能代表页面的使用情况。例如:进程中的某些页面需要被经常访问,包含全局变量、常用函数的页面,FIFO算法并不能保证这些页面不被淘汰。
3,最近最久未使用(LRU)置换算法
FIFO算法的性能之所以差,是因为它所依据的条件是各个页面调入内存的时间,而页面调入的先后顺序并不能反映页面的使用情况。LRU算法是根据页面调入内存后的使用情况来进行决策的。由于无法预知页面的将来使用情况,只能利用"最近的过去"作为"最近的将来"的近似。