内存——CPU、内存以及磁盘是如何交互的

2023-05-16

文章目录

  • 内存的存储
    • SRAM
    • DRAM
    • DRAM内部以及与内存控制模块的交互(重点)
    • DRAM与内存存储
    • CPU和内存的交互(重点)
  • 磁盘
    • 磁盘和CPU、内存的交互
  • 局部性
  • 参考文献

之前在介绍linux——文件的时候讲了一下磁盘及其工作原理。然后又在程序员自我修养专栏讲了一下程序在内存中的布局。但是我们还是没有打通CPU和内存是怎么进行交互这一件事。这也是本文的一个目的。

内存呢,是存在于CPU和硬盘之间的一个桥梁。硬盘负责存储数据,CPU负责对数据进行操作。而内存呢,则是他们两个的缓冲区。要明白内存是如何和CPU甚至和磁盘交互的,就不得不先看一下内存的储存器。

内存的存储

内存的存储器叫做随机访问存储器,一般分为两类:

  • 静态SRAM
  • 动态DRAM

SRAM 比 DRAM更快,但是也贵的多。SRAM用来作为高速缓冲存储器,一般用在CPU上。对!告诉缓存Cache就是SRAM。而DRAM 则用来作为主存以及图形系统的帧缓冲区。

SRAM

SRAM 将每个位存储在一个双稳态的存储单元里。什么叫双稳态呢?看下面这幅钟摆图:
在这里插入图片描述

每个单元都是用六个晶体管电路来实现的。这个电路有这样一个特性:可以无限期保持在两个不同的电压状态,也就是在上图左(右)稳态。其他任何状态都是不稳定的——从不稳定状态开始,电路会迅速的转移到两个稳定状态中的一个

上图其实有个地方应该是有偏差的,也就是中间那个状态。原则上来说,当左右两边的作用力相同时,钟摆在垂直的时候也能无限期地保持平衡,但是当左右两边稍微发生一点扰动,这个状态就会变成左稳态或右稳态之一。而且一旦倒下,便不会有机会再站起来。我们称这个状态为亚稳态

因为SRAM有双稳态的特性,只要有电,它就会永远的保持它的值即使有干扰来扰乱电压,当干扰时,电路就会恢复到稳定值。但是没有电的话,双稳态的状态就不能保持了,意味着数据也就丢失了。这就是我们常说,电脑断电后内存数据就会丢失的原因。

DRAM

DRAM将每个位存储为对一个电容的充电。DRAM可以制造得非常密集——每个单元由一个电容和一个访问晶体管组成。但是与SRAM不同的是,DRAM存储器的单元对干扰非常敏感。当电容的电压被扰乱之后,它就永远不会恢复了。

下图总结了SRAM和DRAM的区别。

  • SRAM的存取比DRAM快
  • SRAM对干扰不敏感
  • SRAM每单元使用更多晶体管,密集度低,比DRAM更贵,功耗更大
    在这里插入图片描述

DRAM内部以及与内存控制模块的交互(重点)

再DRAM芯片中,每个大单元内部又有d个超单元,每个超单元都由w个DRAM单元组成(每个单元其实就是一个位)。所以说,一个d*w的DRAM总共村拿出了dw位信息。超单元被组织成一个r行c列的长方形阵列,其中r*c = d,每个单元有形如(i,j)的地址(i表示行,j表示列)。
在这里插入图片描述

博主说:
还是有点抽象,这么说吧。假如说w = 8,也就是一个超单元存储一个字节,那么d个超单元就存储d个字节。

信息通过称为引脚(pin)的外部连接器流入和流出芯片。每个引脚携带一个1位的信号。上图中给出了两组引脚:

  • 8个data引脚,他们能传送一个字节到芯片或从芯片传出一个字节
  • 2个addr引脚,它们能携带2位的行和列超单元地址

每个DRAM芯片被连接到某个称为内存控制器的电路。这个电路可一次传送(读出)w位到每个DRAM芯片。为了读出超单元(i,j)的内容,内存控制器会将行地址 i 发送到DRAM,这个时候就会在超单元矩阵中选出 i 那一行,复制到内部行缓冲区
在这里插入图片描述
然后地址引脚addr会把列地址 j 传入,这个时候会在刚刚选出的哪一行中再选出第 j 个元素返回给内存控制器以相应。
在这里插入图片描述
设计者把DRAM组织成二维阵列而不是我们平常抽象出的一维数组的原因是降低芯片上地址引脚的数量。例如,图中的那个128位的DRAM被组织成一个16个超单元的线性数组(16*8 = 128),这个时候对引脚进行编号,那就是0~15,正好是2^4,需要四个addr引脚而不是两个addr引脚。但是,二维阵列会进行两步操作,所以它会比线性组织耗费更多的时间

DRAM与内存存储

DRAM 芯片被封装在内存模块(一个内存模块会有多个DRAM),以64位为块传送数据到内存控制器

下图展示了内存模块的基本思想,用8个64Mbits的8M*8的DRAM芯片,总共存储64MB,这8个芯片编号0~7。每个超单元存储主存的一个字节,而用相应超单元地址(i,j)的8个超单元来表示主存中字节地址A处的64位字

博主说:
其实也就是A的第一个字节存储在DRAM 0的(i,j)位置,第二个字节存储在DRAM 1的(i,j)位置…

在这里插入图片描述
要取出内存地址A处,那么就去每个DRAM的(i,j)处去取这个相应的字节再拼装起来。

CPU和内存的交互(重点)

CPU和内存交互,内存在内部其实就反应在内存控制模块和DRAM的交互。

数据流通过总线的电子电路在处理器和DRAM主存之间来来回回。 每次CPU和主存之间的数据传送都是通过一系列步骤来完成,这些步骤称为总线事务。 其中读事务从主存传送数据到CPU,写事务从CPU传送数据到主存

下图中就是一个他们之间交互的一个图:
在这里插入图片描述

我们现在再从一个汇编指令来看看到底怎么回事:movq A,%rax(地址A的内容被加载到寄存器%rax中)

上图中的总线接口发起读事务,有三个步骤:

  • CPU将地址A放到系统总线上
  • IO桥将信号传递到内存总线
  • 主存感觉到内存总线上的地址信息,从内存总线读地址,从DRAM取出数据放到内存总线
    在这里插入图片描述

写事件呢,就相反。

磁盘

磁盘的存储基本知识再linux——文件中都讲过了,这里也不赘述了。直接来讲一讲CPU如何去访问磁盘的。

磁盘和CPU、内存的交互

CPU使用一种称为内存映射I/O的技术来向I/O设备发送命令。在使用内存映射I/O的系统中,地址空间中有一块地址是为与I/O设备通信保留的。每个这样的地址称为I/O端口

来看一个简单的例子:
假设磁盘控制器映射到端口0xa0。随后,CPU通过执行三个对地址0xa0的存储指令发起磁盘读:

  • 发送一个命令字,告诉磁盘发起一个读,其中还发送了其他参数
  • 指明应该读的逻辑块号
  • 指明应该存储磁盘扇区内容的主存地址

当CPU发出请求之后,它可不会采用同步的方式,这是对CPU性能的极大浪费。它会先处理其他的事情。
而磁盘收到这么一个读命令,它将逻辑块号翻译成一个扇区地址,读该扇区的内容,然后将这些内容传送到主存,这期间不需要CPU的干涉。这个过程就叫直接内存访问。当数据到主存之后,CPU就会发送一个中断信号来通知CPU。

博主说:
还不知道中断是什么的,可以参考博客:系统调用过程
这里面讲了软中断,但实际上磁盘应该属于硬中断,差不太多,理解就可。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

局部性

一个程序倾向于引用临近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身。这中倾向就称为局部性原理

局部性常常有两种不同的形式:

  • 时间局部性: 在良好时间局部性的程序中,被引用过一次的内存位置可能在不远的将来再被多次引用
  • 空间局部性: 在良好空间局部性的程序中,被引用过一次的内存位置的附近位置可能在不远的将来被引用

参考文献

[1] 深入理解计算机系统 第六章 存储器层次结构
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

内存——CPU、内存以及磁盘是如何交互的 的相关文章

  • 小小程序员的一周日报

    工作依旧在有条不紊的进行着 xff0c 一周的时间很快就会过去 xff0c 正如今天李哥所说的 xff0c 这一周还没有感觉怎么过呢 xff0c 就结束了 是啊 xff0c 这就是我们的工作 xff0c 程序员的工作 xff0c 软件设计师
  • 项目空间都有啥

    项目空间是什么 xff0c Workplace 答案是 xff1a No 项目空间是由项目负责人提出的实施某项目方案的一种流程 项目空间是XX海油ERP管理系统下的一个业务 xff0c 项目负责人通过创建项目名称 项目负责人 使用资源 所属
  • 你不要瞧不起Ctrl+C

    曾经 xff0c 在我未参加工作之前 xff0c 我认为靠 Ctrl 43 C 来完成工作的人 xff0c 肯定是懒惰的程序员 xff0c 但是现在我发现我错了 xff0c 而且是彻底的错了 能够通过 Ctrl 43 C 来完成工作的人 x
  • 文档交接说明书(模板)

    因为同事的离职 xff0c 我的入职 xff0c 要从同事手中交接过来一些项目 公司里只有一些开发文档相关的模板 xff0c 并没有文档交接相关的模板 xff0c 所以交接文档的模板也就由我们自己来定 我结合自己在工作中的经验 xff0c
  • UDS网络层/TP层(ISO 15765-2)的解读

    本文是对 ISO 15765 2 2011 协议的一些解读 需要指出该协议的最新版为2016版 TP层存在意义 UDS网络层 xff0c 又称为TP层 xff08 Transport Protocol Layer xff09 其存在的目的是
  • std vector传递指针使用说明

    今天用WM COPYDATA传递一个Vector的指针 xff0c 传递过来始终失败 后面找到一篇文章 xff0c 说只要传递第一个元素的地址就行 xff0c 因为vector在内存是连续的 static std vector lt UIm
  • Leetcode之运算库函数自定义

    一 Leetcode50 pow 注意点 1 n的值可以为正 xff0c 负 xff0c 0 2 O n 会TLE xff0c 使用递归时 xff0c 一定要将中间步保存 3 有博文中提到 xff0c 若n lt 0 xff0c 可以令n
  • 树莓派无键盘安装步骤

    树莓派无键盘安装 下载系统烧录系统配置无线网络开机并连接树莓派更新源和系统安装xrdp xff08 远程访问 xff09 Windows连接远程桌面 下载系统 应该只有官方的Raspbian系统支持无键盘安装 xff0c 官网下载系统 xf
  • iic实现采集温湿度传感器值

    iic h ifndef IIC H define IIC H include 34 stm32mp1xx gpio h 34 include 34 stm32mp1xx rcc h 34 通过程序模拟实现I2C总线的时序和协议 GPIOF
  • Matlab在线运行网站

    桌面版的Matlab不仅安装包很大 xff0c 而且也很吃性能 xff0c 不如就用网页版 xff0c 来玩啊 xff01 https www tutorialspoint com execute matlab online php 点击c
  • An Introduction on Deep Learning for the Physical Layer

    An Introduction on Deep Learning for the Physical Layer 代码实现 xff1a https github com shengjian3476077 DLforPhy 一 文章的主要工作
  • motion planning 一起学习

    shenlan 学院 motion planning 一起学习 打算买深蓝的motion planning for Mobile robots xff0c 主要是讲规划算法的 xff0c 有无一起学习的小伙伴 xff1f 一起学习 xff0
  • 【java面试之Linux】Linux启动过程、

    一 Linux启动过程 启动第一步 xff0d xff0d 加载BIOS 启动第二步 xff0d xff0d 读取MBR 主引导记录 启动第三步 xff0d xff0d Boot Loader 启动第四步 xff0d xff0d 加载内核
  • Linux SPI 驱动示例

    一 Linux 下 SPI 驱动框架 SPI 驱动框架分为主机控制器驱动和设备驱动 xff0c 主机控制器也就是 SOC 的 SPI 控制器接口 1 1 SPI 主机驱动 SPI 主机驱动就是 SOC 的 SPI 控制器驱动 xff0c L
  • 使用 FFmpeg 推流,使用 VLC 软件进行拉流

    1 移植Nginx到开发板 xff0c 使用 Nginx 来搭建 RTMP 流媒体服务器 2 执行如下命令进行推流 xff1a ffmpeg re i run media mmcblk1p1 testVideo mp4 c av copy
  • MPC与LQR的详细对比分析

    从以下几个方面进行阐述 xff1a 一 xff0c 研究对象 xff1a 是否线性 二 xff0c 状态方程 xff1a 离散化 三 xff0c 目标函数 xff1a 误差和控制量的极小值 四 xff0c 工作时域 xff1a 预测时域 x
  • 类类型成员引用的问题

    一个类中的成员变量是另一个类的类类型 xff0c 赋值问题分为引用 xff0c 不引用两类 如先定义TESTB类 class TESTB public TESTB b 61 3 7 TESTB void change b 61 9 0 fl
  • FutureTask的用法及两种经常使用的使用场景

    FutureTask可用于异步获取执行结果或取消执行任务的场景 经过传入Runnable或者Callable的任务给FutureTask xff0c 直接调用其run方法或者放入线程池执行 xff0c 以后能够在外部经过FutureTask
  • 二维线性插值方法

    前几天在进行数据仿真的时候 对于将表格离散数据转化成连续数据一直是一件十分棘手的事情 xff0c 在网站上找了许多资源最后才找到可以利用二维线性插值的方法将数据进行转化 1 原理 是要将 m n m times n m n 的二维数据如下图
  • 【转载】Matlab中LMI(线性矩阵不等式)工具箱使用教程

    64 TOC 转载 原文地址 xff1a https www cnblogs com Hand Head articles 5412511 html 这一段被老板逼着论文开题 xff0c 自己找方向比较着急 xff0c 最后选择了供应链控制

随机推荐

  • Python各类常用库整理

    一 20个必不可少的Python库也是基本的第三方库 Requests Kenneth Reitz写的最富盛名的http库 每个Python程序员都应该有它 Scrapy 如果你从事爬虫相关的工作 xff0c 那么这个库也是必不可少的 用过
  • Matlab中LMI(线性矩阵不等式)工具箱使用例子

    我搜出来的都是一些简单的算例 xff0c 并且机会没有中文教程 xff0c 我在这里就斗胆把自己的体会写出来 xff0c 试着给大家提供一点参考 LMI xff1a Linear Matrix Inequality xff0c 就是线性矩阵
  • 转--ICEM CFD中合并多个网格

    原址 xff1a http www jishulink com content post 359975
  • 【转】无人机故障数据集ALFA: A Dataset for UAV Fault and Anomaly Detection

    这里写自定义目录标题 无人机故障数据集资源地址 xff1a https kilthub cmu edu articles dataset ALFA A Dataset for UAV Fault and Anomaly Detection
  • 【转】无人机小课堂:无人机的副翼、俯仰、偏航、油门代表什么?

    刚刚接触无人机的小伙伴 xff0c 经常会听到很多英文缩写 xff0c 如AIL ELE RUD THR等 xff0c 一不小心就会傻傻分不清 但它们却经常出现在各种遥控器 飞控 调参软件中 xff0c 因为它们是无人机 航模中最基础的四个
  • 多弹多约束协同制导问题

    参考文献 xff1a 张达 刘克新 李国飞 多约束条件下的协同制导研究进展 J 南京信息工程大学学报 自然科学版 2020 12 05 530 539 DOI 10 13878 j cnki jnuist 2020 05 002 多导弹协同
  • 浅谈设备驱动的作用与本质,有无操作系统Linux设备驱动的区别

    一 驱动的作用 任何一个计算机系统的运行都是系统中软硬件协作的结果 xff0c 没有硬件的软件是空中楼阁 xff0c 而没有软件的硬件则只是一堆废铁 硬件是底层基础 xff0c 是所有软件得以运行的平台 xff0c 代码最终会落实为硬件上的
  • 【转】多智能体系统一致性问题概述

  • 【转】从自然基金面上项目只许列10篇代表作说起

    作者 xff1a 喻海良 xff0c 字之亮 xff0c 2018年2月13日于北京沙河 关于建设 双一流大学 过程中 xff0c 我们作为大学教师该如何看待学术论文的讨论已经有很多了 个人觉得论文数量是基础 xff0c 一个大学教授的课题
  • 盘点 | 单目视觉3-D目标检测经典论文(附解读)

    2020年以来出现的一些单目视觉3 D目标检测的论文 本文针对部分典型的论文要点进行要点解读 xff0c 仅供参考 Towards Generalization Across Depth for Monocular 3D Object De
  • IBM的云平台Bluemix使用初体验-创建第一个容器

    概述 第一次使用IBM的云平台Bluemix xff0c 写一个blog记录一下 我注册Bluemix挺早的 xff0c 但是在工作中一直没有机会使用IBM的云平台 现在辞职创业 xff0c 做自己喜欢的互联网 xff0c 终于有机会用上了
  • 在Source Insight中添加对.cc的支持

    Options gt Document Options Document Type gt 下拉选择 xff1a C 43 43 Source File 在File Filter 中加入 cc
  • Android HFP流程记录

    DP 完成后 xff0c btif dm c文件中 xff0c btif dm search services evt函数 xff0c bond state changed BT STATUS SUCCESS amp bd addr BT
  • OPP文件传输

    在RFCOMM连接后 xff0c 进行Command Type Parameter Negotiation时 xff0c 会协商Credits初始值 建立OBEX连接时 xff0c 会将poll bit设置 xff0c 用于Given Cr
  • 算法——欧几里得算法

    目录 欧几里得算法算法原理欧几里得算法的代码表示 参考文献 欧几里得算法 欧几里得算法是用来求两个正整数最大公约数的算法 古希腊数学家欧几里得在其著作中 The Elements 中最早描述了这种算法 xff0c 所以叫欧几里得算法 a s
  • 算法——100瓶水,一瓶有毒,有一种试纸...

    问题描述 100瓶水 xff0c 一瓶有毒 xff0c 有一种试纸 xff0c 不过需要一个小时才能出结果 xff0c 问最少需要几片试纸才能在一小时内找到有毒的那一瓶 答案 span class token number 7 span 算
  • 基于muduo网络库的集群聊天系统(C++实现)

    文章目录 项目概述业务流程 数据模块表的设计数据库模块设计 通信格式网络和业务模块网络模块网络模块和业务模块解耦合业务模块注册业务登录业务加好友业务一对一聊天业务创建群业务加入群业务群聊业务注销业务 服务器集群跨服务器通信集群聊天服务器的思
  • linux设备驱动原理与本质

    任何计算机系统都是软件和硬件的结合体 xff0c 如果只有硬件而没有软件 xff0c 则硬件是没有灵魂的躯壳 xff1b 如果只有软件没有硬件 xff0c 则软件就是一堆无用的字符 在底层硬件的基础上 xff0c 操作系统覆盖一层驱动 xf
  • pycharm配置可视化界面流程简介

    一 安装QT Designer 在pycharm的终端里面输入如下命令 span class token comment 安装pyqt5 span pip install PyQt5 span class token comment 安装p
  • 内存——CPU、内存以及磁盘是如何交互的

    文章目录 内存的存储SRAMDRAMDRAM内部以及与内存控制模块的交互 xff08 重点 xff09 DRAM与内存存储CPU和内存的交互 xff08 重点 xff09 磁盘磁盘和CPU 内存的交互 局部性参考文献 之前在介绍linux