程序的运行大致是这个样纸的:当我们要运行一个程序时,如,我们点击了一个.exe的文件,然后剩下的事情就交给计算机处理了:计算机会先将程序读到内存,然后再通过各种调度读到cup中执行。(注:本图只是个例子)
但是对于经常使用的程序或文件,想想如果我们经常按照这个顺序读下来,举个极端点儿的例子,从硬盘读到内存要1000S,从内存读到cache要100s,从cache读到寄存器执行要1s,这是我们就应该想,对于常用的东西,为什么不就放在身边呢?但是考虑到寄存器的容量太小的问题,于是,我们就把常用的东西放到了cache里面。这里的cache起到了一个buffer的作用:暂时不用但以后常用的东西先存起来。
这样,使用了Cache后,我们在运行程序时如果需要访问存储器,就会先访问Cache,看看在这里面有没有我们要找的信息,如果没有,再到主存中去寻找,如果找不到,再到辅存中去找。
CPU访问要读取数据时,发出来的是主存的地址,而有可能我们要访问的内容在Cache中,所以,这时候就要将主存地址转换为Cache的地址,这里,有3中转换方法。
在进行映像的工作时,规定各区中的某一信息块只能映像到Cache中的一个固定的信息块中,即主存中的第0块映像到cache的第0个块框架,第1块映像到cache的第1块,以此类推的映像方式。
在全相联Cache中,存储的块与块之间,以及存储顺序或保存的存储器地址之间没有直接的关系。程序可以访问很多的子程序、堆栈和段,而它们是位于主存储器的不同部位上。
这时,我们可以先来看一下cache结构:
因为Cache保存着很多互不相关的数据块,所以,Cache必须对每个块和块自身的地址加以存储(就放在上面的tag里面)。当请求数据时,Cache控制器要把请求地址同所有地址加以比较,进行确认。
组相联Cache是介于全相联Cache和直接映像Cache之间的一种结构:通过直接映像决定组号,在一组内再用全相联的方式来决定cache中的块号。
综上,可得出:
直接映射:一个块可以放到cache中的唯一的位置上
全相联:一个块可以放到cache中的任意的位置上
组相联:一个块可以放到cache的受限的组里,该块可以放置到组内的任意一个块里
计算机内各种地址转换都很有规律:1,分级:比如,河北省——廊坊市——安次区——狼院——**宿舍楼; 2,逐一比较:比如,查找门牌号为515的房间,就从000这个房间挨个比较到找到515为止;3,综合上面1和2:比如,要从中国查找这个515房间,就先利用分级方法确定515大致位置,然后再利用逐个比较的方法找。
小结:
在贝尔克的亡灵中,福尔摩斯对柯南说过:
人生就是一束无色的线里交缠着名为杀人的血红色的线,而解开那线的工作,不就是我们的工作吗?
最近感觉学习东西就像是解开一团线,越理就越清晰吧~
原文地址:http://blog.csdn.net/lhc1105/article/details/39210535