linux源码在线网站:https://elixir.bootlin.com/linux/latest/source

什么是内存屏障

编译器优化导致的乱序

CPU并行处理导致的乱序

内存重新排序(Memory Reordering)

推荐博客:https://preshing.com/20120515/memory-reordering-caught-in-the-act

Memory barrier 常用场景

Linux 内核中实现的无锁队列

环形缓冲区 kfifo(只有一个线程读,并且只有另一个线程写) 使用了 Memory barrier

__kfifo_alloc()
__kfifo_free()
__kfifo_init
__kfifo_in //写入数据
__kfifo_out // 读取数据

无锁化环形队里的简单理解:
1、有一个结构体,data用于存储数据,out和in作为读写的位置标识;
2、一个线程仅从结构中读取数据(out增加),另一个线程仅向结构中写入数据(in增加);
3、当写入数据时,先把数据copy到data中,中间使用 smp_wmb,然后再增加in;这样另一个线程,检测到in改变时,更新data中的数据一定是完成的;
4、当读取数据时,先从data中copy数据,中间使用 smp_wmb,然后再增加out;这样另一个线程,检测到out改变时,获取data中的数据一定是完成的;
5、无论读写,都是先执行动作,然后改变标志变量,借用smp_wmb确保改变标志变量一定在执行动作的后面,另一个线程可以通过标志判断动作是否完成;

头文件:https://elixir.bootlin.com/linux/v6.10.3/source/include/linux/kfifo.h
源文件:https://elixir.bootlin.com/linux/v6.10.3/source/lib/kfifo.c

image
image
image
image