每天一道面试题-CPU伪共享

简介: 每天一道面试题-CPU伪共享

前言:

了不起:又到了每天一到面试题的时候了!学弟,最近学习的怎么样啊

了不起学弟:最近学习的还不错,每天都在学习,每天都在进步!

了不起:那你最近学习的什么呢?

了不起学弟:最近在学习CPU伪共享,但是不太理解,能不能给我讲讲呢?

正文:

首先,我们先了解一下CPU的缓存模型。

CPU的缓存分为三层,一级缓存,二级缓存,三级缓存。

如果要获取一个内存中的数据,首先会从一级缓存中获取,如果一级缓存中没有,就会从二级缓存中获取,如果二级缓存中没有,就会从三级缓存中获取,如果三级缓存中没有,就会从内存中获取。

一级缓存是最快的,越到后面就越慢。那CPU的缓存,是由缓存行组成的,每个缓存行的大小是64字节,也就是说,如果我们要获取一个数据,那么就会把这个数据所在的内存地址,以及这个数据所在的内存地址的前后64字节的数据,都会加载到缓存行中。

聊到这里,我就给大家看看常见的伪共享问题的案例。

假设有两个线程a和b,同时有两个long类型的变量A和B。两个变量都是互相紧挨着的。那线程a要去操作A,就会把变量A和B一起带入的缓存行,线程b要去操作变量B,也会同时把AB带入缓存行。此时如果线程a把A做了修改,再通过BUS总线进行了通知,内存再做了修改。线程b重新从内存获取变量B,那么此时这种还需要从内存获取变量,这就是伪共享了。

伪共享:变量AB毫不相关,但是一旦其中一个变量被修改,另一个变量也会被重新加载。

伪共享的解决方案:

  1. 使用缓存行填充,也就是说,我们在变量AB之间,加入一些无用的变量,让AB不在同一个缓存行中,这样就不会出现伪共享的问题了。

举例:

private static class Padding{
    private volatile long a;
    public volatile long a1,a2,a3,a4,a5,a6,a7;
    private volatile long b;
  }
2.使用@Contened注解在变量上,同时在jdk8中还需要在jvm启动参数中加入-XX:-RestrictContended,jdk8以上的版本就不需要这个参数即可,这样就可以解决伪共享的问题了。
private static class Padding{
    @Contended
    private volatile long a;
    @Contended
    private volatile long b;
  }

结尾:

今天就给大家分享了一下关于CPU伪共享的问题,大家如果对CPU缓存模型那块还有疑问,可以多查找一下资料,比如MESI缓存一致模型等等。

相关文章
|
1月前
|
Arthas Kubernetes Java
字节面试:CPU被打满了,CPU100%,如何处理?
尼恩,一位拥有20多年经验的老架构师,针对近期读者在一线互联网企业面试中遇到的CPU 100%和红包架构等问题,进行了系统化梳理。文章详细解析了CPU 100%的三大类型问题(业务类、并发类、内存类)及其九种常见场景,提供了使用jstack和arthas两大工具定位问题的具体步骤,并分享了解决死锁问题的实战案例。尼恩还强调了面试时应先考虑回滚版本,再使用工具定位问题的重要性。此外,尼恩提供了丰富的技术资料,如《尼恩Java面试宝典》等,帮助读者提升技术水平,轻松应对面试挑战。
字节面试:CPU被打满了,CPU100%,如何处理?
|
1月前
|
Java
Java面试题之cpu占用率100%,进行定位和解决
这篇文章介绍了如何定位和解决Java服务中CPU占用率过高的问题,包括使用top命令找到高CPU占用的进程和线程,以及使用jstack工具获取堆栈信息来确定问题代码位置的步骤。
97 0
Java面试题之cpu占用率100%,进行定位和解决
|
6月前
|
设计模式 Oracle Java
阿里面试:NIO为什么会导致CPU100%?
在 Java 中总共有三种 IO 类型:BIO(Blocking I/O,阻塞I/O)、NIO(Non-blocking I/O,非阻塞I/O)和 AIO(Asynchronous I/O,异步I/O),它们的区别如下: 1. 在 JDK 1.4 之前,只有 BIO 一种模式,其开发过程相对简单,新来一个连接就会创建一个新的线程处理,但随着请求并发度的提升,BIO 很快遇到了性能瓶颈。 2. 所以在 JDK 1.4 以后开始引入了 NIO 技术,NIO 可以在一个线程中处理多个 IO 操作,提高了资源的利用率和系统的吞吐量。 3. 而到了 JDK 1.7 发布了 AIO 模型,它可以实现当线
88 0
|
6月前
|
缓存 运维 算法
【Linux Shell 面试题 】Linux下如何 查看CPU信息
【Linux Shell 面试题 】Linux下如何 查看CPU信息
72 0
|
存储 缓存 监控
Java 经典面试解析:服务器卡顿、CPU飙升、接口负载剧增
解决这个问题的关键是要找到Java代码的位置。下面分享一下排查思路,以CentOS为例,总结为4步。 第1步,使用top命令找到占用CPU高的进程。 第2步,使用ps –mp命令找到进程下占用CPU高的线程ID。 第3步,使用printf命令将线程ID转换成十六进制数。 第4步,使用jstack命令输出线程运行状态的日志信息。
284 0
|
存储 消息中间件 缓存
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
Java
面试拆解:系统上线后Cpu使用率飙升如何排查?
面试拆解:系统上线后Cpu使用率飙升如何排查?
142 0
|
存储 缓存 Java
「计算机原理」| CPU 缓存 & 缓存一致性 & 伪共享
「计算机原理」| CPU 缓存 & 缓存一致性 & 伪共享
622 0
「计算机原理」| CPU 缓存 & 缓存一致性 & 伪共享
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
由于现在大多计算机都是多核CPU,多线程往往会比单线程更快,更能够提高并发,但提高并发并不意味着启动更多的线程来执行。更多的线程意味着线程创建销毁开销加大、上下文非常频繁,你的程序反而不能支持更高的TPS。!
502 0
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
存储
面试官:谈谈 CPU Cache 工作原理,Cache 一致性?我懵了。。(3)
面试官:谈谈 CPU Cache 工作原理,Cache 一致性?我懵了。。(3)
215 0
面试官:谈谈 CPU Cache 工作原理,Cache 一致性?我懵了。。(3)

相关实验场景

更多