内存与CPU:计算机默契交互的关键解析
内存
内存和CPU之间的交互是计算机体系结构中至关重要的一部分。它们之间的互动类似于一对不可分割的爱侣,彼此相互依赖且密不可分。没有内存,CPU无法执行程序指令,这样计算机就会变得毫无意义。同样地,如果只有内存而没有能够执行指令的CPU,计算机也无法正常运行。
总而言之,内存和CPU之间的交互是计算机正常运行的基础,它们相互依赖,共同完成计算机的各种任务。通过总线进行数据传输,以及通过缓存机制提高数据的访问速度,内存和CPU实现了高效的协作,使计算机能够快速、准确地执行各种指令和操作。
内存的物理结构
在掌握一个事物的理解之前,先要有所接触,这样才能形成印象,进而产生对其了解的兴趣。因此,为了更好地理解内存以及其物理结构,我们首先需要先观察并认识什么是内存以及它的具体构成。

为了更深入地了解内存以及其物理结构,我们需要了解内存的组成。内存内部由各种集成电路(IC)电路组成,其中有几种主要的存储器类型。
首先是随机存储器(RAM),这是内存中最重要的一种。RAM既可以读取数据,也可以写入数据。然而,当机器关闭时,内存中的信息会丢失。
其次是只读存储器(ROM),ROM通常只用于数据的读取,无法写入数据。但是当机器停电时,这些数据不会丢失。
还有一种常见的存储器是高速缓存(Cache),它分为一级缓存(L1 Cache)、二级缓存(L2 Cache)和三级缓存(L3 Cache)。高速缓存位于内存和CPU之间,是一个读写速度比内存更快的存储器。当CPU向内存写入数据时,这些数据也会被写入高速缓存中。当CPU需要读取数据时,会直接从高速缓存中读取。当然,如果需要的数据在缓存中不存在,CPU会再去读取内存中的数据。
内存集成电路是一个完整的结构,它内部还包括电源、地址信号、数据信号、控制信号以及用于寻址的IC引脚,这些都是用于数据的读写操作。下面是一个虚拟的IC引脚示意图。

在图中,VCC和GND代表电源,A0-A9是地址信号引脚,D0-D7代表数据信号,RD和WR是控制信号。我用不同颜色对它们进行了区分。将电源连接到VCC和GND后,其他引脚可以传递0和1的信号。通常情况下,+5V表示1,0V表示0。
我们都知道内存用于存储数据。那么这个内存IC中可以存储多少数据呢?D0-D7代表数据信号,也就是说,一次可以输入输出8位(1字节)的数据。A0-A9是10个地址信号,可以指定00000 00000到11111 11111共1024个地址。每个地址存放1字节的数据,因此我们可以得出内存IC的容量为1KB。
内存的读写过程
让我们把关注点放在内存 IC 对数据的读写过程上来吧!让我们来看一个模型,它展示了对内存 IC 进行数据写入和读取的过程。

为了详细描述这个过程,假设我们想要向内存 IC 中写入 1byte 的数据。下面是这个过程的详细步骤:
- 首先,将 VCC 连接到 +5V 的电源,将 GND 连接到 0V 的电源。
- 使用 A0 - A9 来指定数据的存储位置。
- 输入数据的值到 D0 - D7 的数据信号线。
- 将 WR(写入)信号置为1,表示执行写入操作。
- 执行完上述操作后,数据将被写入内存 IC。
要读取数据,只需要执行以下步骤:
- 通过 A0 - A9 的地址信号指定要读取数据的存储位置。
- 将 RD(读取)信号置为1,表示执行读取操作。
图中的 RD 和 WR 也被称为控制信号。当 WR 和 RD 都为 0 时,无法进行写入和读取操作。
内存的现实模型
为了更好地理解和记忆,我们可以将内存模型映射成现实世界中的楼房模型。想象一下,这个楼房代表内存,每一层楼可以存储一个字节的数据。楼层的编号就对应内存的地址。下面是一个将内存和楼层整合的模型图,让我们更好地理解内存的工作原理。

我们知道,程序中的数据不仅仅是数值,还有数据类型的概念。从内存的角度来看,每个数据类型在内存中占用的空间大小可以看作是楼层数。即使在物理层面上,我们以字节为单位来逐一读写内存数据,但在程序中,通过指定数据类型,我们可以实现以特定字节数为单位进行读写。
下面是一个示例程序,演示了如何以特定字节数为单位来读写指令字节:
// 定义变量
char a;
short b;
long c;
// 变量赋值
a = 123;
b = 123;
c = 123;
我们分别声明了三个变量 a, b, c,并给每个变量赋值为相同的 123。这三个变量代表了内存中的特定区域。通过使用变量,即使不指定物理地址,我们也可以直接进行读写操作,因为操作系统会自动为变量分配内存地址。
这三个变量分别表示 1 个字节长度的 char,2 个字节长度的 short,和 4 个字节长度的 long。虽然这三个变量存储的数据都是 123,但它们在内存中所占的空间大小是不同的。

在这个例子中,我们使用了低字节序列的方式将数据存储在内存中。这意味着数据的低位存储在内存的低位地址,而高位则存储在内存的高位地址。对于short和long类型的数据,由于123没有超过每个类型的最大长度,所以除了占用的内存空间外,其余的内存空间都被分配为0。这是因为操作系统会自动为变量分配内存地址,并且不同的数据类型在内存中占用的空间大小是不同的。
内存的使用
指针
加长优化语句:指针是C语言中非常重要的特性,它是一种变量,但与普通变量不同,它存储的不是数据的值,而是内存的地址。通过使用指针,我们可以读取和写入任意内存地址上的数据。
在了解指针读写的过程之前,我们需要先了解如何定义一个指针。与普通变量不同,我们通常在变量名前加一个"*"号来定义一个指针。例如,我们可以使用指针定义以下变量:
char *d; // char类型的指针 d 定义
short *e; // short类型的指针 e 定义
long *f; // long类型的指针 f 定义
加长优化语句:让我们以32位计算机为例来解释为什么变量d、e和f代表不同的字节长度。在32位计算机中,内存地址的长度是4字节,因此指针的长度也是32位(4字节)。
然而,变量d、e和f表示的是从内存中一次读取的字节数。假设这些变量的值都为100,那么使用char类型时,我们可以从内存中读取或写入1字节的数据;使用short类型时,我们可以从内存中读取或写入2字节的数据;而使用long类型时,我们可以从内存中读取或写入4字节的数据。
下面是一个完整的类型字节表,它展示了不同数据类型在内存中所占用的字节数:
| 类型 | 32位 | 64位 |
|---|---|---|
| char | 1 | 1 |
| short | 2 | 2 |
| int | 4 | 4 |
| float | 4 | 4 |
| double | 8 | 8 |
| long | 4 | 8 |
当涉及到指针和内存操作时,我们可以用图来更直观地描述数据的读写过程。

数组是内存的实现
数组是一种数据结构,它指的是多个相同数据类型的元素在内存中连续排列的形式。每个数组元素都可以通过索引来区分,索引即为元素的编号。通过索引,我们可以对数组中指定位置的元素进行读取和修改操作。
首先,让我们了解一下数组的定义方式。我们可以使用 char、short、long 等数据类型定义数组,并使用[value]来表示数组的长度,如下所示:
char g[100];
short h[100];
long i[100];
数组的数据类型决定了一次可以读写的内存大小。以 char、short、long 为例,它们分别占用 1、2、4 个字节的内存空间。
数组在内存中的实现与内存的物理结构完全一致。特别是在读写单个字节时,无论字节数是多少,都需要逐个字节进行读取或写入。下面是内存读写的过程。

数组是我们学习的第一个数据结构,我们都知道数组的检索效率非常高。至于为什么数组的检索效率如此快,这超出了本文的讨论范围。
总结
本文介绍了内存和CPU之间的交互以及内存的物理结构。内存和CPU的互动是计算机正常运行的基础,它们相互依赖,共同完成计算机的各种任务。内存由各种集成电路(IC)组成,包括RAM、ROM和Cache等存储器类型。内存的读写过程包括指定地址、输入输出数据和控制信号等步骤。内存可以用楼房模型来理解,每层楼对应一个字节的数据。指针是C语言中重要的特性,可以读取和写入任意内存地址上的数据。数组是一种数据结构,通过索引可以对内存中连续排列的元素进行读取和修改。总的来说,内存在计算机中起到了存储和处理数据的重要作用。
内存与CPU:计算机默契交互的关键解析的更多相关文章
- 转---高并发Web服务的演变——节约系统内存和CPU
[问底]徐汉彬:高并发Web服务的演变——节约系统内存和CPU 发表于22小时前| 4223次阅读| 来源CSDN| 22 条评论| 作者徐汉彬 问底Web服务内存CPU并发徐汉彬 摘要:现在的Web ...
- centos文件/文件夹操作-检查磁盘、内存、cpu使用情况-vi操作命令
Part1:CentOS文件/文件夹操作 1.新建文件夹 即创建目录 mkdir 文件名 新建一个名为test的文件夹在home下 vi source1 mkdir /home/test 注意:当创建 ...
- 电脑内存和CPU的关系
http://zhidao.baidu.com/link?url=OmHYd0uUJ3elyOnx1Qpdw1GGhMQBzwbdKSwR62Dn6j0090-sR0sQWR02THP-uPx7cK6 ...
- zabbix的安装(一)监控os资源:内存,cpu,io,负载,带宽
一.Linux下开源监控系统简单介绍1)cacti:存储数据能力强,报警性能差2)nagios:报警性能差,存储数据仅有简单的一段可以判断是否在合理范围内的数据长度,储存在内存中.比如,连续采样数据存 ...
- Ambari server:无法显示内存,CPU等使用率
Ambari server安装完毕后,都能正确显示各种信息.运行了几天后,发现无法显示内存,CPU等信息. 查找日志发现有错误,日志路径:/var/log/ambari-server/ambari-s ...
- 在android程序中加入widget(窗口小部件)并与之交互的关键代码
摘要: widget(窗口小部件)可以增强应用程序的交互性, 是很多应用中都会用到的功能,本文不求大而全,但是会给出程序与widget交互的关键代码 正文: 其实widget是嵌入(embedded) ...
- C#实现对远程服务器的内存和CPU监控
C#实现对远程服务器的内存和CPU监控小记 1. 主要使用到的组件有System.Management.dll 2. 主要类为 :ManagementScope 连接远程服务器示例代码: priv ...
- YARN的内存和CPU配置
时间 2015-06-05 00:00:00 JavaChen's Blog 原文 http://blog.javachen.com/2015/06/05/yarn-memory-and-cpu- ...
- Spark Tungsten揭秘 Day4 内存和CPU优化使用
Spark Tungsten揭秘 Day4 内存和CPU优化使用 今天聚焦于内存和CPU的优化使用,这是Spark2.0提供的关于执行时的非常大的优化部分. 对过去的代码研究,我们会发现,抽象的提高, ...
- 系统内存和CPU管理、监控
本博文的主要内容有 .系统内存管理.监控:vmstat和free -mt .系统CPU管理.监控:sar -u.mpstat.uptime linux系统内存和CPU是在系统运行的过程中不断消耗的资源 ...
随机推荐
- 聊天室(二)__ unipush 推送实现详细教程
一.推送作用 推送作用我就不废话了,能做推送的都知道作用,直接上干货. 二.unipush 快速开通 Dcloud 开发者实名认证注册账号,绑定对应的 app 信息. uni-push产品有2个入 ...
- RabbitMQ升级过程以及问题解决
1.卸载MQ 如果安装过MQ需先彻底卸载ERlangOTP与rabbitMQ,卸载步骤如下 1. 停止RabbitMQ服务 2. 在控制面板中卸载Erlang与RabbitMQ 3. 删除C:\ ...
- .NET表达式树
IQueryable/IQueryable 和表达式树 IQueryable有两个组件 Expression:当前查询的组件的与语言和数据源无关的表示形式,以表达式树的形式表示. Provider:L ...
- 渲染路径 - Deferred Texturing
目录 Deferred Texturing 为什么需要 Deferred Texturing? 光栅化的 Helper Lane 开销 Draw Call 更容易合批 利用 V-Buffer 可以做更 ...
- 即构SDK9月迭代:外部采集、音频频谱、房间附加消息等多个模块功能上新
即构SDK9月迭代来了,本月SDK在外部采集.音频频谱.房间附加消息等多个功能模块均有新功能上线,并且还针对K歌音乐场景下,优化了变调功能效果.以下是详细的迭代内容: LiveRoom 新增 1. ...
- 使用kubeadm部署kubernetes
k8s版本:1.15.0 前期准备 节点: master:172.50.13.103(2核2G) node-1:172.50.13.104(2核2G) node-2:172.50.13.105(2核2 ...
- 文心一言 VS 讯飞星火 VS chatgpt (75)-- 算法导论7.2 4题
四.如果用go语言,银行一般会按照交易时间来记录某一账户的交易情况.但是,很多人却喜欢收到的银行对账单是按照支票号码的顺序来排列的.这是因为,人们通常都是按照支票号码的顺序来开出支票的,而商人也通常都 ...
- Stable Diffusion基础:ControlNet之人体姿势控制
在AI绘画中精确控制图片是一件比较困难的事情,不过随着 ControlNet 的诞生,这一问题得到了很大的缓解. 今天我就给大家分享一个使用Stable Diffusion WebUI + OpenP ...
- 《Kali渗透基础》11. 无线渗透(一)
@ 目录 1:无线技术 2:IEEE 802.11 标准 2.1:无线网络分层 2.2:IEEE 2.3:日常使用标准 2.3.1:802.11 2.3.2:802.11b 2.3.3:802.11a ...
- tailwindcss -原子化 CSS 框架
原子化 CSS 框架 我记得很久之前有时候为了少写些css,我们通常会有如下的样板代码 .block { display: block; } .flex { display:flex } .flex- ...