热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

CPU与Cache、内存以及硬盘之间的数据交换

今天一个同学问我一个问题,CPU与Cache、内存、以及硬盘之间是如何进行数据传输?我给同学了一个笼统的解释。当我再细想这个问题的时候,我

今天一个同学问我一个问题,CPU与Cache、内存、以及硬盘之间是如何进行数据传输?我给同学了一个笼统的解释。当我再细想这个问题的时候,我发现这个问题并不是想的那么简单,而且想地越深会感觉细节的东西会越来越多的盲点。我开始查阅一些资料,来试图更好地回答这个问题(本人可能在很多地方理解有误,希望大家指出错误共同进步!)。

从宏观的角度看并不难理解其工作方式。下图是他们之间的结构关系图。




从上图可以看出,CPU与硬盘之间不直接进行数据的交换,他们之间数据的交换中介为内存,换句话说,需要的CPU处理的数据全部存放在内存里面(也就是平时所说的主存储器),也就是说当硬盘里的数据需要做处理的时候,数据首先需要被放到内存里面,然后CPU再去读取内存里的数据并进行处理处理完之后存回内存。(例如当你在用word 写一个文档时,你在写的时候底层的CPU也在不断的处理着数据,当然它在处理是01串,有些人会说我在写文档又没有进行实际的计算,怎么CPU会在运转呢?其实你想一个简单的问题,为什么你在写的时候为什么光标在不断的移动?至少它在计算你的位置对吧。可能这比喻并不严谨,但是这个简单问题却说明了处理器确实是在做着各种运算,此时的数据是在内存里面的,如果你不保存掉电之后你会发现之前写的东西都没了,而当你保存之后数据会被存放到硬盘里面,掉电之后数据还在!)

咱们再来看Cache,Cache的工作原理是由于程序访问的局部性。那有人可能会问什么是程序访问的局部性?对大量典型的程序运行情况分析表明,在一个较短时间间隔内,由程序产生的地址往往集中在存储器逻辑空间地址的很小范围内。依据局部性原理原理,可以在主存和CPU之间设置一个高速而容量相对较小的存储器(Cache),把正在执行的指令地址附近的一部分指令或数据从主存调入到这个存储器,供CPU在一段时间内使用。这对提高程序的运行速度有很大的作用。

CPU对存储器进行数据请求时,通常会先去访问Cache。由于局部性并不能保证所请求的数据百分百在Cache中,这里就出现了一个描述可能性的名词,那就是命中率,当CPU访问的数据在Cache里面时,我们说Hit(命中),这时就会直接把Cache里的数据读到CPU里面(路线2)。当需要的数据没有在Cache里时,这时我们说Miss。CPU会去主存里面找,找到之后把数据从主存读到CPU寄存器里同时也会把数据写到Cache中,也就是上图的路线1(写到Cache)和路线3。当然我这里话的Cache是一个简单的图示,现在大多数为多级Cache,而且现在大多数Cache都会在CPU中。


推荐阅读
author-avatar
陈爱梅志杰力凯
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有