【知识强化】第三章 存储系统 3.7 虚拟存储器

下面我们进入这一章的最后一节,虚拟存储器的内容。

那么我们来看一下,之前我们已经讲过了,就是我们的双口的RAM和我们的多模块存储器是为了提高我们的存储器的工作速度的,

 

 

而我们的高速缓冲器也就是我们上一节的内容就是Cache,它是为了提高我们的存储系统的工作速度的。

 

 

那么我们的虚拟存储器是用来干什么的呢?它是为了提高我们的存储系统的容量的。那么我们这一节的重点在两个,一个呢是地址的转换,一个呢是虚拟存储器的访问过程。这两个是一个重点,其他的我们稍作了解即可,并且大多数的内容呢将在我们的操作系统这门课程当中进行详细的讲述。而在我们的计算机组成原理当中只需要掌握这两个地址转换和虚拟存储器的访问过程即可。

 

 

那我们之前已经讲过了这个Cache和主存的这样一个层次。它是为了什么呢?它是为了提高我们CPU的访存速度的。因为我们的CPU和主存它的速度是不匹配的,那么为了进行匹配,我们在CPU和主存当中就加入了一级叫做Cache的,也就是高速缓冲存储器这样的内容。

它呢是由硬件直接实现的,对操作系统而言它是透明的。什么叫透明?透明就是说,我们操作系统是看不见的。所以呢,我们的硬件是直接来实现的。

 

 

那么虚拟存储器是用来干什么的呢?它是为了提高我们的容量的。我们之前已经讲过,就是说我们的存储系统,它有两个瓶颈,一个是速度一个是容量。而之前的两个,比如像我们的双端口RAM和我们的多模块RAM以及我们的Cache都是为了提高我们的访存速度的。而我们的虚拟存储器就是为了提高我们的容量的。那是用它是怎么来实现的呢?我们来看一下。一般而言我们的Cache是2M,我们的主存呢,是4GB。

然后我们的辅存,比如像我们的光盘啊机械硬盘和固态硬盘,它们的容量能够达到256GB以及1TB。

 

 

而2M它呢地址空间就是21位,而4GB它就是32位。但是如果辅存它也按照这样的方式来编址的话,它将达到38位和40位。而一般而言我们的辅存它不是按照字节来编址的。

 

 

比如像我们的磁盘而言,它是按照磁盘号+盘面号+磁道号(柱面号)+扇区号这样的地址来进行我们的编址的。这样的话,就带来一个编址的不统一的问题。那么怎么办呢?我们就把主存和我们联机工作的一个辅存共同把它形成一个叫虚拟存储器的一个逻辑模型。

 

 

那我们之前已经讲过了,我们的CPU啊Cache和主存,构成了叫做主机的这样的形式。

 

 

而主机和我们的辅存,由I/O总线来进行交互的。那么我们的主存,和我们的联机工作的辅存,我们把它共同构成一个叫做虚拟存储器的东西。

那么虚拟存储器呢,它是一个逻辑模型。什么叫逻辑模型呢?就是说,我们在数据结构当中就应该讲过这样的东西。比如说我们只关注它有什么样的功能,而不关注它是如何实现的,所以它是一个逻辑模型。也就是说,我们的虚拟存储器啊,也就是说由主存和辅存共同构成的这样的东西,它们两者呢在硬件以及在系统软件的共同管理下工作。对于我们的程序员来说,它是透明的。透明我们刚才已经讲过了,就是好像是看不见的。那么我们的虚拟存储器呢,这样而言,它具有的就是主存的速度以及具有辅存的容量。它的速度和容量都是很大的,都是很好的,也就提高了我们整个存储系统的性价比。那么它是用来干什么的呢?

 

 

虚拟存储器就把我们的主存和我们的辅存空间,统一编址,形成一个庞大的地址空间。那么在这个空间里面,我们的用户就可以自由编程,不必要在乎它实际的一个主存的容量,或者呢程序在主存当中实际的摆放的一个位置。所以呢我们用户给出一个地址,那么这个地址呢就叫做虚地址或者叫做逻辑地址。那么虚拟存储器呢就给出我们地址所对应的一个真实的数据,所以我们用户编程所涉及的地址呢我们把它称为虚地址或者叫做逻辑地址。那么我们虚地址所对应的一个存储空间呢就把它叫做虚拟空间或者叫做程序空间。而实际上我们的主存单元这样的地址呢把它叫做实地址,或者叫做物理地址。那我们的实地址所对应的空间呢就是我们的主存的地址空间,或者呢也称为实地址空间。而我们的虚拟的地址呢,虚地址,要比实地址要大的多,啊是这样的。

那么CPU在使用我们的虚地址的时候,就必须通过我们的辅助硬件来找出我们的虚地址和实地址之间的一个对应关系。那么我们的辅助硬件就将虚地址映射到我们主存当中的某一个单元,那么这样的主存的某一个单元呢就称为实地址或者物理地址。那我们之前讲过,Cache和主存之间进行数据交互,它的基本的单位是以块为单位的。那么我们的虚存,又是以什么为单位的呢?

 

 

那么通过我们的单位的不同,我们就将虚存划分为三种。第一种呢是以页为单位的,这样的存储器我们把它叫做页式虚拟存储器。啊我们的页式虚拟存储器它的虚拟空间和主存空间被划分同样大小的一个页,啊这样的一个基本单位叫做页。主存的页称为实页,而虚存的页称为虚页。而我们的虚拟地址就划为两个字段,一个呢叫做虚页号,一个呢叫做页内地址。页内地址就相当于我们之前块内地址那个概念,而虚页号就相当于,之前我们在讲Cache叫做主存字块标记的这样的东西,那么就相当于我们这里的虚页号。

 

 

而我们主存当中的这样的地址呢,就是页内地址和实页号。

 

 

页内地址是一一对应的,就相当于我们主存和Cache当中的块内地址是一一对应的。我们的页内地址,在这里我们的页内地址也是一一对应,也是相同的。

 

 

而我们的虚地址到实地址之间的变换呢,是由我们的页表来完成的。那么什么是页表呢?页表,它是存放在主存当中的。它呢是一个虚页号和实页号的一个对照表。它是一个对照表,它是放在主存当中的。它呢记录虚页调入主存时被安排在主存当中的位置,所以呢这是一个叫做页表的东西。

那么如何进行一个地址的转换呢?有一个硬件叫做页表基址寄存器,它就存放了我们页表的起始地址。

 

 

把它和我们的虚页号进行一个拼接,拼接成一个什么东西呢?就叫做页表项地址。那么什么叫页表项呢?页表项,它记录的是某一个虚页,对应的虚页号、实页号,和我们的装入位这样的信息。那么什么叫做装入位呢?我们在页表当中已经给大家标记出来了。

 

 

如果我们的装入位是1,就说明我们这样的页面已经在主存当中,由页表项地址就可以找到我们的页表项,然后进行一个拼接,就可以得到我们完整的实地址。那么如果装入位是0的话,说明我们的页面不在主存当中。这时候呢就要启动我们的I/O系统,把我们的这一页从辅存当中调入主存当中,然后才可以使CPU来使用。那么这就是我们整个虚拟存储器的一个地址变化。那么由这样一个转换过程我们就可以知道,我们CPU在访存的时候,首先我们要查页表,所以我们就要访问一次主存,因为我们的页表就保持在主存当中的。而不命中的时候就要进行一个页面替换和页表修改,那么这样的叫做一个页式虚拟存储器。它的优点是怎样的呢?它的长度是固定的,并且页表也比较简单,调入也比较方便。缺点是什么呢?缺点是由于我们的程序不可能正好是页面的一个整数倍,所以最后一页,最后一页它的零头是无法使用的,所以造成一些浪费。并且这样的页,不是逻辑上独立的一个实体,所以处理、保护和共享都不是很方便的。

 

 

那么第二个我们要介绍的呢,是段式虚拟存储器。啊这个简单了解一下就行了,段式虚拟存储器呢,显然它的基本单位就是段。段是按照我们程序的逻辑结构来划分的,所以我们的段它的长度呢不是固定的,它是根据程序而划分的。那么我们的虚拟地址就分为两部分,一个呢叫做段号,一个呢叫做段内地址。和我们的页式虚拟存储器都是差不多,都是段号和段内地址。那么我们的虚拟地址,到实际地址之间的变换呢就是由我们的段表来实现的。那么段表是什么呢?段表,它是程序的逻辑段,以及它在主存当中存放的位置这样的一个对照表,和我们的页表其实差不多的。那么段表的每一行,记录了某一个段对应的一个段号,装入位,段起点和段长这样的信息。因为我们刚才讲过了,这个段是根据我们程序的逻辑结构来划分的,所以我们的段长是可变的,所以我们段表中就要给出我们各段的起始位置和我们段的长度。那么CPU进行访问的时候呢,就要根据我们的段号,和我们段表的起始地址拼接而成。拼接呢就成为我们对应的一个段表行,然后再根据我们段表行的装入位,来判断我们这一段是否已经在主存当中,这和页表当中的装入位其实是一样的功能。如果装入位是1的话,表示我们这一段已经在主存当中。如果是0的话,表示这一段不在主存当中。那么调入主存当中的时候呢,我们先从段表中读出我们这一段当中的起始地址,然后呢和我们的段内地址进行一个相加,啊是相加。然后我们的段内地址就相当于是一个偏移量,所以我们进行一个相加。相加之后就得到了我们主存的实地址。根据实地址,我们再进行一个访问。那么段式虚拟存储器它的优点是什么呢?它的段的分解和我们程序的自然分解是相对应的,所以就有一个逻辑独立性,那么它就易于编译、易于管理、易于修改和保护,也便于我们多道程序的一个共享。每一段都是一个逻辑独立的实体,方便处理、分享和保护。那么缺点很显然,就是说我们的段的长度是可变的,所以呢,分配空间的时候是不太方便的,因为长度是可变的,所以呢它就可能会留下一些碎片,也就会造成了一些浪费。

那么第三种虚拟存储器呢叫做段页式虚拟存储器。这个呢大家还是了解一下就可以了。它是按照程序把我们的程序按照一个逻辑结构进行分段,每一段再划分为固定大小的页。先分段再分页,然后主存空间也划分为大小相等的页。程序呢对我们的主存的调入调出,以页为基本的一个传送单位,所以这样的一个虚拟存储器就被称为段页式虚拟存储器。在段页式虚拟存储器当中每个程序对应一个段表,那么每个段呢再对应一个页表。那么段的长度必须是页的长度的整数倍。那么段的起点也必须是一个某一页的起点,所以我们的虚拟地址就划分为段号再加段内的页号再加一个页内的地址这三部分。那么CPU进行访问的时候,首先根据段号得到我们的段表地址,然后再从段表当中取出我们该页的一个起始地址,然后呢再和我们虚拟地址的段内页号进行合成,得到我们的页表地址。最后呢再从页表当中取出我们的实页号再和页内地址拼接形成我们的主存的实地址。那么它就兼顾了我们的页式和段式的同样的优点。那么缺点就是说我们需要进行两次查表,段表和页表,这样的系统开销是挺大。那么我们重点还是掌握我们的页式虚拟存储器,那么段式虚拟存储器和段页式虚拟存储器呢这样呢我们在操作系统当中还要再进行详解,在这里我们只要进行一个了解就可以了。

 

 

那么下面有一个叫做快表的东西。因为我们这一些什么段表啊页表啊,都是存放在主存当中的。所以呢我们收到虚拟地址的时候,先要访问主存,然后再查询我们的页表段表,进行一个虚实地址的转换。那么因为它存放在主存当中,所以我们要去进行一个访存,也就比较慢。所以我们就把这样的表称为慢表。

 

如果要提高这样的虚拟地址和实地址之间的一个变换的速度,所以呢我们就可以用高速缓冲存储器来存放我们常用的一些页表项,那么这样的一个页表就称为快表。也就是说我们根据程序执行的局部性原理,在一段时间内总是要访问某一些页的时候,我们就把这些页对应的页表项存放在我们的高速缓冲存储器当中。那么这样的表就称为快表。那么这样就可以明显地提高我们的效率。我们要知道因为它是存放在Cache当中的,所以我们的快表是慢表的一个副本,也就是说我们的快表只保存了慢表当中很少的一部分。

 

 

那么下面我们就来看一下这样的一个访存过程。

 

 

我们把访存过程分为两部分,前面一部分呢叫做虚实地址转换,后面一部分呢叫做存储数据。存储数据呢之前我们在讲Cache的时候已经讲的很详细了,我们这里啊主要来看一下就是我们的虚实地址转换。我们之前提到过,快表只是我们慢表的一个副本,而Cache呢是主存的一个副本,这个已经不需要再多说了,我们之前已经讲的很详细了。那么我们得到一个逻辑地址的时候,那么由于我们的快表,它是我们慢表的副本,所以我们就优先等待我们快表返回过来的信息。注意这时候不是说去访问我们的快表,是说等待它返回过来的一个信息。如果它命中的话,我们直接到Cache当中去进行一个访问。如果没有命中的话,我们等待慢表当中返回的信息,然后再进行一个访问。如果这时候慢表当中也没有命中,就说明我们这时候我们的页表啊它不在我们的主存当中。这时候就要进行一个页面的调度,来更新我们的快表和慢表,那么这就是我们访问的一个整个的过程。

 

 

下面我们来看一道例题。某一个计算机主存的地址空间大小为256MB,它是按照字节编址。我们的虚拟地址空间呢是4个GB,采用页式存储来管理。页面的大小呢是4KB,然后快表采用的是全相联映射,有4个表项。那么这个表格当中的标记和页框号呢,标记是虚页号,而页框号代表的是实页号,这个大家要做一个注意。首先我们来看一下,我们的主存地址空间,

 

 

posted on 2019-09-10 16:38  绿茵好莱坞  阅读(690)  评论(0编辑  收藏  举报

导航