锄淫鲷 发表于 2025-7-9 10:49:59

关于超线程这一块

前言

简单说一下超线程这一块。
正文

什么是超线程呢? 我们经常观察到物理核心和逻辑核心这两个cpu关键字。
那么如果物理核心是1,逻辑核心是2,那么这个时候就是超线程了。
为什么有超线程这个东西呢?
我们cpu做的一些基本的事情,就是从内存中读数据,然后再进行计算。
这里似乎好像没什么优化空间,那么我们再细化一下。
如果cpu 不命中缓存的情况下,那么消耗的时钟是300个。
这300个的时候好像计算核心什么都不做,这不就浪费了。
那么这个时候假设有另外一个线程那么不就可以跑另外一个线程的计算啊。
超线程的优缺点

优点:
提高 CPU 利用率,减少空闲时间(适合多任务、I/O 密集型任务)。
在虚拟化、云计算环境中能更高效地分配 vCPU。
缺点:
不适用于所有场景:计算密集型任务(如科学计算、游戏)可能因资源争抢导致性能下降。
安全性问题:超线程可能引发侧信道攻击(如 Spectre、Meltdown 漏洞)。
这里优点我们很容易理解的,那么为啥这里密集型的任务会导致性能下降呢?
按道理说,只要往直接内存中取出数据,就一定会有资源浪费啊。
这两个超线程,其实是共享缓存的。
超线程共享缓存的好处是:
提高缓存利用率:
若两个线程访问相同或相邻内存(如处理同一任务的数据),共享缓存可减少重复加载,提升命中率。
降低延迟:
线程 A 加载的数据可能被线程 B 直接复用(例如共享代码或数据结构)。
说白了就是两个线程的如果缓存一样的话,那么可以增大缓存的好处。
那么这里面有一个条件就是a、b两个线程得缓存一致。
如果缓存不一致,那么缺点就是:
劣势
缓存争抢(Thrashing):
若两个线程访问完全不相关的内存区域,可能导致缓存频繁换入换出,命中率下降。
典型案例:
线程 1 处理视频数据(大块连续内存),线程 2 处理网络包(分散的小内存)。
两者竞争 L1/L2 缓存空间,性能可能比单线程更差。
两者线程不想关,那么就竞争缓存了,导致跑的可能更慢了。
那么为什么io密集型适合超线程呢? 频繁的读写数据,应该会占用大量缓存啊。
高延迟等待:
I/O 操作(如网络请求、磁盘读写)的延迟远高于 CPU 计算(微秒级 vs. 纳秒级),导致 CPU 经常空闲等待数据就绪。
低计算密度:
任务的大部分时间花在 等待 I/O 而非计算,CPU 的 ALU/FPU 等计算单元利用率低。
缓存占用可控:
虽然 I/O 数据会经过缓存(如网络包缓冲、磁盘 Page Cache),但 I/O 密集型任务通常 不会频繁反复处理同一数据,因此对 CPU 缓存(L1/L2/L3)的压力较小。
重点是反复处理同一个数据才会缓存,所以呢,i/o 不会占用cpu缓存的,这个cpu缓存章节单独说明。
缓存虽然共享,但 I/O 数据的局部性较差,较少引发缓存颠簸(Thrashing)
那为什么计算型对于超线程不太行呢?
通用还是缓存问题。
两个线程争抢 ALU/FPU 和缓存,资源竞争加剧,并不会出现io等待浪费时间,所以能得到的可以交叉利用的时间比较小。


大概先到这里吧,继续补充一些简单的知识点。

来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除
页: [1]
查看完整版本: 关于超线程这一块