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

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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

mysql set语句_MySQL Prepared语句简介

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

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

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

nginx https透明代理_Nginx反向代理https,配置lets-encrypt证书教程

前言本站也终于迁移到https了,由于全Docker部署,迁移过程中真是艰难无比(wordpress那块被折腾的想放弃了),也欢迎访问本人博客,(知乎的排版有些乱)Nginx反向代理https,配置lets-encr…

nginx 一个请求发给多台机器_配置Nginx实现负载均衡

企业在解决高并发问题时,一般有两个方向的处理策略,软件、硬件,硬件上添加负载均衡器分发大量请求,软件上可在高并发瓶颈处:数据库web服务器两处添加解决方案,其中web服务器前面一层最常用的的添加负载方案…

怎么用记事本写java_如何用记事本写下第一个Java程序-Fun言

在刚学java的时候,刚开始并未接触类似于Myeclipse这类的编辑器,都是用记事本编写程序,这样虽然很慢,但是能让我们明白其中的原理,所以今天来教大家用记事本来写第一个java程序"Hello World!"准备…

ps发光插件_PS插件自定义区域发光真实辉光插件 Oniric Glow Generator for Photoshop【资源分享1444】...

AE特效PR剪辑C4D影视后期全世界只有不到1%的人关注了你是个很特别的人AE影视后期定期推送「AEPRC4D 影视特效合成 婚庆剪辑调色 电视广告包装 微电影制作 SpeedGrade达芬奇专业调色 摄影等」打造影视后期高端学习平台影视后期 ID:AEPRC4D9【PS插件信息】非常棒的一款…

python 退出_如果读完这篇文章不能让你入门Python,那我将永久退出编程界

(PS:文末福利赠送 无套路,真实有效!)Python是一种动态解释型的编程语言。Python可以在Windows、UNIX、MAC等多种操作系统上使用,也可以在Java、.NET开发平台上使用。【特点】1 Python使用C语言开发,但是Python不再有C语言中的指针…

unity 检测文本有没有自动换行_python3从零学习-5.1.5、文本自动换行与填充模块textwrap...

TextWrapper 模块提供了一些快捷函数,以及可以完成所有工作的类 TextWrapper 如果你只是要对一两个文本字符串进行自动换行或填充,快捷函数应该就够用了;否则的话,你应该使用 TextWrapper 的实例来提高效率。…

红黑树和平衡二叉树的区别_一文搞懂红黑树

文章参考 | https://segmentfault.com/a/1190000012728513前言当在10亿数据进行不到30次比较就能查找到目标时,不禁感叹编程之魅力!二叉树在了解红黑树之前,先要了解二叉树,又叫二叉查找树、二叉搜索树、二叉排序树。二叉树顾名思…

mysql table keys_MySQL Explain详解

在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做…

程序员肚子越来越大_肚子越来越大,除了肥胖还可能是疾病信号!腰间搓一搓,排出痰浊,消脂防病~...

☀ 定期推送健康知识,生活窍门,演出资讯,旅游信息,商家优惠等诸多优质内容,接地气、重服务的微信平台!关注我们妥妥没错!今天我们所说的“要命的肚子”就是一种肥胖,众所周知导致肥胖…

高级java技术web组件_(重温)JavaWeb--Servlet技术(二)(JavaWeb 的三大组件之一)...

1.HttpServletRequest 类a)HttpServletRequest 类有什么作用。每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。 然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletReq…

svm算法原理_机器学习——分类算法(1)

一、 K近邻KNN算法的基本思想就是在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K个数据,则该测试数据对应的类别就是K个数据中出现次数最多的那…

svn复制出来的java_从svn下载的项目(或从别处拷贝来的)报错的可能情况以及解决经验...

1、sdk版本不符合。举个栗子:如果svn上的项目是用sdk10的,但是你电脑上最低sdk是14的,那么这时候就会报错。解决办法:a、鼠标点击项目,b、快捷键“altenter”,c、左侧点击“Android”,右侧选中一…

spring揭秘_被问到了! Spring 和 Spring Boot 之间到底有啥区别?

相信很多小伙伴和我一样,常用Spring 和Spring Boot 但是就是没有研究二者之间到底有什么区别?今天就来大揭秘 ↓概述对于 Spring和 SpringBoot到底有什么区别,我听到了很多答案,刚开始迈入学习 SpringBoot的我当时也是一头雾水&am…

sql 删除最低分数_软件测试从业者:必备SQL语句21天打卡,前10天

一、价值:1. 根据这些年的经验,帮软件测试从业者精选出:1)日常工作中,需要用到的SQL语句;2)软测面试中,笔试 / 面试 ,需要用到的 SQL问题 & 答案 ;2. SQL这种硬技能 &#xff0c…

php两个手机号正则表达式_php 手机号码验证正则表达式

php 手机号码验证正则表达式比较简洁的代码一:$str ;$isMatched preg_match(/^0?(13|14|15|17|18)[0-9]{9}$/, $str, $matches);var_dump($isMatched, $matches);代码二//正则表达式$tel "15558530459"; //作者的手机号码,如果有疑问可以电话联系我,或…