谈谈计算机上的那些存储器-Memory Hierarchy
文章首发于浩瀚先森博客http://www.guohao1206.com/2016/12/07/1248.html
说到计算机上的存储器,很多人第一反应是硬盘,然后是内存。
其实在计算机上除了硬盘和内存属于存储器以外CPU寄存器和Cache他们也是属于一类的。
对于存储器我们在乎的无外乎两个属性----“快”和“大”,我们希望存储器容量越大越好,传输速度越快越好,然后鱼和熊掌不能兼得。由于现在硬件技术的限制,我们能制造错容量虽小但是速度很快的存储器,也可以制造出容量大但是读取速度相对慢的存储器,但是不能制造出容量大而且速度也快的存储器(当然这是我们希望的)。所以在现代计算机中我们把存储器分为若干级别,称为Memory Hierarchy。按照距离CPU由近到远的顺序依次是CPU寄存器 –> 一级Cache –> 二级Cache –> 内存 –> 硬盘

1. CPU寄存器
CPU寄存器是距离CPU最近的一个存储器,因为它就位于CPU执行单元中(CPU执行单元,CPU核,CPU芯片抽象点描述的话大概如下图,参考)。它实际上就是一组数字电路的名字,由多个触发器(Flip-flop)组成。每个触发器保存一个Bit的数据。CPU寄存器掉电数据会丢失。它是访问速度最快的存储器,也是容量最小的存储器~CPU寄存器通常有几个到几十个,具体使用哪个寄存器是由指令决定的。

2. Cache
Cache访问速度也比较快,距离CPU执行单元也比较近,仅次于CPU寄存器,因为它不在CPU执行单元中,它在CPU核中,和MMU一样。Cache分为一级Cache和二级Cache,一级Cache离CPU更近些,容量比二级Cache要稍小点。二级Cache距离物理内存更近些。Cache和内存都是有RAM(Random Access Memory)组成,可以根据地址访问。不同的是Cache是由SRAM(Static RAM)组成,内存是由DRAM(dynamic ram)组成。DRAM容量比SRAM大,但是速度慢。
Cache的作用是缓存最近访问过的内存数据。当CPU要访问内存数据的时候,会发给个Virtual Address,这个时候不会直接去访问内存拿数据,一级Cache会拿着这个地址在自己缓存的数据上查找是否存在这样的数据,如果存在就可以直接使用,因为一般Cache访问的速度是内存的几十倍,充分的利用Cache的话可以最大化提高计算机性能。如果一级Cache上没有找到缓存数据并且计算机上还配置了二级Cache的话,这个时候二级Cache会根据MMU给的PA(physical address)查找是否存在缓存数据,如果仍然没有的话就只能访问内存了,但是访问内存数据的时候并不是说需要几个数据就拿几个数据,而是复制相邻的一段数据Cache Line缓存起来。一级Cache和二级Cache的区别在于一级Cache是根据VA查找数据,二级Cache根据PA查找的。Cache的所有操作都是由硬件进行的,并非指令!
3.内存
内存是位于CPU处理器芯片之外的一颗芯片,它与CPU通过地址和数据总线相连,利用地址进行访问,掉电数据也会消失。内存是由DRAM组成。
注意的地方:如果计算器启动MMU的话,程序指令的访问地址是VA,而访问内存的地址的PA,是经过MMU转化而来的。
4. 硬盘
硬盘大家都很数据,容量大,访问速度慢。驱动程序通过设备总线控制器访问。由于硬盘的访问速度慢,所以操作系统一般一次性读取硬盘几个页的数据缓存下来使用。另外硬盘掉电数据不会丢失~
参考:《计算机体系结构基础》
谈谈计算机上的那些存储器-Memory Hierarchy的更多相关文章
- 计算机科学基础知识(一)The Memory Hierarchy
一.前言 最近一个问题经常萦绕在我的脑海:一个学习电子工程的机械师如何称为优秀的程序员?(注:本文作者本科学习机械设计,研究生转到电子工程系学习,毕业后却选择了系统程序员这样的职业).经过思考,我认为 ...
- OpenRisc-39-ORPSoC,or1200的memory hierarchy整体分析
引言 前面我们简单分析了ORPSoC的整体结构,or1200_top的整体结构,or1200_cpu的整体结构. 并对ORPSoC的启动过程,ORPSoC的debug子系统,clock子系统进行了介绍 ...
- 您在基于 Windows 7 的或基于 Windows Server 2008 R2 的计算机上读取器中插入智能卡时出现错误消息:"设备驱动程序软件未能成功安装"
http://support.microsoft.com/kb/976832/zh-cn http://support.microsoft.com/kb/976832/zh-tw 症状 当智能卡插入智 ...
- 无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同。如果服务器位于远程计算机上,请检查。。。
异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 无法向会话状态服务器发出会话状态请求.请确保 ASP.NET State Ser ...
- 未在本地计算机上注册“Microsoft.Jet.OleDb.4.0”提供程序。解决办法
在64位服务器系统上,默认不支持Microsoft.Jet.OLEDB.4.0的驱动程序,系统默认会提示未在本地计算机上注册"Microsoft.Jet.OLEDB.4.0"的错误 ...
- 对路径的访问被拒绝,解决之后又报-未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序。
服务器环境:Server 2008 64位系统 问题:在导入Excel题录表时报错,1对路径的访问被拒绝,2未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序. 解决方案 ...
- Windows无法完成安装,若要在此计算机上安装Windows,请中心启动安装。
现在安装系统已经很简单了,我觉得U盘启动的话两步就差不多了, 壹:设置BIOS,将U盘启动作为系统默认启动选项 贰:直接进去大白菜之类的,一键安装... 今天终于看到第三部了, 报错:Windows无 ...
- 关于C#联接数据库是出现'未在本地计算机上注册'错误的解决办法
今天在用c#连接access数据库处理数据的时候遇到了一个诡异的问题, 未在本地计算机上注册"Microsoft.ACE.OLEDB.12.0"提供程序 我们的部分代码如下: st ...
- 也来说说关于未在本地计算机上注册“VFPOLEDB.1”的程序的解决方法
大家都知道VFP是一个非常古老的数据库.但是,还有一些单位用到这些数据库. 前段时间,也做了一个关于DBF数据导出的功能的测试.程序以前有同事写好了,但当我进行修改调试的时候,问题就出来了. 调试的时 ...
随机推荐
- An entity object cannot be referenced by multiple instances of IEntityChangeTracker 的解决方案
使用EF对建立了关系的表新增记录时出现: An entity object cannot be referenced by multiple instances of IEntityChangeTra ...
- Googlehack之Github hack
site:aircrk.com smtpsite:aircrk.com smtp @mail.comsite:aircrk.com root passwordsite:aircrk.com smtp ...
- Java—byte小结
1.声明byte[]数组: private static final byte[] XINTIAO = { (byte) 0xEE, (byte) 0x00 }; 2:将多个bute[]数组合并成一个 ...
- iOS之百度导航SDK的坐标转换
百度导航 iOS SDK的坐标转换代码示例,有需要的朋友可以参考下. //导航坐标--------------> 地图坐标 //假设从导航sdk取到了一个点坐标是(116.304847, 40. ...
- iOS之加密的三种方法
//需要导入 #import <CommonCrypto/CommonCryptor.h> ==============MD5加密============ NSString *str ...
- Android中asset和raw的区别
:assets 文件夹是存放不进行编译加工的原生文件,即该文件夹里面的文件不会像 xml, java 文件被预编译,可以存放一些图片,html,js, css 等文件.
- 如何给不支持新特性的浏览器打补丁(让老版本IE兼容新特性)
一个非常棒的 JavaScript 框架叫做 Modernizr(http://www.modernizr. com),用于向缺少 HTML5/CSS3特性支持的浏览器打补丁.由 Alexander ...
- Spark官方文档 - 中文翻译
Spark官方文档 - 中文翻译 Spark版本:1.6.0 转载请注明出处:http://www.cnblogs.com/BYRans/ 1 概述(Overview) 2 引入Spark(Linki ...
- linux小技巧
主机禁止ping: 修改/proc/sys/net/ipv4/icmp_echo_ignore_all 值为1 默认是0 echo '1' > /proc/sys/net/ipv4/icmp_e ...
- 再解java中的String
今天看到一篇文章中,写了关于java中的String.我看了后,是我从学java来觉得是最好的一篇关于String类的文章.看了这篇文章你就会对String的认识会提高一个层次.故将原作者的文章特意转 ...