关于虚拟存储器和高速缓存的理解

对于csapp中的高速缓存和虚拟存储器章节做个总结,这些可以帮助我更好的理解java中的NIO以及并发。希望大家能多多评论,共同提高。

昨天问一个要去美国读计算机博士的朋友研究哪个方面,他说做操作系统,并且他们导师对基础要求很严格,要他先补好基础,然后他也问了我几个问题,觉得问题对理解高速缓存和虚拟存储器这块有用就记录下来:

问:一条load指令对应的地址是物理还是虚拟的
答:虚拟的
问:一条load指令可能会从哪里取值
答:寄存器,高速缓存,主存,硬盘或者网络,不过后2者需要先进内存
问:如果cache miss了,那么需要访问memory几次
答:数据一定在主存吗?
问:假定一定在
答:一次?
问:不对,如果tlb miss 了,就是2次,所以是1到2次。(所以我忽略了如果tlb没有存储对应的虚拟地址的pte,那么就先需要从内存中读取一个pt,
获取到pa后,再去内存读数据)
问:好,下个问题会更有意思,如果tlb miss 了,但是数据已经cache了,会不会访问主存
答:会
问:不一定,因为x86的cache是按照虚拟地址建立的,所以miss后可以从cache中读取到
后来还说到了tlb的内容在process切换的情况下会不会清理掉,不清理的话如果proces1没有跑,又切换回去,那么就可以重复利用了,我yy了一种
场景,如果不刷,会导致类似页不命中要换页的情况,这种就需要消耗单独的时间。当然最终在设计的时候,肯定不会是yy的,一定会有大量的数据
作为支撑。


先记录下一些名称的英文缩写:
PP(physical page)物理页
VP (virtual page)虚拟页
VA (Virtual Address)虚拟地址              VPO(虚拟页面偏移)+VPN(虚拟地址页号)+TLBI(TLB索引)+TLBT(TBL标记)
MMU(Memory management unit)存储器管理单元
PA (physical address)物理地址             PPO(物理页面偏移)+PPN(物理页面页号)+CO(缓冲块内的字节偏移量)+CI(高速缓存索引)+CT(高速缓存标记)
PTE(page table entry)页表条目
segmentation fault 段错误
PTBR(page table base register)页表基址寄存器
PTEA(page table entry address)页表条目地址
TLB (translation lookaside buffer)翻译后备缓冲器(包含在MMU中)

什么是虚拟存储器呢?首先虚拟存储器概念是针对计算器的主存的一种抽象,如果没有这种抽象,那么物理主存就会暴露出来,这样不方便对主存进行统一的管理,也不方便进行系统的扩展。虚拟存储器提供了如下三个功能:
1.高效的使用主存。它将主存看做磁盘的高速缓存,需要使用的数据缓存到主存,不需要的进行换出。
2.对进程的主存一致性视图。每个进程看到的内存视图都是一致的,这样简化了存储器的管理
3.保护了进程的地址空间数据的安全性,防止被其他的进行所破坏。

虚拟存储器结合了计算器硬件,操作系统软件之间的交互,那么现在就说下具体是怎么运行的吧。
cpu在执行指令的时候,拿到的是一个虚拟地址,所以就需要将该虚拟地址翻译为物理地址,翻译的过程是:cpu将虚拟地址传给MMU,MMU
通过PTBR拿到PTE,如果该虚拟页号已经缓存,那么将PTE中记录的物理地址和虚拟地址中的地址偏移合成为物理地址然后去高速缓存或者
主存中获取数据,最后将数据交给cpu。在这一个过程中,如果该虚拟地址没有被缓存,那么触发一个内核的缺页异常,由操作系统根据算法确定对应
的牺牲页,然后将其换出,换入需要读入的页。这个过程完成后,缺页处理处理程序返回原来的进程,继续执行导致缺页的指令,然后cpu会再次发送
虚拟地址出去,这个时候该页面已经缓存在主存了,所以就可以顺利拿到数据了。
上面的步骤中,每个都要从高速缓存/主存中获取PTE,如果在高速缓存中速度还很快,但是如果在主存,那么速度就要下降很多。所以在MMU中就包含
了一个PTE的缓存TLB,这样进行地址翻译的时候就直接看TLB就可以了。
PTE是存放虚拟存储器地址对应的物理存储器地址的,对于一个32位机器来说,对应的内存大小是4GB,如果一个页的大小是4KB,那就需要1000000
条数据来存放整个虚拟存储器对应的虚拟地址空间,一条页表数据4B,那就需要4MB来存储整个页表,注意这还只是一个进程的页表,针对这种情况,
可以使用多级页表来进行存储。


对于现有的存储部件,越是快的就越贵,当然也就越小,比如寄存器大小就是byte为单位的,而磁盘是100GB作为单位,而访问时间相比也是横跨了许多数量级。如果不加入缓存机制,那么程序运行起来速度可想而知会有多慢。现在的电脑中,一般的存储结构是这样的:
寄存器
L1高速缓存
L2高速缓存
L3高速缓存
主存
磁盘
网络I/0
上面一级的可以看做是下一级的缓存,经常会使用到的数据能够放在更高层次的存储结构中,这样读取速度变快程序也就能够变快了。虽然缓存的机制能够使得程序运行的更快,但是自己想下,如果仅仅是这样的话,一个只有几MB的高速缓存和几个GB的内存比起来也太小了,即使常用的数据能放在高速缓存中,那也放不了多少啊,所以一定是有别的什么拯救了程序的运行,这就是程序的局限性带来的好处。局限性分为2种类型:空间局限性和时间局限性。时间局限性是指一个数据在一段时间内会多次被访问,这样因为第一次访问已经缓存,所以后续的访问就会很快。空间局限性是指在进行高速缓存的时候,数据是按照块来进行缓存的,第一次访问的只是该块中的部分数据,这样会导致整个数据块都被缓存,那么程序很可能在不远的将来引用这个块中的其他的数据。


高速缓存的组成结构一般是分为S个组,每个组E行,一行包含B个字节数据。所以总体容量C=S*E*B。下面是几种比较特殊的组成结构
1.直接映射高速缓存
这种高速缓存对应的E=1




2.组相连高速缓存




3.全相联高速缓存

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值