一、硬件
1.电脑内部运行概念
1.1冯诺依曼模型
1)内存
我们的程序和数据都是存储在内存,存储的区域是线性的。
数据存储的单位是⼀个⼆进制位(bit),即 0 或 1。最⼩的存储单位是字节(byte),1 字节等于 8 位。
内存的地址是从 0 开始编号的,然后⾃增排列,最后⼀个地址为内存总字节数 - 1,这种结构好似我们程序
⾥的数组,所以内存的读写任何⼀个数据的速度都是⼀样的。
-
位(Bit):
- 位是计算机中最基本的存储单位,它可以表示二进制的 0 或 1。
- 位是数字 0 或 1 的最小单元,是计算机信息的最基本形式。
-
字节(Byte):
- 字节是计算机中常用的存储单位,它由8个位组成。
- 一个字节可以表示256(2^8)种不同的二进制组合,范围从00000000到11111111。
-
其他存储单位:
- 位和字节是计算机存储中的基础,但在实际应用中,通常使用更大的存储单位来表示数据量。
- 以下是一些常见的存储单位:
- 千字节(KB): 1 KB 等于 1024 字节。
- 兆字节(MB): 1 MB 等于 1024 KB,即 1,048,576 字节。
- 吉字节(GB): 1 GB 等于 1024 MB,即 1,073,741,824 字节。
- 太字节(TB): 1 TB 等于 1024 GB,即 1,099,511,627,776 字节。
-
数据表示:
-
8位二进制可以表示256个不同的值,因此一个字节可以用来表示整数、字符或其他数据类型。
-
大多数计算机系统都以字节为基本单位,而不同的数据类型可能需要不同数量的字节来表示。
-
2)中央处理器
中央处理器也就是我们常说的 CPU,32 位和 64 位 CPU 最主要区别在于⼀次能计算多少字节数据:
32 位 CPU ⼀次可以计算 4 个字节;
64 位 CPU ⼀次可以计算 8 个字节;
这⾥的 32 位和 64 位,通常称为 CPU 的位宽。
**位宽 **
在计算机科学中,位宽(Bit Width)是指一次性处理的数据的位数,通常用于描述中央处理器(CPU)的寄存器的大小或数据通路的宽度。它决定了CPU一次能处理多少位(或多少字节)的数据。位宽的常见取值包括 8 位、16 位、32 位、64 位等。
具体解释:
- 32位和64位CPU:
- 32位CPU表示每次能处理32位(4字节)的数据。
- 64位CPU表示每次能处理64位(8字节)的数据。
- 这意味着在一次操作中,64位CPU能处理比32位CPU更多的数据。
- 寄存器的位宽:
- 位宽通常与CPU内部的寄存器有关。寄存器是CPU内部用于存储和处理数据的快速存储区域。
- 例如,32位CPU的寄存器大小通常是32位,而64位CPU的寄存器大小通常是64位。
- 地址总线和数据总线:
- 位宽还与CPU的地址总线和数据总线相关。地址总线决定CPU能够寻址的内存范围,而数据总线决定一次可以传输的数据位数。
- 例如,一个32位CPU的地址总线可以寻址2^32(约4GB)的内存,而64位CPU的地址总线能够寻址更大的内存范围。
- 性能和扩展性:
- 64位CPU的主要优势之一是在一次处理更多数据的同时,能够更好地支持大于4GB的内存。
- 64位处理器也更适合处理大型数据集和需要高性能计算的应用程序。
3)总线
总线是⽤于 CPU 和内存以及其他设备之间的通信,总线可分为 3 种:
地址总线,⽤于指定 CPU 将要操作的内存地址;
数据总线,⽤于读写内存的数据;
控制总线,⽤于发送和接收信号,⽐如中断、设备复位等信号,CPU 收到信号后⾃然进⾏响应,这时也需要控制总线;当 CPU 要读写内存数据的时候,⼀般需要通过两个总线:⾸先要通过「地址总线」来指定内存的地址;再通过「数据总线」来传输数据;
4)输⼊、输出设备
输⼊设备向计算机输⼊数据,计算机经过计算后,把数据输出给输出设备。期间,如果输⼊设备是键盘,
按下按键时是需要和 CPU 进⾏交互的,这时就需要⽤到控制总线了
- 键盘输入:
- 当用户按下键盘上的某个按键时,键盘会产生一个电信号,表示按下了哪个键。
- 这个电信号会通过连接到计算机主板上的控制总线传送给中央处理器(CPU)。
- 控制总线的作用:
- 控制总线是一组用于传输控制信号的电线。这些信号包括指令、时序信号和其他控制信息。
- 当键盘产生输入信号时,通过控制总线将这个信号传递给CPU。CPU通过控制总线与其他部件进行通信,协调各个部件的工作。
- CPU的响应:
- CPU接收到来自控制总线的输入信号后,相应的硬件和软件模块会解释这个信号。
- 对于键盘输入,操作系统通常会处理这个信号,将按键映射为相应的字符或操作。
- 计算与输出:
- CPU根据接收到的输入信号进行相应的计算或处理。
- 计算完成后,CPU可以通过控制总线将结果传递给其他部件,比如显示器,以便用户能够看到计算结果。
1.2.相关概念
1. 串行传输与并行传输
- 串行传输是一位一位地传输数据,效率相对较低,需要等待上一个位传输完成后才能进行下一位的传输。这种方式需要多次传输才能完成一个多位的数据。
- 并行传输则是一次传输多个位,可以提高传输速度,但需要多条线路。在实际系统中,通过增加线路来实现并行传输,从而提高数据传输效率。
2. 线路位宽与地址总线/数据总线
- 线路的位宽决定了一次能传输的数据位数。地址总线和数据总线的位宽影响着CPU能够寻址和处理的内存范围和数据宽度。
- 如果地址总线只有一条,每次只能表示 “0” 或 “1”,因此CPU一次只能操作两个内存地址。为了操作更大的内存,需要增加地址总线的位宽。
3. CPU位宽的选择
- CPU的位宽最好不小于线路位宽。例如,32位CPU最好和32位宽的线路搭配,这样可以更方便地处理和传输数据。
- 64位CPU具有更大的数据处理能力,一次性能够操作更多位的数据,适用于处理64位宽的数据。但并不一定性能就比32位CPU高,因为很多应用场景并不需要超过32位的计算。
4. CPU的地址空间
- 32位CPU最大只能操作4GB内存,而64位CPU的寻址范围非常大,可以达到2^64。这使得64位系统能够处理更大的内存。
5. 性能对比
- 在一些应用场景下,32位和64位CPU的性能可能没有太大区别。64位的优势主要在于能够一次性处理更大位宽的数据,特别是在需要大量内存的应用中。
6.线路位宽、地址总线/数据总线位宽、 CPU位宽
-
线路位宽(Bus Width):
- 线路位宽是指在计算机系统中用于传输数据的通道的宽度。这条线路可以是数据总线、地址总线、控制总线等。它决定了一次能够传输的二进制位数。
- 例如,32位的数据总线意味着每次可以传输32位(4字节)的数据。同样,32位的地址总线表示CPU可以寻址2^32个不同的内存地址。
-
地址总线和数据总线:
- 地址总线(Address Bus): 用于传输CPU生成的内存地址,决定了CPU能够寻址的内存范围。
- 数据总线(Data Bus): 用于传输CPU和其他硬件之间的数据,决定了一次能够传输的数据位数。
-
CPU位宽
- CPU位宽是指CPU一次能够处理的二进制位数。这通常决定了CPU能够进行的最大计算范围和数据处理能力。
- 例如,32位CPU一次可以处理32位的数据,64位CPU一次可以处理64位的数据。
关系总结
- 线路位宽决定了一次能传输的位数,它可以是地址总线、数据总线等。
- 地址总线决定了CPU可以寻址的内存范围。
- 数据总线决定了一次能传输的数据位数。
- CPU位宽决定了CPU一次能够处理的数据位数。
举例
- 如果一个计算机系统有32位的地址总线,那么CPU可以寻址2^32个内存地址。
- 如果一个计算机系统有64位的数据总线,那么一次可以传输64位的数据。
- 如果一个CPU是32位的,那么它一次能够处理32位的数据。
2.存储器结构
我们想象中⼀个场景,⼤学期末准备考试了,你前去图书馆临时抱佛脚。那么,在看书的时候,我们的⼤
脑会思考问题,也会记忆知识点,另外我们通常也会把常⽤的书放在⾃⼰的桌⼦上,当我们要找⼀本不常
⽤的书,则会去图书馆的书架找。
就是这么⼀个⼩⼩的场景,已经把计算机的存储结构基本都涵盖了。
我们可以把 CPU ⽐喻成我们的⼤脑,⼤脑正在思考的东⻄,就好⽐ CPU 中的寄存器,处理速度是最快
的,但是能存储的数据也是最少的,毕竟我们也不能⼀下同时思考太多的事情,除⾮你练过。
我们⼤脑中的记忆,就好⽐ CPU Cache,中⽂称为 CPU ⾼速缓存,处理速度相⽐寄存器慢了⼀点,但是
能存储的数据也稍微多了⼀些。
CPU Cache 通常会分为 L1、L2、L3 三层,其中 L1 Cache 通常分成「数据缓存」和「指令缓存」,L1
是距离 CPU 最近的,因此它⽐ L2、L3 的读写速度都快、存储空间都⼩。我们⼤脑中短期记忆,就好⽐
L1 Cache,⽽⻓期记忆就好⽐ L2/L3 Cache。
寄存器和 CPU Cache 都是在 CPU 内部,跟 CPU 挨着很近,因此它们的读写速度都相当的快,但是能存
储的数据很少,毕竟 CPU 就这么丁点⼤。
当我们⼤脑记忆中没有资料的时候,可以从书桌或书架上拿书来阅读,那我们桌⼦上的书,就好⽐内存,
我们虽然可以⼀伸⼿就可以拿到,但读写速度肯定远慢于寄存器,那图书馆书架上的书,就好⽐硬盘,能
存储的数据⾮常⼤,但是读写速度相⽐内存差好⼏个数量级,更别说跟寄存器的差距了。
2.1寄存器
存储器的数量通常在⼏⼗到⼏百之间,每个寄存器可以⽤来存储⼀定的字节(byte)的数据。⽐如:
32 位 CPU 中⼤多数寄存器可以存储 4 个字节;
64 位 CPU 中⼤多数寄存器可以存储 8 个字节。
寄存器的访问速度⾮常快,⼀般要求在半个 CPU 时钟周期内完成读写,CPU 时钟周期跟 CPU 主频息息相关,⽐如 2 GHz 主频的 CPU,那么它的时钟周期就是 1/2G,也就是 0.5ns(纳秒)。CPU 处理⼀条指令的时候,除了读写寄存器,还需要解码指令、控制指令执⾏和计算。如果寄存器的速度
太慢,则会拉⻓指令的处理周期,从⽽给⽤户的感觉,就是电脑「很慢」。
2.2CPU Cache
CPU Cache ⽤的是⼀种叫 SRAM(Static Random-Access Memory,静态随机存储器) 的芯⽚。SRAM 之所以叫「静态」存储器,是因为只要有电,数据就可以保持存在,⽽⼀旦断电,数据就会丢失了。CPU 的⾼速缓存,通常可以分为 L1、L2、L3 这样的三层⾼速缓存,也称为⼀级缓存、⼆次缓存、三次缓存。
2.3内存
内存⽤的芯⽚和 CPU Cache 有所不同,它使⽤的是⼀种叫作 DRAM (Dynamic Random AccessMemory,动态随机存取存储器) 的芯⽚。
RAM 的数据访问电路和刷新电路都⽐ SRAM 更复杂,所以访问的速度会更慢,内存速度⼤概在200~300 个 时钟周期之间。
2.4SSD/HDD 硬盘
SSD(Solid-state disk) 就是我们常说的固体硬盘,结构和内存类似,但是它相⽐内存的优点是断电后数据还是存在的,⽽内存、寄存器、⾼速缓存断电后数据都会丢失。内存的读写速度⽐ SSD ⼤概快10~1000 倍。
当然,还有⼀款传统的硬盘,也就是机械硬盘(Hard Disk Drive, HDD),它是通过物理读写的⽅式来访问数据的,因此它访问速度是⾮常慢的,它的速度⽐内存慢 10W 倍左右。
2.5访问
CPU 并不会直接和每⼀种存储器设备直接打交道,⽽是每⼀种存储器设备只和它相邻的存储器设备打交道。
⽐如,CPU Cache 的数据是从内存加载过来的,写回数据的时候也只写回到内存,CPU Cache 不会直接把数据写到硬盘,也不会直接从硬盘加载数据,⽽是先加载到内存,再从内存加载到 CPU Cache 中。
另外,当 CPU 需要访问内存中某个数据的时候,如果寄存器有这个数据,CPU 就直接从寄存器取数据即可,如果寄存器没有这个数据,CPU 就会查询 L1 ⾼速缓存,如果 L1 没有,则查询 L2 ⾼速缓存,L2 还是没有的话就查询 L3 ⾼速缓存,L3 依然没有的话,才去内存中取数据。
2.6 CPU缓存
缓存具体知识点放到Redis 阅读笔记里面吧
数据结构:
- Cache块(Cache Line):
- 缓存被划分为固定大小的块,通常是2的幂次方大小(如64字节)。
- 每个块有一个对应的行,称为缓存行(Cache Line)。
- Cache行索引:
- 缓存的每一行都有一个唯一的索引,通常通过对主存地址的一部分进行哈希计算得到。
- 标记(Tag):
- 每个缓存行都有一个标记字段,用于存储与主存块相对应的主存地址的部分。
- 当一个块被加载到缓存中时,缓存会存储主存块的标记。
- 有效位(Valid Bit):
- 用于标识缓存行是否包含有效的数据。
- 数据块:
- 用于存储主存块的实际数据。
读取过程:
- 地址解析:
- 当CPU访问一个特定的主存地址时,该地址被分解为三部分:标记、行索引和块偏移。
- 标记部分用于与缓存中的标记进行比较,确定是否命中缓存。
- 行索引用于选择缓存中的特定行。
- 块偏移指示在缓存行中的偏移位置。
- 缓存访问:
- 使用行索引从缓存中选择相应的行。
- 如果有效位为1且标记匹配,表示发生了缓存命中。
- 判断是否命中:
- 如果发生缓存命中,直接从缓存中读取相应的数据块。
- 如果未命中,需要从主存中加载整个块到缓存中,并更新标记和有效位。
- 更新缓存:
- 如果缓存未命中,需要将整个主存块加载到相应的缓存行中。
- 这涉及将主存块的数据复制到缓存行中,并更新标记和有效位。
- 使用行索引从缓存中选择相应的行。
- 如果有效位为1且标记匹配,表示发生了缓存命中。
- 判断是否命中:
- 如果发生缓存命中,直接从缓存中读取相应的数据块。
- 如果未命中,需要从主存中加载整个块到缓存中,并更新标记和有效位。
- 更新缓存:
- 如果缓存未命中,需要将整个主存块加载到相应的缓存行中。
- 这涉及将主存块的数据复制到缓存行中,并更新标记和有效位。
直接映射缓存的优势在于简单且易于实现,但由于缓存行的有限数量,可能会导致冲突(不同主存块映射到相同缓存行)。解决冲突的方法包括使用更高级的映射策略(如组相联映射)或者使用更大的缓存。