第一节:存储器概述

存储器分类

补充,以书上为主,因为已经极度详细

存储器分类,可以按照多种方式分类,具体应以书上为准,此处作为补充说明

主存也称内存,凡是运行期间的程序、变量均需要先调入主存,是整个计算机系统重点

辅存可以分多种,一般有:光盘、磁盘、硬盘、U盘、磁带等类型

Cache是SRAM,主存是DRAM,DRAM往往因为引脚数量多需要复用引脚,而SRAM并不需要

RAM/ROM均是半导体存储器,这在后面主存一节第一句话就是如此,所以需要区分

两者之间最大的差别在于是否断电易失性,其他基本一致,均是随机存取

存储器性能指标

存取时间一般比较短、存取周期一般比较长,这里后面会和多体交叉存储器一起概述

主要在于多体交叉存储器的数量其实是既有上限又有下限的,而书上仅给出了下限而已

关于时间单位换算:

多层次存储系统

存储系统的容量主要看的是外存和ROM当中的内容,即非主存、Cache中的内容

因为主存、Cache中保存的均只是外存中的副本而已,主存和Cache间的调度是硬件完成

而主存和辅存间的数据调度主要由硬件和操作系统一起完成(虚存、虚页

这一句话被个人所忽略了两次,需要关心一下的,应用程序员、系统程序员可视与否


习题分析总结:

1:其实题目本身不重要,重要的是其提供的四个单词含义需要分别记忆清楚

2:存取时间是指完成一次读写操作的时间,存取周期是指两次读写操作的间隔时间

对存取周期、总线周期等一系列周期、字长的总结在文档内有

3:按XX编址、按XX寻址,一个存储单元的位数是XX,其实代表的都是一个含义

MDR位数、数据线位数、存储字长是可以不一样的

一般而言其均是一致性的,但也可以不一样,其实主要是涉及到一次还是多次访存

数据线位数和存储字长一样,那么一个总线周期就可以完成一次存取操作

如果数据线位数和存储字长不一样(其实这个倒没有什么固定的,就是不能大于字长

MDR的位数一般和数据线的宽度是一样的,记住这个结论即可

5:CPU能够直接访问的只有CPU内寄存器、Cache、主存

外存无法和CPU交互,主存可以和CPU内的MAR、MDR交互但不能和其他交互

因为其本质都是先和MDR交互再和PC、IC这些寄存器交互的,Cache一般集成在CPU中

6:时间单位,s/m/u/n/p

10:各个层级之间解决的问题,Cache和主存解决速度、主存和辅存解决存储容量

13:书上一模一样,有原句,纯粹是没有读到这句话,主存和Cache是硬件自动完成的

而主存和辅存之间是OS和硬件一起完成的(联系虚页表等

14:需要注意的是,RAM和ROM都是半导体存储器,名称带ROM的不一定是ROM

例如CD-ROM属于光存储器,就不能算作是ROM,虽然形式上确实符合ROM的所有性质

另外补充,支持随机存取的存储器不一定是RAM(随机存取存储器),例如Flash就是


第二节:主存储器

第一句话,半导体存储器分为ROM和RAM两种,所以所有的RAM和ROM均是半导体存储器

ROM和RAM最大的区别就在于是否断电易失性,随机存取、可读写基本一致,ROM写较慢

工作原理

SRAM是触发器构成、DRAM是电容、寄存器也是触发器构成的

DRAM的刷新时间和其组成无关,不论是按照何种方式刷新其均是对基本芯片行刷新

也就是内部芯片假如是32·32的,那么就刷新32行即可,王道P106为勘误点

集中刷新、异步刷新的名称具体代称需要清楚,其均是有死时间存在的

对于分散刷新则不存在死时间,其所谓的死时间其实就是一次存取周期的后半段

CPU是不清楚主存是否在刷新的,所以如果CPU访存碰到主存刷新,其一般只能等待

特殊情况可以和存储器并行工作,增加一个行缓冲即可(不重要

每一行刷新是一个读写周期,整个存储体刷新是一个存取周期,刷新周期是掉电时间

只读存储器

重点背单词和特性即可,具体看硬盘和闪存(即U盘基于的存储体给记住

主存构成

由于CPU寄存器的速度和主存速度有比较大的差别,所以一般都会设置读写缓冲区

MDR的位数必须要和数据总线的位数一样,而地址总线则不一定需要一样,可以有空闲

MDR的位数一般和机器字长、存储字等保持一致,方便基于精简指令集的流水线工作

DRAM需要引脚复用,而SRAM并不需要

多模块存储器

首先是二进制的高位是其前几位,低位是其后几位,一般情况而言是如此

高位交叉编址的情况下实际上仍然是顺序存储,因为存储依旧是集中在一个存储体内

所以读写也只是在一个存储体内进行,实际上四个存储器是不并行的

只有低位交叉编址才是并行可构成流水线的,同时其必须基于RISC精简指令集

每次存取指令、数据的存取次数均是一样的,否则流水线就不能正常工作

此外对轮流启动进行一个补充:其体数不能无限度增加

或者说如果你为了充分利用每个体而使得每次总线周期内都没有完成一个存取操作

那么就会导致数据根本读不出来或者说直接被覆盖而没法正常读数据

简单而言就是总线周期小于存储体的存取时间,就会导致根本没法正常存取

此外,补充多体并行中的轮流启动和同时启动方式,两种的考察会比较隐含,需要留意

电路信号输入顺序

先写入行信号,再写入列信号

需要在行选中信号前把行信号给输入到引脚,同样也需在列选中信号前把列信号给引脚

在行信号选入后,需要保持这个行选中信号直到使用以后为止

而列选择信号是在行选择信号之后再输入的,在列选择信号之前需要给定读写信号

在列选择信号也进入后,那么三个信号就齐全了:行、列、读写,就可以用了

中间会有一些延迟,目的是为了使得电路稳定以后再进行操作,不过基本不太可能考


1:SRAM不支持地址引脚的复用,只有DRAM,其实因为SRAM本就没几个引脚,不必复用

且一般而言也并不支持复用,需要特别注意下,一般DRAM支持复用,SRAM并不支持

2:数据线不能复用,地址线可以复用(你告诉我数据线怎么复用?

3:DRAM的刷新以行为单位,整个存储体的每一个芯片的每一行都会被同时进行刷新

每次刷新就类似于一次读操作,需要一个存取周期,其和读操作仅差了输出的一步而已

4:集中刷新、异步刷新都有死时间,只有分散刷新没有死时间

6:关于易失性与否,RAM是易失的,其他都是不易失的,RAM和ROM区别在于易失与否

7:书上一模一样具有原句,同样是忽略了书上的原句,没有注意看

实际上主板上的ROM也构成主存的一部分,其即为BIOS芯片,其存储引导程序

引导程序并不是引导操作系统装入的程序,而是引导装入引导操作系统程序的程序

然后由操作系统引导程序引导操作系统进入内存,中间省略一部分内容

这个引导程序存储在磁盘上,同样的,操作系统本身也存储在磁盘上面的

10:其实出题都比较严谨的,只谈论了地址引脚线加上数据引脚线一共有多少根

而根本没有去谈论整个芯片到底有多少根线,因为那样就需要加上控制线和片选线了

具体届时看出题人以何种方式出题

此外需要注意的是,一般这种情况默认以一个芯片的行、列数作地址线的位数

12:U盘是基于闪存的辅存、硬盘是基于SSD(其实也是基于闪存的存储器

13:具体不再赘述,主存的组成包括了主板上的一系列ROM,而不仅是RAM,可统一编址

15、16:一整个存储器的刷新需要一个存储周期(一次访存)

一行的刷新只需要一个读写周期,读写周期相对存储周期要来得小得多,需要记住

刷新周期是一行两次间隔的刷新时长,一般取2ns,刷新频率就是2ns/行数

22:其实关于多体存储器,个人的一些看法和观点思路

对于最少的存储体个数,这个是能够理解的,存储体越多,每个存储体能休息时间越长

可能就不再是一直的忙碌,中间有间隔的休息时间,总线周期内取一个字不变

但个人认为这个存储体的个数是不能一直增加的,因为存储体也需要时间进行存取操作

如果在一个总线周期内存储器都没有准备好数据或者说都没有传送完数据

然后又启动下一个,那么必然会导致总线占用的权限冲突,或者总线就得等他传完

他这里想表达的含义就是在已经正常流水的情况下,一个存取周期可以读出四个数据

表达的单纯就是这个意思而已,C选项是不成立的,不是每一个,而只有一个

29:不论存储芯片到底是以什么拓展方式组成存储器,其地址线均是对于一个芯片而言

除非题目刻意问到了片选线、控制线的内容,否则是不需要考虑的

片选信号可每一个二进制数选择一片,也可以按照每二进制数选一片,看是否要译码

32:不管是同时启动方式还是轮流启动方式,其数据均是存储在多个存储体之内

所以一个Double变量就可能需要多次轮流启动、多次同时启动才能取到

这个是比较容易忽略的细节,也是很容易忽略的题型,需要重点关注一下

34:对于书上内容的理解错误,书上写的是“位平面数”,个人理解为芯片的个数

而实际上含义无非就是按几位进行编制,每一个存储单元有多少位,仅此而已

而且这边也说了,是对应每一个芯片,其行缓冲区有多大,就是一行的大小

综合2:

其实个人对于第二题的答案并不认同,到底是基于一个存储器还是基于一个存储体

其实题目本身表达的是基于一个存储体而不是一个存储器,所以最终的解释未免牵强

对于一整个存储器而言,在充分流水的情况下,每个总线周期都能取到一个字

对于一个存储体而言,其只能在每个存取周期内取到一个字,其他时间是不会取得


第三节:主存与CPU的连接

三类拓展

位拓展是必须的,字拓展并不是必要的,因为CPU是允许一部分地址引脚空闲的

需要刻意说下各种拓展方式所对应的地址、数据存储方式

位拓展:

位拓展其每一组的几个芯片被共同编址,即多个芯片的同一地址空间重叠来存储数据

一个数据其前后不同位可能被分散到不同的芯片上,但片选而言他们属同一芯片内

例如一个Short型,其存储在4M·16位的存储器上,以4M·4位的芯片构成整个存储器

那么一个Short型数据虽然是存在一个地址上的,但实际数据分四段存储在不同芯片

这个虽然从未考过,但也是一个可以考察的方向,值得注意

字拓展:

其地址以高位编码区分,相当于高位作为片选,低位作为片内地址

数据存储除非其超过了一个片的存储范围,不然是不可能跑到别的芯片上面分块存的

在具体判断是哪片,建议以地址划分二进制为主

字位拓展:

目的一般是为在字拓展的基础上充分利用CPU地址(补充:MAR地址需覆盖整个主存

实际上就是在上述的基础上拓展了而已,其每个字的存储是分散到不同芯片的

然后具体又可以根据其高位地址编码来区分其属于第几组,可以用除法或者取高位地址

关于刷新策略:

刷新不受其芯片组成结构的影响,最终均是以每个最基本的组成芯片行为单位去刷新

片选

一般采用以值选取的方式,即增加一个译码器,而很少采用以位选取(增加一堆引脚

一般地址而言,CPU的低位地址用于片内地址,高位地址用于片选地址

一个存储器的编码地址一般按照其一个片选所对应的位数决定,也就是一个片几位

其编码就是按照几位来的,一个片32位那么编码自然也按照32位来编地址


习题总结分析:

首先确定一件事,存储器的16MB其实隐含了存储器为16M·8位的类型,一般均为此类

题目中具体提及不同的存储器类型,例如16M·16位,256M·32位

其隐含含义就是编码以16位或者32位为基准,地址空间为16M和256M,需要注意

7:根据上面所说,需要先进行位拓展,再进行字拓展,以一个字节作为其编址方式

而不是以其内部芯片的4位做编址方式的,是按照其内部一个“片”来编址

此外,计算可以得到其地址位总共14位而没有16位,也就是其高位是空余出来的

而不能默认是全部填满的,地址位不一定会是填满的

9:需要特意注意的就是存储地址,从零开始,0、1、2、3就有四个存储范围

10:16位是其编码方式,一个存储单元的大小,而不是其地址位数,需要先确定这点

然后其地址空间为32K,即15位,加上其高位三位片选一共18位自然得到结果

此外需要清楚的是,18位并不构成解释方法,要解释一个进制数是从低位开始解释

然后高位补零来进行解释的,自然就是B选项

13:首先位拓展为2K·8位(个人这里写作了4K·8位故算错

然后得到组号即可,这仅仅是位拓展,不需要考虑芯片到底是哪个的问题

因为同一组的芯片都是被统一编址的,只有字、字位拓展的情况下需要考虑芯片是哪个

考虑数据装载的时候则均需要考虑

14:经典的错误,MAR的地址范围需要覆盖主存的所有地址,而不能仅仅只覆盖一部分

并且主存的地址空间永远是大于零的,地址不能为负数

综合1:

存储字长一般和一个存储单元长度一致,但具体要看存储体的组成是如何的

这里单独强调了存储字长长度,那么就是在说MDR的位数,每次只能取一个地址的数据

除非采用多体,否则就需要多次存取才能拿到一个存储字

综合3:

勘误,刷新方式和存储体本身的构造无关,只和构成存储体的最基本芯片行数有关


第四节:外存

外存相应的内容在OS最后一节也有相应内容,建议配合观阅、形成知识体系

计组更加偏硬件一些,OS内的内容更多涉及到怎么去使用磁盘,更加偏向于软件层面

磁盘存储器的结构

扇区数:目前磁盘存储能力基本已经不再受限制,对应OS有内容

磁盘高速缓存并不是一个单独的部件,而是在内存中开辟一块特殊的区域,需要注意

按簇写盘,往往见于文件系统内,此外,盘块一般说的就是基本读写单位:扇区

磁盘存取时间

在操作系统中的描述更为详细,平均寻道时间是可以被算法优化的

减少传输延迟的方法就是在不同的盘面上进行错位标号,其基于磁盘的存储方式

自上而下,自内向外,以柱面的方式存储,磁盘每次读写只能是一个区域

注:其余内容建议看书,已经较为完善,这里用作一个补充说明、强调重点的作用罢了

RAID

核心目的是为了并行读取数据、增加容错率、增加可靠性

基本就是对应不同的存储冗余备份策略,海明码4:3存储冗余比,镜像1:1

固态硬盘

闪存的内部结构首先是基于块的,然后再是基于页的,块作为写单位,页作为读单位

动态、静态磨损均衡只是一个在写的时候选择,一个不写也在选择均衡


习题总结分析:

首先需要明确磁盘的时间计算,必须按照公式:传输时间+寻址时间+旋转延迟时间

中间但凡漏了一个就可能会带来很多麻烦,建议严格写下步骤

1:关于磁盘利用率,定位到操作系统P228页,多少还是有一些坑在的

2:磁盘最小的读写单位均是块,在文件系统中文件的存储是以簇为单位

4:存取时间分为多块内容,加快旋转速度仅仅是一部分而已

5:固态硬盘的擦除是以块为单位的,并且块>页,这一个关系需要理清楚

6:SSD硬盘和U盘均基于闪存,其写较慢、读较快,是一类型ROM

9、11:均是没有按公式计算的结果


第五节:Cache高速缓存(计算、综合题为主

局部性原理

局部性原理其实可以这样简单概述:时间局部性就是一段时间内重复访问

空间局部性就是一段时间内访问一堆相互邻接的物理单元

CPU给出一个地址,不管Cache到底缺失与否,都是需要去访问一次Cache的,不会变

Cache性能分析中,额外需要注意的就是文字游戏:性能提高到/了几倍

主存地址解释方法

首先明确三个不同映射方式的主存地址解释方法:

直接映射:标记位+Cache块号+块内地址

标记位的计算由每一Cache行所要承接的主存块数决定,每块对应主存多少块定多少位

全相联映射:标记+块内地址

标记位的计算,除了块内地址就是标记位了,其和Cache多少行怎么样都是无关的

只和块大小有关系

N路组映射:标记位+组号+块内地址

标记位计算由总地址数-块内地址数-组号得,组号由Cache决定,块内地址由块大小定

刻意留意比较器数量,全相联每行一个/直接映射只有一个/组相联每组N个

Cache总容量计算

先明确各类情况下Cache的标记位均是如此:

有效位+替换位+脏位+标记位(和各类映射方式有关),并且需要特别注意直接映射

当直接映射的时候不需要考虑替换,所以是没有替换位存在的

当全写法的时候,不需要考虑脏位,因为只有写回法会存在脏位这个概念

数据位对每一块而言,均是块大小的位数,即64B,那么就是64·8位

然后这样分别就算出来了一行Cache所对应的数据位、标记位的各自所占位数大小

然后还要乘上对应的Cache块号,这样才能得到Cache的总容量

概念性问题:三种映射方式

在有Cache的计算机内,CPU给出一个地址首先会被解释为Cache地址去访问

然后再解释为主存地址去访问主存本身(当没有命中的时候,这个地址本身是不变的

直接映射的方式就是主存块号%Cache块数得到块号,注意这里是取余

直接映射一共只需要一个比较器即可

全相联映射的情况下,不仅仅是映射方式是全部位置都可以任意放,更用全相联存储器

按照内容进行寻址,每个行都需要一个比较器

组相联则是组间用的直接寻址,取余,组内用的全相联,一组N个比较器

N路组的含义是,每组N个,而不是分为N个组

当N=1的时候就变为全相联,当N=n的时候就变成了直接映射,不能搞混这一点

主存地址的运算方法:

给定十进制、二进制均需要能够计算,按照最为方便的方法去计算

当下默认二进制较为方便,因而不考虑用十进制,除非题设条件产生一定改变

一致性问题:(涉及到一个书上没有提到的点)

全写+写分配、全写+非写分配、回写+写分配、回写+非写分配

写分配法搭配全写法的时候:

当没有命中的情况下,先修改主存内的内容,然后再把这个内容扔到Cache里面

当命中的情况下,则同时修改主存内和Cache内的信息,替换时直接覆盖不需要写回

写分配法搭配写回法的情况下:

当没有命中的情况下,先把主存内的东西扔到Cache里面,然后在Cache里面修改

当写命中的情况下,先在Cache里面改,而不改主存对应块内容

只有当块被替换出去的时候,才一次性把块中的内容更新到主存上面,一次性全部更新

非写分配法搭配:

如果不命中的情况,那么只更新/修改/写主存单元,不会调入Cache中

如果命中,回写法,那么就会只对Cache内数据进行修改/写/更新

如果命中,全写法,那么会同时对Cache、主存内的数据进行更新操作

附议:

其实为什么写分配和写回、全写会有不同的组合结果?

本质是为了保证两个目标:对主存内容的实时准确性的要求、尽可能少访问主存的要求

至少这个是王道书上没有提到的内容

关于替换位:

只有全相联、组相联的情况下需要考虑替换位,直接映射是不需要考虑替换位的

全相联映射的替换位和Cache的行号一共有多少个有关

组相联的情况下和Cache每组有多少个有关,以此作为替换位的位数,至于策略本身么

除非是随机替换,否则均是需要考虑这种位的,不论是FIFO还是LRU本身

替换算法:

目的是为了解决主存访问后需要把其内容放入Cache但Cache已经满的问题

替换算法只会在全相联、组相联两个里面使用

最不经常使用算法,理解为记录这个Cache块被访问了多少次,替换最少访问次的

这里如果产生了相同的使用频率最低块,那么可以采用FIFO或者行号递增等策略去选择

例如相同的0、0两个使用频率块,淘汰谁?

近期最少使用算法,理解为每一个Cache块的计数为“已几个周期没有使用”

每次自然替换的是计数值最大的

抖动的含义,以“1/2/3/4/5/1/2/3/4/5…序列访问,会反复刷新掉频繁使用的块,本质原因是Cache块太少了

补充:

读不命中、写不命中均有可能会产生替换

读不命中一定会把主存的内容写到Cache里面,所以读不命中一定有替换(满的时候

但写不一定,只有写分配法会把主存内容写到Cache中可能替换,非写分配法不会替换


习题总结分析:

1:计算机系统的容量在一开始其实就已经固定了,除了一些寄存器以外就是外存大小

不论是主存还是Cache均只是数据的副本而已

5:安全性、实时性、准确性要求高的场合建议用全写法,访问密集型减少访存次数的

那么就采用写回法来得好

6:数组有的是空间局部性而不是时间上的局部性,这一点需要区分

9:增加主存块、Cache块大小的情况下,利用空间局部性可以优化Cache的命中率

11:只有真正对主存去进行访问,这个才能算得上是Cache没命中,主存没访问到就完

就得从外存里面调数据进来了,这样的代价是很高的


虚拟存储系统(部分配合OS一起复习:

首先给出虚存体系的基本运行、以及在虚存体系下的Cache运行流程:

CPU给出虚存地址

  • 分解虚存地址
    • 虚页号
    • 页内地址
  • 地址越界检查
    • 判断页号是否溢出
  • 访问TLB(快表)
    • TLB命中
      • 取得实页号并拼合为实地址
    • TLB不命中
      • 访问页表(慢表)
        • 页表有效
          • 取得实页号并拼合为实地址
          • 更新TLB
            • TLB已满
              • 选择一页淘汰并添加新页
            • TLB未满
              • 直接插入新页
        • 页表无效
          • 缺页中断
            • 内存未满
              • 从磁盘读入页到内存
              • 更新慢表
              • 更新TLB
                • TLB已满
                  • 淘汰一页并替换
                • TLB未满
                  • 直接插入新页
              • CPU重新访问TLB并命中,取得实页号并拼合为实地址
            • 内存已满
              • 选择替换页
              • 检查替换页是否脏页
                • 是脏页
                  • 写回磁盘
                • 不是脏页
                  • 直接覆盖
              • 更新慢表
              • 更新TLB
                • TLB已满
                  • 淘汰原有页并替换
                • TLB未满
                  • 插入新页并设置无效位
              • CPU重新访问TLB并命中,取得实页号并拼合为实地址

Cache在虚存下的运行体系:

这时候因为先前已经完成了缺页中断的处理,这里不可能访存失败,顶多Cache缺失

CPU给出实地址

  • 地址解释方式
    • 直接映射
      • 标志
      • Cache块号
      • 块内地址
    • 全相联映射
      • 标志
      • 块内地址
    • 组相联映射
      • 标志
      • Cache组号
      • 块内地址
    • 主存地址
      • 块号
      • 块内地址
  • Cache访问
    • Cache命中
      • 读命中
        • 直接从Cache中读取数据
      • 写命中
        • 全写法
          • 同时更新主存和Cache
        • 回写法
          • 只更新Cache
    • Cache未命中
      • 访问主存
        • 主存写命中
          • 写分配法
            • 全写法
              • 修改主存内容
              • 更新Cache
                • Cache满
                  • 选择一块替换
                • Cache不满
                  • 直接塞入
            • 回写法
              • 更新Cache
                • Cache满
                  • 替换时检查是否需要写回
                  • 选择一块替换
                • Cache不满
                  • 直接塞入
              • 在Cache中进行修改
          • 非写分配法
            • 只更新主存,不更新Cache
        • 主存读命中
          • 从主存中读取数据
          • 更新Cache
            • Cache满
              • 选择一块替换
            • Cache不满
              • 直接塞入

然后再来进行一些补充说明:

操作系统对应章节:内存管理

虚存只采用写回法、而Cache既可以写回又可以全写,本质在于速度的差异

页式

每个进程都具有一个页表,页表本身存储在内存中

每个进程又都有一个对应的页表基址寄存器

页式只有页内碎片,但平均的页内碎片只有半个页,是很小的

地址变换机构,对于页式而言只需要判断页号是否溢出即可,对于段式需要判断两个

段式需要判断段号、段内是否溢出,因为段式存储是二维的,均是可能溢出的

对于段页式,段号可能溢出,页号也可能溢出,但页内不可能溢出,以页作分配单位的

快表和Cache类似,均采用SRAM构成,不同之处在于一个存储的是数据,一个是页表项

多级页表:

在多级页表的情况下,可能需要多次进行磁盘的访问,多级页表本身页表项数量不变

变化的仅仅是将连续的页表项目分散到内存、外存多个分散区域存放而已

大小是不变的,相当于把一片镜子打碎放在了不同的地方,因为占连续空间不可接受的

缺失处理:

TLB缺失既可以软件也可以硬件处理,Cache缺失纯硬件处理

在慢表访问失败的情况下,直接就去调用缺页中断

然后缺页中断完再回来重新执行这句内部中断的语句,这一次访Cache是必然不命中的

但下一次的访存是一定命中的,因为已经完成了该缺页的调入

访问相应的数据块,只需要Cache更新相应的数据块即可,不需要更新整个页

段式

和页式差不多,无非是段式地址可变,变为了双重变量,段号+段内地址,双重可变

所以其地址转换机构也需要判断两次可能的溢出,段式会存在外部碎片,并且比较多的

至于其段可变长,其实是一个有争议的项目,因为书上、现实中都不太这样说

基于动态增长本身是可以变长的,但一般很少见,大部分段一旦产生基本就不会变长

至于具体会怎么个方式考察,依旧会有一些争议的存在

段页式

每个进程被分为逻辑上的多个段,每个段又被分为大小相等的页

即一个进程对应一个段表,每个段对应一个页表

在地址变换机构里面只需要存在一个段表基地址寄存器即可,不需要页表基地址

因为每个段就对应一个页表,可以在段表项内给出对应的页表基地址

判断溢出一方面需要判断段号,另外一方面需要判断对应段内的页号是否溢出,二维的

小结部分

多级页表本身其实是把一张连续的页表给分散到了外存中,而放弃用内存去存储页表

因为页表需要占用连续的地址空间,一旦页表项多,会导致内存利用率大幅降低

还不如放在外存里面,页表本身的大小和地址并没有改变,改变的仅仅是对地址的解释

例如原来十位均是页表的地址,现在分为五级页表,每一级两位即可


计组对应章节内容:虚拟存储器

在多道批程序的情况下,其实基地址寄存器一般和并行的进程个数一样就可以了

例如八个并行进程,八个基地址寄存器,方便CPU切换时间片的时候直接切换指向即可

而不需要去更新寄存器的内容,直接改变基地址寄存器的选择,然后选择对应进程

每个进行均具有一个页表,这个页表一般情况下都是长久保持在内存中的

除非是这个进程已经结束了或者说暂时被扔到外存了这种情况,或者是多级页表等等

存储机制:

页面在主存内是全相联存储,但这个仅仅含义是可以放在任何一块

而不是根据内容寻址,主存没有这个能力的,仅仅含义是可以放在主存的任意位置罢了

必须采用回写法,不能用全写,否则磁盘I/O就会大量拖累CPU的运行

页表有效位:

其实快表、慢表内均需要有效位,尤其是多道批程序下

快表的有效位其实为了增加效率所以不会考虑直接淘汰上一个进程的一些页表项

而是直接置无效,那么在本次就不会影响本次的时间片运行,下次又可以重复利用起来

否则每次切换进程均需要刷新一次快表,这个是没法接受的事情

段式:

段式适合共享的理由其实是这样,对于同一个64B大小的共享项目而言

页式可能需要分16页,也就是分为16个页表项,其他进程每次引用就要建立16个页表项

而对于段式而言,只需要逻辑上分为一个段,其他进程引用只需要建立一个段表项

其含义就是这样的,方便引用、共享、内存管理


操作系统:虚拟内存管理机制

重点掌握页式存储,其他可以没那么重要或者说可以缓一缓

缺页中断属于一种内部中断,其具体的流程如下:

CPU访问慢表未命中,从该句开始保留现场等处理中断过程,然后进行中断进程处理

中断处理完以后,CPU重新执行该语句,而不是跳到下一句语句去执行

这一次执行,Cache必然缺失,主存必然命中

Cache的块缺失和硬件补充和缺页中断没有任何关系,它是取到实地址后的访问

缺页中断的时候是不会把数据一并扔到Cache里面的,何况一个单位是页,一个是块

根本没办法统一,也根本不属于同一事件

页框分配和页面置换则是OS内的内容,暂时不考虑加入


真题选择分析(计组虚存内容:

14:命中问题,CPU给出虚拟地址后首先就会去访问TLB,访问TLB失效再去慢表

如果慢表同样失效则需要缺页中断调入,然后重新进行访问,再拼合为一个实地址

实地址首先肯定会访问Cache,这次访问一定是失效的,这个是书上没有具体细讲的点

不可能的情况是TLB命中是慢表没命中、慢表没命中但Cache命中

15:需要特意说下的就是TLB表内一般直接省略顺序号,只采用全相联或者组相联

16:访存问题,虚存体系下访存数量是要高于一般存储体系的,多级页表甚至需访外存

在快表命中的情况下直接根据页表项得到实页框号,不需要单独访存一次

快表没有命中则需要访问主存得到对应的页框号拼合为实地址

慢表也同样没有命中,则在缺页中断处理后重新访问TLB,这一次不会去访存

Cache采用直写法的时候一旦产生写命中就必须访存,采用回写法则不需要访存修改

如果写不命中,那么均是需要进行访存的,包括读不命中也一样需要访存,读命中不需

18:缺页中断以后是回归原指令执行的,这也是我说的缺页中断后重新访问TLB的由来

19:Cache和TLB很类似,均是SRAM,均采取替换策略,但Cache有写策略,TLB没有

TLB内数据和主存内慢表必然一致,但Cache就不能保证一定一致

TLB和Cache缺失均可由硬件解决,Cache必是硬件,TLB也接受软件,应用程序员不可视

20:取到虚地址后访问页表对应虚页项,如果有效位为一,那么自然就取到实页号

然后拼合为实际地址即可,一般页是大于Cache块的,页内不改变,或能取得Cache标记


综合题以真题为准,参考个人综合题笔记(置于单独笔记本中,有必要反复观阅

后续复习基本流程:

看一遍书、过一遍笔记、浏览王道非真题选择题、重点做错题和真题选择题、真题综合

有必要则对笔记进行补充和修补,可以结合冲刺考点精析PPT进行复习