深入理解计算机系统第四版_深入理解计算机系统之存储器层次结构

2285073f6aa7d616e225274633764a0f.png

我的计算机模型是这样的:

09603d3f89c2d396681032443656cff8.png

CPU执行指令,内存犹如一个巨大的字节数组,存储着指令和数据,硬盘保存着各种程序与程序用到的数据。I/O完成输入输出的功能。在本文中我们抛开I/O,谈一谈关于CPU,内存,硬盘的故事。

CPU包含了许多寄存器,用于保存临时使用的数据和指令。这是CPU可以访问到的最快的存储器设备,CPU可以在一个时钟周期内访问到它们。如果程序员理解了寄存器和内存是如何合作完成任务的,也就明白了冯诺依曼计算机的本质。举例来说:

int fun(void)
{int a;int b;int c;c=a+b;return c;
}

汇编代码

fun:pushl %ebp movl %ebp,%espsubl $16,%espmovl -8(%ebp),%eaxaddl -12(%ebp),%eaxmovl %eax,-4(%ebp)leaveret

变量a占用-8(%ebp),变量b占用-12(%ebp),变量c占用-4(%ebp)。

movl -8(%ebp),%eax

将变量b的值放入寄存器%eax中。

addl -12(%ebp),%eax

将%eax的值加上变量a的值。

movl %eax,-4(%ebp)

完成c=a+b的功能。

可以看出,程序将内存的值放入寄存器,进行运算,完成计算任务。其中,寄存器与内存亲密接触,完成计算任务。

作为存储设备CPU寄存器之下并不是内存,而是多级高速缓存。最多可以分为三级:L1高速缓存,L2高速缓存,L3高速缓存。它们是基于SRAM技术构成的高速缓存存储器,CPU可以在几个时钟周期中访问它们。L1快于L2,L2快于L3。高速缓存是不可编程的,是CPU设计者用硬件构造出来的。它们按照固定的算法完成缓存内存数据的任务。所以我在计算机抽象模型中忽略了它。它的基本原理是:根据要缓存的数据的地址读出一系列与该地址相同或是临近的的数据缓存起来。当再次访问或访问临近的数据时,缓存命中,CPU直接读取数据。如果读取其他地址,缓存不命中,CPU从下一层存储器中读取并缓存数据,如果下一层也没有就用下下一层,直到读取到数据。

为什么要用高速缓存存储器?因为程序有局部性原理。

局部性通常分为两种不同的形式:时间局部性和空间局部性。在一个具有良好的时间局部性的程序中,被引用过一次的存储器位置很可能在不远的将来被多次引用。在一个具有良好的空间局部性的程序中,如果一个存储器位置被应用了一次,那么程序很可能在不远的将来引用附近的一个存储器位置。所以如果数据或者指令被缓存高速缓存器,那么程序运行的速度将加快许多倍。

在说道内存,内存由动态RAM构成。内存可以看成是一个巨大的字节数组,根据地址可以访问到内存字节。而内存的每一个位都是由一个电容和一个访问晶体管组成。但它很容易漏电,使得DRAM单元在10-100毫秒时间内失去电荷。所以存储器必须周期性的通过读出然后重新刷新存储器的每个位。DRAM芯片包装在存储器模块中,他是插到主板的扩展槽中的。常见的包装包括168个引脚的双列直插存储器模块,它以64位为块传送数据到存储器控制器和从存储器控制器传出数据。还包括72个引脚的单列直插式存储器模块,它以32位为块传送数据,增强型DRM有:快页模型DRAM,扩展数据输出DRAM,同步DRAM,双倍速率同步DRAM,视频RAM。

内存之下是硬盘。如果程序需要的数据是存储在CPU寄存器的,那么1个周期便能访问到它们。如果存储在高速缓存中,需要1-30个周期。如果存储在主存中需要50-300个周期。而如果存储在磁盘中,需要大约几千万个周期。是的,磁盘就是这么慢。所以linux内核中构建了一层高速缓存器。使用内存来缓存磁盘的内容。内核以4KB为一个块,使用散列表的方式根据磁盘的块号散列在内存中。

磁盘由盘片构成,每个盘片由两面或称为表面,表面覆盖着磁性记录材料。磁盘通常包含一个或者多个这样的盘片,并封装在一个密封的容器内。

磁盘表面由一组称为磁道的同心圆组成。每个磁盘被划分为一组扇区。所有盘片表面上到主轴中心的距离相等的磁道称为柱面。

固态硬盘是一种基于闪存的存储技术,在某些情况下是传统旋转磁盘的极有吸引力的替代品。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/501894.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql8支持myISAM_mysql8 参考手册--优化MyISAM表

MyISAM存储引擎在以读为主的数据或低并发操作中表现最好,因为表锁限制了同时执行更新的能力。在MySQL中,InnoDB是默认的存储引擎,而不是MyISAM。优化MyISAM查询一些加快MyISAM表查询的一般技巧 :为了帮助MySQL更好地优化查询&…

python的模块提供了许多文件处理方法_详解使用Python处理文件目录的相关方法

所有文件都包含在各个不同的目录下,不过Python也能轻松处理。os模块有许多方法能帮你创建,删除和更改目录。mkdir()方法可以使用os模块的mkdir()方法在当前目录下创建新的目录们。你需要提供一个包含了要创建的目录名称的参数。语法:os.mkdir…

mysql替换json的key_mysql中json_replace函数的使用?通过json_replace对json对象的值进行替换...

需求描述:在看mysql中关于json的内容,通过json_replace函数可以实现对json值的替换,在此记录下.操作过程:1.查看带有json数据类型的表mysql> select * from tab_json;-------------------------------------------------------------------------------------------| id | d…

python中的array函数作用_Python中的Array | 数组2(简介和功能)

相关文章:Python中的数组Array | 1(简介和功能)以下是更多函数。1. typecode:此函数返回初始化数组所用的数据类型。2. itemsize:此函数返回单个数组元素的大小(以字节为单位)。3. buffer_info():返回一个元组,表示存储…

java生成pdf_JAVA 生成PDF 并导出

/***首先啥也不干,先写一个转换中文的方法,话说谁要整一个全英文数字的就不* 要写这个方法了....*str :要转换的内容 c:字体大小*/private static Paragraph getChinese(String str,int c) throws DocumentException, IOException{ BaseFont …

python爬取今日头条的文章_Python3爬取今日头条有关《人民的名义》文章

Python3爬取今日头条有关《人民的名义》文章最近一直在看Python的基础语法知识,五一假期手痒痒想练练,正好《人民的名义》刚结束,于是决定扒一下头条上面的人名的名义文章,试试技术同时可以集中看一下大家的脑洞也是极好的。首先&…

java jmeter_使用Jmeter中的Java Request进行性能测试

在使用jmeter进行性能测试的时候,有可能会需要通过一些脚本去测试性能,(比如通过sokeeper的api去测试sokeeper的读写性能)。这时,我们可以通过Java Request实现,以下是操作步骤。首先创建一个maven project。因Jmeter的Java Reque…

python虚拟环境 pyenv_Python 虚拟环境 pyenv、venv(pyvenv)、virtualenv之间的区别

请参考连接 https://blog.zengrong.net/post/2167.htmlhttps://blog.csdn.net/lanonjj/article/details/51050212为避免链接失效,把原文做了复制黏贴另外在python3.6中,虚拟应该用如下命令创建python3 -m venv /path/to/new/virtual/environment直接用py…

java resources 目录_[Java] 在 jar 文件中读取 resources 目录下的文件

注意两点:1. 将资源目录添加到 build path,确保该目录下的文件被拷贝到 jar 文件中。2. jar 内部的东西,可以当作 stream 来读取,但不应该当作 file 来读取。例子新建一个 maven 目录App.java 用于读取 resources 中的 a.txt 内容…

m.2接口和nvme区别_m.2 nvme和m.2有区别吗?

m2接口有两种,一种走sata的,另外一种走pcie(就是nvme)的。走sata的速度跟传统sata接口的没区别,就是接口变成了m2的了。走pcie的,就是我们说的nvme接口是m2的,性能也强了。M.2接口有SATA也有NVMe PCIe协议。这个是同一…

python编程软件排行榜_Python编程开发工具:这10个对Web开发者最有用的Python包

Python编程一时间成为了开发人员最喜欢的语言之一。无论是专业的,业余的,还是作为一个Python初学者,都可以从Python编程语言及其程序包中受益。Python已经被证明是当今最具活力的面向对象的编程语言之一。这就是为什么即使是一些很优秀的公司…

java excel 字体大小_Java将数据按列写入Excel并设置格式(字体、背景色、自动列宽、对齐方式等)...

/*** 按列写入Excel并设置格式**paramoutputUrl* 输出路径*paramsheetName* 工作薄名称*paramtitles* 表头*paramarrayList* 表头数据*throwsIOException*throwsRowsExceededException*throwsWriteException*/public static voidwriteExcel(String outputUrl, String sheetName…

如何查看cplex的help文档_word查看技巧:如何快速找到文档的修改痕迹

不知道大家在工作中有没有遇到过这类的工作场景:当初步拟好一份合作协议或是项目策划书后,发给老板或其他同事审阅和修订,通常会不断地来回修改文档。此时,如果你想要查看文档哪里被修改过?你会怎么操作?很…

java将数字替换为空_将数字替换为java中正确位置的单词

实际上我正试图用用户给出的句子中的数字替换为单词.本案例日期格式;例如:我的生日是在16/6/2000,我是java的新手 – >成为—>我的生日是七月十六日,我是java的新手这是代码:Scanner reader new Scanner(System.in);System.out.println("Ent…

java重载this_Java的this关键字的使用与方法的重载相关知识

Java this关键字详解this 关键字用来表示当前对象本身,或当前类的一个实例,通过 this 可以调用本对象的所有方法和属性。例如:public class Demo{public int x 10;public int y 15;public void sum(){// 通过 this 点取成员变量int z this…

python 类和对象 经常用吗_python基础教程之对象和类的实际运用

我们熟悉了对象和类的基本概念。我们将进一步拓展,以便能实际运用对象和类。调用类的其它信息中提到,在定义方法时,必须有self这一参数。这个参数表示某个对象。对象拥有类的所有性质,那么我们可以通过self,调用类属性…

java get properties_Java.lang.System之getProperties()方法

Environmentjava.vm.version——>25.60-b23java.vm.vendor——>Oracle Corporationjava.vendor.url——>http://java.oracle.com/idea.launcher.port——>7533java.vm.name——>Java HotSpot(TM) 64-Bit Server VMfile.encoding.pkg——>sun.iouser.country—…

mysql set语句_MySQL Prepared语句简介

之前的MySQL版本4.1,查询以文本格式发送到MySQL服务器。 之后,MySQL服务器使用文本协议将数据返回给客户端。MySQL必须完全解析查询,并将结果集转换为字符串,然后再将其返回给客户端。 文本协议具有严重的性能问题。为了解决这个问…

java resultset close_java代码ResultSet is closed

我用的Eclipse开发工具写java代码,连接的是SQLServer2000。提示ResultSetisclosed代码如下:privatestaticvoidgetDBConnection(){try{Class.forName(strName);connDriverManager.ge...我用的Eclipse开发工具写java代码,连接的是SQL Server 20…

三同轴连接器_一种毫米波频段微带同轴转换结构

在微波电路中,同轴电缆和微带线是微波系统中常见的两种微波传输线,同轴电缆以其频带宽、屏蔽性好、结构简单、可弯曲等特性,常被用作模块或系统之间连接的传输线。在高频段,微带线是混合微波集成电路(Hybrid Microwave Integrated…