谈谈计算机上的那些存储器-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数据导出的功能的测试.程序以前有同事写好了,但当我进行修改调试的时候,问题就出来了. 调试的时 ...
随机推荐
- Nginx主配置参数详解,Nginx配置网站
1.Niginx主配置文件参数详解 a.上面博客说了在Linux中安装nginx.博文地址为:http://www.cnblogs.com/hanyinglong/p/5102141.html b.当 ...
- Bootstrap组件之响应式导航条
响应式导航条:在PC和平板中默认要显示所有的内容:但在手机中导航条中默认只显示“LOGO/Brand”,以及一个“菜单折叠展开按钮”,只有单击折叠按钮后才显示所有的菜单项. 基础class: .nav ...
- js基础知识梳理(最简版)
基础的JavaScript知识,只放XMind截图.小白 JS01 JS02 JS03 最基础的js知识--!
- iOS UITableView的使用 (选自oschina)
1.新手篇创建tableView http://my.oschina.net/joanfen/blog/203041 2.进阶篇列表中行的操作 http://my.oschina.net/jo ...
- We refined export to Excel for SharePoint
http://sysmagazine.com/posts/208948/ http://sharepointwikipedia.blogspot.kr/2013/05/export-to-spread ...
- VS2012 Unit Test —— 我对接口进行单元测试使用的技巧
[题外话] 对单元测试不熟悉的童鞋可参照我之前写过的两篇博文: <在Visual Studio 2012使用单元测试>. <VS2012 单元测试之泛型类(Generics Unit ...
- Intent属性详解二 Action、Category
先看效果图: 1.Action:该activity可以执行的动作 该标识用来说明这个activity可以执行哪些动作,所以当隐式intent传递过来action时,如果跟这里<intent-fi ...
- iOS 疑难杂症 — — Swift debugger 无法在控制台 po 变量值的问题
前言 这个问题出现有好几个月了,一直没弄,以为是 Xcode 的问题后面版本升级应该就能好所以就不管了,今天心情好顺便查了一下. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://w ...
- GCD定时器
// // ViewController.m // GCD 定时器 // // #import "ViewController.h" NSInteger count = ; @in ...
- 在xib中用KVC修改控件属性
比如我们想在xib 中设置按钮的圆角,这样的话我们就可以在xib文件中进行修改,具体操作如下 实现效果,如下