【双口RAM和多模块存储器】
双端口存储器采用空间并行技术,能进行高速读/写操作。双端口存储器提供了两个相互独立的读写电路,可以对存储器中任意位置上的数据进行独立的存取操作。事实上双端口存储器也可以由DRAM构成。当两个端口的地址不相同时,在两个端口上进行读写操作,一定不会发生冲突。当两个端口同时存取存储器同一存储单元时,便发生冲突。总之,当两个端口均为开放状态且存取地址相同时,发生读写冲突。
一个由若干模块组成的主存储器是线性编址的,这些地址在各模块中的安排方式有两种:一种是顺序方式,一种是交叉方式。从定性分析,对连续字的成块传送,交叉方式的存储器可以实现多模块流水式并行存取,大大提高存储器的带宽,由于CPU的速度比主存快,假如能同时从主存取出n条指令,这必然会提高机器的运行速度。多模块交叉存储器是一种并行存储器结构。
【高速缓冲存储器(cache)】
cache是一种高速缓冲存储器,是为了解决CPU和主存之间速度不匹配而采用的一项重要技术。其原理基于程序运行中具有的空间局部性和时间局部性特征。cache能高速地向CPU提供指令和数据,从而加快了程序的执行速度。从功能上看,它是主存的缓冲存储器,由高速的SRAM组成。为追求高速,包括管理在内的全部功能由硬件实现,因而对程序员是透明的。当前随着半导体器件集成度的进一步提高,cache已放入到CPU中,其工作速度接近于CPU的速度,从而能组成两级以上的cache系统。cache除包含SRAM外,还要有控制逻辑。若cache在CPU芯片外,它的控制逻辑一般与主存控制逻辑合成在一起,成为主存/cache控制器;若cache在CPU内,则由CPU提供它的控制逻辑。CPU与cache之间的数据交换是以字为单位,而cache与主存之间的数据交换是以块为单位。一个块由若干字组成,是定长的。当CPU读取内存中一个字时,便发出此字的内存地址到cache和主存。此时cache控制逻辑依据地址判断此字是否在cache中:若是,此字立即传送给CPU;若非,则用主存读周期把此字从主存读出送到CPU,与此同时,把含有这个字的整个数据块从主存读出送到cache中。从CPU看,增加一个cache的目的,就是在性能上使主存的平均读出时间尽可能接近cache的读出时间。为了达到这个目的,在所有的存储器访问中由cache满足CPU需要的部分应占很高的比例,即cache的命中率应接近于1.由于程序访问的局部性,实现这个目标是可能的。运算器由算数逻辑单元(ALU)、通用寄存器、数据缓冲寄存器DR和状态条件寄存器PSW组成,它是数据加工处理部件。运算器接受控制器的命令而进行动作,即运算器所进行的全部操作都是由控制器发出的控制信号来指挥的,所以它是执行部件。运算器有两个主要功能:(1)执行所有的算数运算;(2)执行所有的逻辑运算,并进行逻辑测试,如零值测试或两个值的比较。通常,一个算数操作产生一个运算结果,而一个逻辑操作则产生一个判决。
与主存容量相比,cache的容量很小,它保存的内容只是主存内容的一个子集,且cache与主存的数据交换是以块为单位。为了把主存块放到cache中,必须应用某种方法把主存地址定为到cache中,称做地址映射。“映射”的物理含义是确定位置的对应关系,并用硬件来实现。这样当CPU访问存储器时,它所给出的一个字的内存地址会自动变换成cache的地址。由于采用硬件,这个地址变换过程很快,软件人员丝毫感觉不到cache的存在,这种特性成为cache的透明性。地址映射方式有全相联方式、直接方式和组相联方式三种。在全相联映射中,将主存中一个块的地址(块号)与块的内容(字)一起存于cache的行中,其中块地址存于cache行的标记部分中。这种带全部块地址一起保存的方法,可使主存的一个块直接拷贝到cache中的任意一行上。全相联映射方式的检索过程:CPU访存指令指定了一个内存地址(包括主存和cache),为了快速检,指令中的块号与cache中所有行的标记同时在比较器中进行比较。如果块号命中,则按字地址从cache中读取一个字;如果块号未命中,则按内存地址从主存中读取这个字。在全相联cache中,全部标记用一个相联存储器来实现,全部数据用一个普通RAM来实现。全相联方式的主要缺点是比较器电路难于设计和实现,因此只适合于小容量cache采用。直接映射方式也是一种多对一的映射关系,但一个主存块只能拷贝到cache的一个特定行位置上去。直接映射方式的优点是硬件简单,成本低。缺点是每个主存块只有一个固定的行位置可存放,如果块号相距m整数倍的两个块存于同一cache行时,就要发生冲突。发生冲突时就要将原先存入的行换出去,但很可能过一段时间又要换入。频繁的置换会使cache的效率下降。因此直接映射方式适合于需要大容量cache的场合,更多的行数可以减小冲突的机会。采用直接映射时,cache无需考虑替换问题。从存放位置的灵活性和命中率来看,全相联映射方式为优;从比较器电路简单及硬件投资来说,直接映射方式为佳。组相联映射方式将cache分成u组,每组v行,主存块存放到哪个组是固定的,至于存到该组哪一行是灵活的。组相联映射方式的比较器电路容易设计和实现,而块在组中的排放又有一定的灵活性,使冲突减少。全相联映射方式和组相联映射方式速度较低,通常适合于小容量cache。
cache工作原理要求它尽量保存最新数据。当一个新的主存块需要拷贝到cache,而允许存放此块的行位置都被其他主存块占满时,就要产生替换。对直接映射方式来说,因一个主存块只有一个特定的行位置可存放,所以只要把此特定位置上的原主存块换出cache即可。对全相联和组相联cache来说,就要允许存放新主存块的若干特定行中选取一行换出。cache的替换全部靠硬件实现。
如何选取就涉及替换策略,又称替换算法,硬件实现的常用算法主要有以下三种:1)近期最少使用(LRU)算法:将近期内长久未被访问的行换出;2)最不经常使用(LFU)算法:将一段时间内被访问次数最少的那行数据换出;3)随机替换:实际上是不要什么算法,从特定的行位置中随机地选出一行换出即可。在Cache替换算法中,近期最少使用法比较正确地利用了程序访存局部性原理,替换出近期用得最少的存储块,命中率较高,是一种比较好的替换算法;随机法是随机地确定替换的存储单元,先进先出法是替换最早调入的存储单元,它们都没有根据程序访存局部性原理,命中率较低;而后进先出法不是cache所使用的替换算法,此法在堆栈存储结构中使用。
【虚拟存储器】
常用的虚拟存储系统由主存-辅存两级存储器组成,其中辅存是大容量的磁表面存储器。在虚拟存储器中,主存的内容只是辅存的一部分内容。虚拟存储系统是为了提高存储系统的性能价格比而构造的分层存储体系,力图使存储系统的性能接近高速存储器,而价格和容量接近低速存储器。虚拟存储利用了程序运行时的局部性原理把最近常用的信息块从相对慢速而大容量的存储器调入相对高速而小容量的存储器。虚拟存储主要是解决存储容量问题,另外还包括存储管理、主存分配和存储保护等方面。虚存所依赖的辅存与CPU之间不存在直接的数据通路,当主存不命中时只能通过调页解决,CPU最终还是要访问主存。虚存管理由软件(操作系统)和硬件共同完成,由于软件的介入,虚存对实现存储管理的系统程序员不透明,而只对应用程序员透明(段式和段页式管理对应用程序员“半透明”)。主存未命中时系统的性能损失要远大于cache未命中时的损失。
【虚拟内存管理】
虚存机制也要解决一些关键问题:(1)调度问题:决定哪些程序和数据应被调入主存;(2)地址映射问题:在访问主存时把虚地址变为主存物理地址,在访问辅存时把虚地址变为辅存的物理地址,以便换页;(3)替换问题:解决哪些程序和数据应被调出主存;虚拟存储器的替换算法与cache的替换算法类似,有FIFO算法、LRU算法、LFU算法,虚拟存储器的替换有操作系统的支持(4)更新问题:确保主存和辅存的一致性。虚拟存储器分为页式、段式、段页式三种。
页式虚拟存储系统中,虚地址空间被分成等长大小的页,称为逻辑页;主存空间也被分成同样大小的页,称为物理页。相应地,虚地址分为两个字段:高字段为逻辑页号,低字段为页内地址(偏移量);实存地址也分为两个字段:高字段为物理页号,低字段为页内地址。通过页表可以把虚地址(逻辑地址)转换成物理地址。在大多数系统中,每个进程对应一个页表。现代的中央处理机通常有专门的硬件支持地址变换。每个进程所需的页数并不固定,所以页表的长度是可变的,因此通常的实现方法是把页表的基地址保存在寄存器中,而页表本身则放在主存中。由于虚地址空间可以很大,因而每个进程的页表有可能非常长。由于页表通常在主存中,因而即使逻辑页已经在主存中,也要至少访问两次物理存储器才能实现一次访存,这将使虚拟存储器的存取时间加倍。为了避免对主存访问次数的增多,可以对页表本身实行二级缓存,把页表中的最活跃部分存放在高速存储器中。这个专用于页表缓存的高速存储部件通常称为转换后援缓冲器(TLB),又称快表。而保存在主存中的完整页表则称为慢表。快表的作用是加快地址转换。TLB的作用和与主存与CPU之间的cache作用相似,通常由相联存储器实现,容量比慢表小得多,存储慢表中部分信息的副本,可以完成硬件高速检索操作。地址转换时,根据逻辑页号同时查快表和慢表,当在快表中有此逻辑号时,就能很快地找到对应的物理页号。根据程序的局部性原理,多数虚拟存储器访问都将通过TLB进行,从而有效降低访存的时间延迟。由于TLB的缓冲过程与cache的缓冲过程是独立的,所以在每次存储器访问过程中有可能要经历多次变换。