操作系统①-①硬件结构:CPU如何运行、存储器金字塔、CPU Cache(如何写出更快的代码)

硬件结构

1 CPU如何运行

内存
位、字节、kb
我们的程序和数据都是存储在内存,存储的区域是线性的。
数据存储的单位是⼀个⼆进制位(bit) ,即 0 或 1。最小的存储单位是字节(byte) , 1 字节等于 8 位。
1byte = 8bit;
1kb = 1024 b(字节)

位宽:
线路位宽:
一条线路能传1bit,32条地址总线可以传2 ^ 32 = 4G。
CPU位宽:
64 位 CPU 就可以⼀次性算出加和两个 64 位数字的结果,因为 64 位 CPU 可以⼀次读⼊ 64 位的数字,并且 64 位 CPU 内部的逻辑运算单元也⽀持 64 位数字的计算。
如果计算的数额不超过 32 位数字的情况下, 32 位和 64 位 CPU 之间没什么区别的,只有当计算超过 32 位数字的情况下, 64 位的优势才能体现出来。

CPU工作过程
⼀个程序执⾏的时候, CPU 会根据程序计数器⾥的内存地址,从内存⾥⾯把需要执行的指令读取到指令寄存器⾥⾯执⾏,然后根据指令⻓度⾃增,开始顺序读取下⼀条指令。

指令
把整个程序翻译成汇编语⾔的程序,这个过程称为编译成汇编代码。
针对汇编代码,我们还需要⽤汇编器翻译成机器码,这些机器码是由 0 和 1 组成的机器语⾔,这⼀条条机器码,就是⼀条条的计算机指令,这个才是 CPU 能够真正认识的东⻄。
指令的类型有多种

CPU 的指令周期
Fetch(取得指令)-》 Decode(指令译码)-》Execution(执⾏指令) -》Store(数据回写)

32位和64位的软件、操作系统、机器
64 位和 32 位软件,实际上代表指令是 64 位还是 32 位的。

如果 32 位指令在 64 位机器上执⾏,需要⼀套兼容机制,就可以做到兼容运行了。但是如果 64 位指
令在 32 位机器上执⾏,就⽐较困难了,因为 32 位的寄存器存不下 64 位的指令;

操作系统其实也是⼀种程序,我们也会看到操作系统会分成 32 位操作系统、 64 位操作系统,其代表
意义就是操作系统中程序的指令是多少位,⽐如 64 位操作系统,指令也就是 64 位,因此不能装在
32 位机器上。

总之,硬件的 64 位和 32 位指的是 CPU 的位宽,软件的 64 位和 32 位指的是指令的位宽。
软件如果是32位,需要兼容才能在64位机器上运行;软件如果是64位,不能再32位机器上运行

2 存储器金字塔

计算机的存储结构
从左至右,存储的数据量逐渐减少,但处理速度变快。
对于存储器,它的速度越快、能耗会越⾼、⽽且材料的成本也是越贵的,以⾄于速度快的存储器的容量都⽐较⼩。
在这里插入图片描述

存储器金字塔:

在这里插入图片描述

寄存器
CPU Cache:

  1. L1-Cache;
  2. L2-Cache;
  3. L3-Cahce;

内存
SSD/HDD 硬盘

时钟周期
2.4 GHz 就是电脑的主频,时钟周期时间就是 1/2.4G。CPU频率代表其可以在1s内完成多少时钟周期。

寄存器
最靠近CPU、存储速度最快、最昂贵、最少的存储器。
32 位 CPU 中⼤多数寄存器可以存储 4 个字节;
64 位 CPU 中⼤多数寄存器可以存储 8 个字节

CPU cache
CPU Cache ⽤的是⼀种叫 SRAM(Static Random-Access Memory,静态随机存储器) 的芯⽚。
在 SRAM ⾥⾯,⼀个 bit 的数据,通常需要 6 个晶体管。
在这里插入图片描述
L1高速缓存,分为指令缓存和数据缓存。
L3高速缓存:
通常多个CPU核心共用,20~60个时钟周期。
程序执⾏时,会先将内存中的数据加载到共享的 L3 Cache 中,再加载到每个核⼼独有的 L2 Cache,最后进⼊到最快的 L1 Cache,之后才会被 CPU 读取。

内存
使⽤的是⼀种叫作 DRAM (Dynamic Random Access Memory,动态随机存取存储器) 的芯⽚。
相比SRAM,密度更高、功耗更低、容量更大,更便宜
DRAM 存储⼀个 bit 数据,只需要⼀个晶体管和⼀个电容就能存储,但是需要不断“动态”刷新保证数据不丢失。
200~300个时钟周期。

SSD/HDD
SSD结构和内存相似,但是断电后数据不会丢失。
内存的读写速度比SSD快10~1000倍,比HDD快10万倍。

存储器层次关系
CPU 并不会直接和每⼀种存储器设备直接打交道,⽽是每⼀种存储器设备只和它相邻的存储器设备打交道。
不同的存储器之间性能差距很⼤,构造存储器分级很有意义,分级的⽬的是要构造缓存体系

3 CPU Cache

当 CPU 访问数据的时候,先是访问 CPU Cache,如果缓存命中的话,则直接返回数据,就不⽤每次都从内存读取速度了。因此,缓存命中率越⾼,代码的性能越好。

CPU从内存中读取方式
CPU 从内存中读取数据到 Cache 的时候,并不是⼀个字节⼀个字节读取,⽽是⼀块⼀块的⽅式来读取数据的,这⼀块⼀块的数据被称为 CPU Line(缓存⾏),所以 CPU Line 是 CPU 从内存读取数据到 Cache 的单位。
L1 Cache Line的大小一般为64字节,

CPU如何访问内存数据
内存地址映射到 CPU Cache 地址⾥的策略有很多种,其中⽐较简单是直接映射 Cache,它巧妙的把内存地址拆分成「索引 + 组标记 + 偏移量」的⽅式,使得我们可以将很⼤的内存地址,映射到很⼩的 CPU Cache 地址⾥。
在这里插入图片描述
写出让CPU跑的更快的代码

  1. 要想写出让 CPU 跑得更快的代码,就需要写出缓存命中率⾼的代码, CPU L1 Cache
    分为数据缓存和指令缓存,因⽽需要分别提⾼它们的缓存命中率:

对于数据缓存,我们在遍历数据的时候,应该按照内存布局的顺序操作,这是因为 CPU Cache 是根据 CPU Cache Line 批量操作数据的,所以顺序地操作连续内存数据时,性能能得到有效的提升;

对于指令缓存,有规律的条件分⽀语句能够让 CPU 的分⽀预测器发挥作⽤,进⼀步提⾼执⾏的效
率;

  1. 对于多核 CPU 系统,线程可能在不同 CPU 核⼼来回切换,这样各个核⼼的缓存命中率就会受到影响,于是要想提⾼进程的缓存命中率,可以考虑把线程绑定 CPU 到某⼀个 CPU 核心
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值