SPDK/NVMe存储技术分析之内存屏障(MB)

本文分析了内存屏障在SPDK、NVMeDirect和DPDK中的实现,包括它们如何处理编译器和CPU层面的内存屏障。在x86_64平台上,内存屏障主要通过`volatile`关键字、汇编指令`mfence`、`lfence`和`sfence`来实现。文章探讨了内存屏障在多核系统中的重要性,确保内存数据更新的原子性。
摘要由CSDN通过智能技术生成

在多核(SMP)多线程的情况下,如果不知道CPU乱序执行的话,将会是一场噩梦,因为无论怎么进行代码Review也不可能发现跟内存屏障(MB)相关的Bug。内存屏障分为两类:

  • 跟编译有关的内存屏障: 告诉编译器,不要优化我,俺不需要

  • 跟CPU有关的内存屏障: 告诉CPU, 不要乱序执行,谢谢

1. NVMeDirect中的内存屏障

/* nvmedirect/include/lib_nvmed.h */

38 #define COMPILER_BARRIER() asm volatile("" ::: "memory")

由于NVMeDirect依赖于Linux内核的NVMe驱动(nvme.ko)实现,所以NVMeDirect并不需要实现它自己的与CPU相关的内存屏障。

2. SPDK中的内存屏障

/* src/spdk-17.07.1/include/spdk/barrier.h */

47 /** Compiler memory barrier */
48 #define spdk_compiler_barrier() __asm volatile("" ::: "memory")
49
50 /** Write memory barrier */
51 #define spdk_wmb()              __asm volatile("sfence" ::: "memory")
52
53 /** Full read/write memory barrier */
54 #define spdk_mb()               __asm volatile("mfence" ::: "memory")

在SPDK中,不仅实现了与编译相关的内存屏障,还实现了与CPU有关的内存屏障。 但是, 在与CPU有关的MB中, 读内存屏障(Read memory barrier)并没有实现。

3. DPDK中的内存屏障

在DPDK中,内存屏障的实现要复杂一点,因为支持x86, ARM和PowerPC三种平台。 以x86为例,代码实现如下:

  • 与编译相关的MB

/* src/dpdk-17.08/lib/librte_eal/common/include/generic/rte_atomic.h */

132 /**
133  * Compiler barrier.
134  *
135  * Guarantees that operation reordering does not occur at compile time
136  * for operations directly before and after the barrier.
137  */
138 #define rte_compiler_barrier() do {             \
139         asm volatile ("" :
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值