1.虚拟存储器
计算机空间中主存空间很小但外存(辅存)空间很大,通常计算机只能从主存中交互数据,再由主存向外存交换数据,如果使用虚拟存储,可以将主存和外存合并,只需给出地址,若该块已在主存中则直接与主存交互,若其不在主存中则需采用替换算法将其换入主存。原理类似于Cache和主存之于主存和外存。
主存缺页需要的代价很大所以需要提高命中率所以一般采用全相联映射且采用写回法。
2.页式虚拟存储器
页式采用以页为单位。将虚拟地址分为两部分:虚页号,页内地址。虚拟地址到物理地址的转换是根据页表实现的。页表存放在主存中,保存着所有的虚页号和实页号的对照,记录着虚页调入主存所保存的位置,常驻主存。
(1)页表:对应Cache中的Cache标记行,包含有效位(是否在主存中)、脏位(在主存中是否被修改)、替换算法位、物理页号(在主存中时)或磁盘地址(不在主存中时)。
地址转化过程:将给出地址分成两份:虚页号+页内地址备用。从页表寄存器中取出页表位置查找主存找到页表。根据页表对照虚页号找到实际地址。将实际地址和页内地址拼接成最终的地址。
(2)快表:因为页表会造成频繁访问主存,根据局部性原理可以采用快表,类似于Cache,当想要访问主存的某个地址时,首先查找快表,若快表命中则无需访问主存。快表采用全相联或组相联映射,所以TLB标记在全相联下就是虚页号,组相联下就是虚页号的高位部分。
(3)Cache+快表的结构:CPU访存的完整过程
- CPU给出一个32位的虚拟地址
- TLB按照全相联映射则对比每一个TLB字段,若某一项的TAG位(全相联为虚拟页号)相等且有效位为1则TLB命中则直接给出其物理页号结合页内地址形成物理地址。
- 未命中则查找主存的页表,对应页表位全相联映射对比页表后得到物理地址(无论是否在主存中页表均有记录)。
- 得到物理地址后查找Cache,按Cache的类型将物理地址分为TAG位、组号或行号(有需要)、块内地址。若找到TAG位相等且有效位为1则从Cache中找到块内地址所对应的数据。若未命中则访存。
最好的情况,TLB命中且Cache命中不需访存即可取到数据。最坏的情况(数据不在主存时),TLB不命中访存一次,Cache不命中访存一次未找到,从外存调入后再访存一次找到,共需要3次访存。
3.段式虚拟存储器
和页式虚拟存储器的区别是段式是根据实际程序逻辑分段,其中各段所包含的大小不一致,使用更加灵活,但是可能会产生碎片。和页式相同点在于段表也存在于主存中,且都有一个有效位,当为1时表示该段存在于主存中,不同点在于需要标注好段长。
和页式不同的地方,先查段表找到段所对应物理段始址(页式为对应物理页号直接拼接页内地址)加上段内地址可得到最终地址。
4.段页式虚拟存储器
宏观上采用段式,段式每段的内部采用页式。每个程序对应一个段表,每个段对应一个页表。可囊括段式和页式的优点。
虚地址应分为三部分:段号、页号、页内地址。
先根据段表和段号查找到所查找段所对应的页表地址,根据页号和页表找到所查找的页物理地址和页内地址拼接即可得到最终的地址。其中找段表一次访存,找页表一次访存,最终找到物理地址还要访存一次,所以至少要3次访存(不考虑Cache的情况)。
5.虚拟存储器和Cache的区别:Cache主要解决访存速度的问题,虚拟存储器主要解决主存空间大小的问题。
Cache由硬件实现对所有程序员透明,虚拟存储器由OS和硬件共同实现,对系统程序员不透明,对应用程序员透明。