计算机操作系统学习笔记(4)——伪共享

虽然有点晚,但也算按时更新了


一、伪共享

当多线程修改互相独立的变量时,如果这些变量共享同一个缓存行,就会无意中影响彼此的性能,这就是伪共享。伪共享只是影响性能,并不会带来程序上的错误

伪共享被称为并发编程的隐形杀手,因为开发者很难感知伪共享问题

对于多个线程共享的热点数据,即经常会修改的数据,应该避免这些数据刚好在同⼀个 Cache Line 中,否则就会出现为伪共享的问题。

其实很简单,就是2个线程x和y分别操作2个变量AB,如果x操作了A就会使A所在的缓存行变为失效状态,恰巧AB在一个缓存行,
B也会失效,那线程y想操作B的时候只能从内存中获取,缓存就没起作用了

解决方法

我们可以凑齐不够的字节,补满64字节,牺牲空间换时间,因为一般缓存行的大小为64字节
在这里插入图片描述
JDK8解决伪共享问题可以使用@Contended注解,JVM需要添加参数 -XX:-RestrictContended才能开启此功能

在类上应用@Contended,会使他的所有成员变量都填充,在字段上添加就只填充这个字段

二、任务调度

Linux下分为实时任务和普通任务,实时任务总是会⽐普通任务优先被执⾏。

如果你想让某个普通任务有更多的执⾏时间,可以调整任务的 nice 值, 值越低,表明优先级越⾼

因此 nice 值调整的是普通任务的优先级。

我们可以在启动任务的时候,可以指定 nice 的值,⽐如将 mysqld 以 -3 优先级:
在这里插入图片描述
如果想修改已经运⾏中的任务的优先级,则可以使⽤ renice 来调整 nice 值:
在这里插入图片描述
nice 调整的是普通任务的优先级,所以不管怎么缩⼩ nice 值,任务永远都是普通任务,如果某些任务要求实时性⽐较⾼,那么你可以考虑改变任务的优先级以及调度策略,使得它变成实时任务

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/bookssea/article/details/121737745