加油哦 棒棒哒ε٩(๑⌓̈๑)۶з
各位同学大家好,从这个小节开始,我们要进入这一章的重中之重,大题和小题的高频考点就是cash那之前我们学习了存储系统的一些优化策略,对于储存我们可以用双端口run,还有多模块存储器,这样的方式来提高储存的工作速度,但是无论组成的速度再怎么提高。来提高相比于CPU的读写运算速度,依然这个速度差距是很大的,所以如何解决这个问题,一个比较容易想到的方法是我们可以设计更高速的存储单元,比如说把第1万金片改成S镜片,但是这就意味着我们的存储器价格会更高,或者从另一个角度来讲,当你成本相同的情况下的总量肯定是需要下降的,那这个问题怎么解决呢,基于程序的局部性原理,我们可以再增加一个cash的人用这样的方式来缓和CPU和储存之间的速度矛盾,然后来看一下cash的一个工作原理,我们现在看没有开始的情况,假设这是大家的一个手机,那你的手机可能是128GB或者64GB等等的啊,比较大的一个浮存,那你在你的储存空间上可以安装微信王者荣耀,各种各样的你喜欢用的软件或者游戏,而是呢,假设你的微信要启动,那么你启动微信的过程其实就是把微信相关的程序代码还有数据给它调入内存的一个过程。其实就是把微信相关的程序代码还有数据给它调入内存的一个过程,比如说微信里面可能会有一个模块是用来处理文字聊天的,还有一个模块用来处理视频聊天,还有一个模块的代码指定专门用于实现你的朋友圈相关的功能,当然了,除了你应用软件的这些代码指令之外,也会有一些相关的数据被调入内存,比如说你的微信的聊天数据,还有就是朋友圈里一些图片之类的缓存数据也需要放到内存里噢,那把这些数据调入内存之后,你的这个微信就可以正常的开始运行了,那你的微信运行的过程其实就是CPU从内存里一条一条的来取这些指令执行指令的过程,不过之前我们说过CPU速度是很快的,而内存储存它的速度很慢,所以快速的CPU每一次都从储存从内存里边读取数据,这就会导致CPU的执行效率,被内存的读写速度所拖累正在和你的朋友或者家人视频聊天。那么在你视频聊天的这段时间内,是不是微信的这些数据当中只有视频聊天相关的指令代码在这段时间内会被频繁的访问好,所以如果我们能够把视频聊天相关的代码把它复制一份把它复制到一个更高速读写速度更快的case当中,那么CPU就可以直接从开始当中读取视频聊天相关的这些指令和数据,而开始的读写速度比内存快多了,那这样的话,CPU和内存之间的这个速度矛盾就会缓和之前我们给过一个截图就是三星的这个内存条,它的读写速度大概是37GB每秒这样的一个速度,而cash可以达到接近1000GB每秒这样的一个读速度写速度,虽然比读速度要慢一些,但是也要比这个内存要快得多这一种the单元所需要付出的一个时间大概是六十一那一个多。61纳秒缩短到了一纳秒这样的一个量级,所以开始要比内存快得多,可以更好的配合高速的CPU的一个工作好,所以这就是看似的一个工作原理,那在这个图中我们把cash和CPU啊画成了两个框,但事实上现在的计算机通常cash啊,这个高速缓冲存储器就是被集成在CPU内部的,并且是用S run这种芯片来实现,而之前我们说过要比低万速度要快得多,但是成本也会更高,另外sm的集成度会更低,所以这就意味着,如果我们想把踏实这个高速缓冲存储器塞进一个很小的手机里面,那么由于它的集成度很低所以在芯片的大小我们不能做的特别大的情况下就注定了cash的这个存储空间,存储容量不可能做的特别烂,这并不是有钱就能解决的事情,你得考虑到它的集成度,它的一个体积电脑上的c五期大小可能也就是十二自己。英特尔的I5系列的CPU它的cash的大小可能也就是12兆字节,这样的一个大小好,那这就是cash的一个工作原理,可能大家觉得会比较特殊的,那其他的程序运行也会存在我们刚才所描述的这么理想的场景吗?就是说在某一段时间内,CPU是否只会访问到啊这个某一部分的数据,那这个问题我们可以用程序的局部性原理来解释来看这样的一段程序,呃,这个程序a我们传入了一个二维的数组M行N列,然后这个程序里面主要做的事情就是在这个for循环里用了两层的嵌套复循环,然后一行一行一行的来访,问这个二维数组里面的各个数据,所以对于这个程序它在运行的时候,其实我们需要把这个程序的代码把它翻译成二进制的机器指令,另外像数组还有各种各样的变量,这些数据我们也需要把它放到内存里边对于一个二维数字。数据我们也需要把它放到内存里边,那大家都应该学过C语言和数据结构,我们知道对于一个C语言里的二维数组就是有M行N列这样的二维数组,当我们把这些数据放入内存的时候,其实是一行一行这么来存储的,所以我们看一下这个内存里面400400这个地址,我们存储了a00这个数据,然后404这个位置我们存储了a01这个数据,为什么这两个地址相差是4呢?因为我们每一个数字元素是一个硬质类型,而一个硬质类型刚好是4个字节好,总之我们逻辑上看这个速度它好像是一个二维的速度,但是我们放到内存里边的时候,这个数组会不会展开成这种一维的形式来顺序的存储一行一行的存好,那现在结合我们这个程序的逻辑,就是要一行一行的访问我们的这个二维数组,那不难得出这样的一个结论这个数据相邻的其它这些元素。紧接着被访问好,所以这就是所谓的空间,局部性就是指最近的未来,有可能要用到的信息,很有可能是在现在我们正在使用的这个信息的啊,存储空间周围的那些数据,那刚才我们看的是数组的数据,其实除了数据之外指定的访问也存在的空间局部性,因为我们知道我们这些程序最终肯定是被翻译成一条一条的机器指定那么这些机器指令在内存里面也是顺序存放的,因此当我们访问某一条机器指令的时候,在不久的将来,与这条机器指令相邻的其他这些机器指令,也有可能会紧接着被使用到好,所以这就是所谓的空间局部性好再来看时间局部性时间局部性指的是在最近的未来要使用到的信息,很有可能是现在我们正在使用的信息,那要理解这个时间,局部性最典型的例子就是啊程序里的这种循环结构,比如说这个加法这个指令可能。这个家纺这个家纺,它所对应的指令可能是存放在内存里某一个部分,那么当我们访问了这条加法指令之后,由于有这种循环结构的存在,那是不是意味着我们在未来很短的时间内有可能会再次使用到这个加法所对应的指令啊,所以这就是空间局部性和时间局部性空间局部性,是因为我们的指令和数据在内存里面通常是顺序存储的,而我们访问这些指令和数据的时候,很多时候都是需要顺序的访问,所以这就导致了空间就不行,而时间局部性主要是因为我们程序里边会存在大量的循环结构,所以导致了时间局部性,除了对指定的访问具有时间局部性之外,其实对某些数据的访问也具有这种时间局部性,比如说对于变量按L变量,G还有变量,sum结果存在所以很有可能在短时间内被执行的这种权利我们不难想到结果存在所以很有可能在短时间内被执行的这种权利我们不难想到的。比如说对于变量案还有变量,这还有变量,sum这些变量也因为循环结构的存在,所以很有可能在短时间内被重复的访问好,所以基于程序执行的这种局部性原理,我们不难想到这样的策略,呃,由于CPU目前访问的这个储存地址,它的周围那些数据,很有可能在不久的未来就会我们使用另外CPU当前访问的这个地址,也有可能在未来被重复的访问,所以我们可以把目前访问的这个地址周围的一部分数据先把它放到cash当中,也就是复制一份到菜市里边,那接下来CPU是不是就可以直接从菜水读取相应的数据,好比如说当我们在访问这个数组的时候,如果此时CPU访问了a00这个元素,那么我们完全可以制定一定的策略,把a00之后的这些多个数组元素把这些数据复制一份到cash当中,那这样的话,接下来CPU想要再访问这些数据,是不是只需要去看一下电脑就可以了,就可以大幅的提升CPU的运行速度。那这样的话,接下来CPU想要再访问这些数据,是不是只需要去看视频导就可以了,就可以大幅的提升CPU的运行速度好,所以局部性原理就是cash能够有效工作的一个理论依据,好现在我们来把程序a把它进行一个改造程序,a是对这个二维数组一行一行的访问,那我们把这个过去的话稍微改一改,我们把它改成一列一列的看看这些基础不好的同学可以站起来看一下,那么对于程序B来说,就意味着他访问这个二维数组的顺序应该是这样的,首先访问a0接下来要访问的是a10对吧,然后再往后应该要访问的是a2B,因为是一页一页的访问,所以也就意味着程序B的这种呃执行的方式,它的空间局部性是不是要比程序a更差一些,当程序a在访问某一个数组元素的时候,接下来它访问的肯定是与之相邻的其他元素,而程序并它是跳着跳着来访问的,所以程序B的空间局部性会更差可能。不是要比程序a更差一些,当程序a在访问某一个数组元素的时候,接下来,他访问的肯定是与之相邻的其他元素,而程序B它是跳着跳着来访问的,所以程序B的空间局部性会更差,所以在实际当中可能程序B它的实际运行时间要比程序a要慢得多,因为程序a可以很大概率的直接从cash当中找到他想要的数据好的,那这是局部性原理,那么接下来我们来看一下增加了cash之后,整个系统的运行效率可以提升多少,我们还是以刚才微信的这个运行为例,整个微信它本来是有一致性的,但是现在我们把微信的其中某一小部分的代码和数据把它放到了text当中,把它控制了一份到text当中,那么我们可以假设CPU对cash的访问啊进行一次读写,只需要TC这么长的时间,这个角标C指的就是cash,然后CPU对内存的读或者写每一次访问需要TM这样的时间,M指的是memory C指的就是cash,然后CPU对内存的读或者写每一次访问需要TM,这样的时间,M指的是memory,好,那现在CPU如果说他想要执行的是视频聊天相关的代码,那是不是这些代码可以在开始里面找到或者CPU想读去朋友圈相关的数据,那么这些数据也可以在开始当中找到好,所以对CP想要的数据,他如果能够直接在菜市里面找到,那么我们就称这种现象为探视命中那也是对应的一个指标,就是所谓的命中率,就是说CPU想访问的信息,他已经在看是当中的比例比率到底是多少,那与命中率相对的是不是就是缺失率,也就是没有民族的概率好,所以如果我们能够知道访问cash访问储存分别需要花多长时间,然后踏实命中的概率是多少,那我们就可以计算出这个系统它的平均访问时间应该是多少肯定优先吧。 PC这么长的时间好另一种情况也有可能会发生在cash里边找不到数据的情况,比如说此时CPU要运行的是文字聊天交换的代码,那么CPU先花了,TC这么长的时间在开始里面找没找到,那么接下来CPU就会花TM这么长的时间去内存里面再去读这个数据,而这种情况发生的概率应该是一减H好,所以增加了cash之后,CPU进行一次读写所需要的平均时间T就应该是这么长,既然这个平均读写时间应该是大于TC,但是要小于TM的,那大家需要注意理解刚才所说的这个过程,CPU是先去开始当中找,无论找得到还是找不到,都是要画TC这么长的时间,那如果说没有命中没找到的话,CPU才会紧接着去组成那边去找这些数据同时也是可以的此时他会同时和。会同时去看和内存里面找,但是当过了TC这么长的时间之后,他在开始里面找到了开始命中,那这个时候他就可以立即停止在内存里的查找,所以在看实名认证的情况下,CPU的访问时间同样只需要TC这么长的时间,那这种情况发生的概率应该是H好,另一种情况假设CPU此时要找的是文字聊天相关的这个代码,那么CPU同时会去cash和主存里边找,但是过了TC这么长的时间之后,是不是看视频找不到,那既然左边找不到我们继续在右边找不就行了,但是由于左边和右边的查找是同时开始的,因此总共过了TM这么长的时间之后,CPU就可以直接从内存里找到相关的数据,而这种情况发生的概率是1减H这么多好,所以和上面这种方式相比,下面这种方式它的这个平均访问时间不需要更短,效率会更高,因为在开始没有命中的情况下啊,我们所需要花费的时间更少,就是少了一个TC坐我。下面这种方式他的这个平均访问时间可能要更多,效率会更高,因为在开始没有命中的情况下啊,我们所需要花费的时间更少,就是少了一个TC好,那对于这种cache主存系统也经常作为考题进行考察,比如说这个题他告诉你开始的速度是主存的5倍,那么我们可以假设开始的存取周期是T,那主存的存取周期就应该是武技,那它的命中率是95%,然后问我们采用了case之后,存储器的性能提升了多少,然后这个题目告诉我们,它采用的是cash和储存同时被访问,也就是我们刚才说的第2种方案好,那来简单算一下cash和储存同时被访问,那么当看实名认证的时候,我们的这次读写操作就只需要记这么长的时间,而如果看什么样的一种,那么我们这次读写操作就需要5T这么长的时间百分之九十五个平均的时间没有。那么对于这个系统来说,在没有引入开始之前,我们每一次存或者取一个数据肯定都得对主尊进行访问,那么主存的访问一定是需要武器这么长时间的,而引入了cash之后,我们的平均访问时间降到了1.2T。储存进行访问,那么储存的访问一定是需要5T这么长的时间的,而引入了cash之后,我们的平均访问时间降到了1.2G好,所以引入了开始之后,整个读写的性能变成了原来的4.17倍,这一提升还是很明显的好,再来看另一种情况,如果说我们采用上一页PPT当中提到的第1种策略就是先访问开始,当开始未命中的时候再开始访问主持人,那么这种情况下开始命中的时候,访问时间就应该是T,没有命中的时候,访问时间就应该是T,再加上5T也就是6T的时间好,所以平均访问时间我们可以相乘相加就可以得到,应该是1.25的进度相处就可以得到提升办学所以这种访问的策略贵阳时间的计算一点点的注意身体的一个通过。我们依然还有很多需要解决的问题,第1个问题,我们之前说过,基于局部性原理,我们其实可以把CPU目前访问的那个地址的周围的部分数据先把它放到case当中,那么我们如何界定所谓的周围的情况这个问题可以这么解决,我们可以把整个储存的啊存储空间进行一个分块每一个块的大小是相同的,比如说一块是1KB,然后组成和cash之间会以块为单位进行数据的交换,比如说此时我们访问了a00这个数字元素,那么由于整个储存给我们分为了1KB1KB1KB这样的呃一个一个的快,所以当我们访问这个数组元素的时候,我们可以通过地址信息来判断这个数字元素,它从属于哪一个分块,比如说它的整个分块是这样的一个范围把它全部我们。你的这些存储空间也会被分为大小相等的一个一个的快来看,我们这儿给出的这个例子,假设整个主城总共是4兆字节,那4兆字节应该是2的22次方这么多个字节,它被分为了1KB1KB的大小而已,K应该是等于2的10次方,所以用2的22÷2的14方,我们就可以算出整个主城被分为了多少块,应该是2的12次方,也就是4096这么多个块好,所以我们可以给这个储存的各个块进行一个编号,从0开始一直到4095每一块的大小是1KB,好,那如果这个储存它是按自己编制,那么是不是意味着这个储存它的地址空间,它的地址应该是包含22个B座位,因为总共有42个字节,好,那我们对储存分块之后整个储存总共22位的地址,我们可以把它拆分成两个部分前边的12位用来表示快号,因为12倍刚好可以表示0~4095这个范围。共有1K个存储单元,刚好可以用10个比特币来表示好,所以对储存分化之后,我们储存到22位地址,可以把它看作是由块号和块内地址这样两个部分来组成好,现在再来看左边的这个开始啊,假设我们的开始它的存储空间只有8K比这么多,那么我们把这个开始分块之后,他总共只能被分为8个块块好市民稻妻每个块的大小同样是一个KB好,所以对cash和储存分块之后我们接下来对这两个部分的数据进行交换是不是就很方便了,可以一块一块的来交换,那这个地方需要再聊这样的几个术语,在操作系统当中组成的这样的一个块,也会被称为一个页或者叫一个页面或者一个页框,大家在做题的时候,如果看到这样的描述,需要知道他说的其实就是储存的一个块好,另外在很多教材当中对于cash的一个块,也会把它称为一个cash行。 Cache的快好也会被称为行好,那我个人比较喜欢把cache和主存的啊,这两个术语进行了统一都把他们称作筷还有坏好,因为他们之间本来就有这种对应关系,所以接下来的讲解当中,我们会用差10块还要组织损坏或者内存块这样的方式来描述,好再次强调储存和开始之间是以块为单位进行数据交换的好,另一点需要补充的是CPU优先会从cash里边找数据,但是如果cash当中找到CPU又会到主存里边找数据,那么当CPU访问了储存的某一个存储单元之后,接下来一定会把这个存储单元所存储的这一整块立即调入到cash当中,所以这个过程只是把数据复制一份,并不会把储存里的这些数据给删除我们的每一个位置如何如何区分。放到开始的每一个位置,那么主存块和cash快他们之间的这种队友关系,我们应该如何记录呢?Cp图和区分开示里的数据和主城里的数据的一个对应关系,那这个问题就是我们下一小节会学习的cash和储存的映射方式,要探讨和解决的问题好,第2个问题,我们之前说过cash的容量很小,而组织的容量一般要比cash要大得多,那这就意味着我们只可能把储存中的一小部分数据把它放到态势当中,那么当态势满了之后应该怎么办呢?那这个问题我们会在下下小节当中进行探讨,就是替换算法要解决的问题,好,最后一个问题,我们储存里保存的数据它是被复制了一份到cash当中,比如说你用毁图秀秀啊,P图的时候,你的那个图片数据有可能会被放到cash当中,对吧图片的数据是被复制了一遍改的这个数据这个数据。干的事儿。优惠优先更改的是case里边保存的这个数据,而cache里的这个数据它只是一个数据副本,真正的数据谷本是被保存在主城当中的,那我们应该如何保证数据副本和数据模板他们之间的一致性呢?那这也是后面的小结会解决的问题,也就是碳似的写策略主要探讨的问题好,所以通过这一小节希望给大家建立起一个呃关于cash的一个全局观,接下来的几个小节当中我们带着这些问题来寻找答案好的,那这个小节当中我们介绍了高速缓冲存储器cash的一个基本工作原理,还有局部性原理分类,空间局部性和时间局部性,这是因为程序局部性原理的存在,我们在引入了小容量的但是高速的cash之后,我们依然可以使整个系统的性能得到一个很明显的提升,那么对于我们的性能提升了多少这个问题大家一定需要注意审题,要这样的两种方式,第1种方式是先访问cash主权进行访问,如果看说明书。还是我开始跟你说。更好一些,那最后我们还引入了很重要的概念,就是是主权和看守他们都会被分块,每一个块的大小都是相同的组成,和tx之间会以块为单位进行数据交换,另外也需要注意主存块还有内存块他们的一个别名,另一个方面组成的存储空间,给我们分块之后储存的地址,我们可以在逻辑上把它看作是有储存块号和宽带地址这样的两个部分来组成的那这些内容,如果大家之前学过操作系统第3章的话,理解起来应该是很容易的,那这些写的最后我们留下了一些关于开始的问题,接下来的几个小节我们会逐一的解决这些问题,好了,那以上就是选择。