当前位置: 首页 > article >正文

iOS - Objective-C 底层中的内存屏障

1. 基本实现

// objc-os.h 中的内存屏障实现
#define OSMemoryBarrier()  __sync_synchronize()

// ARM 架构特殊处理
static ALWAYS_INLINE void
OSMemoryBarrierBeforeUnlock() {
#if defined(__arm__) || defined(__arm64__)
    OSMemoryBarrier();
#endif
}

2. 解锁前的内存屏障

// 自旋锁解锁时使用内存屏障
static ALWAYS_INLINE void
OSSpinLockUnlock(volatile OSSpinLock *lock) {
    // 确保之前的内存操作都完成
    OSMemoryBarrierBeforeUnlock();
    // 解锁操作
    OSAtomicAnd32Barrier(0, &lock->value);
}

3. 原子操作中的内存屏障

// 带内存屏障的原子操作
static ALWAYS_INLINE int32_t 
OSAtomicIncrement32Barrier(volatile int32_t *value) {
    // 使用带内存屏障的原子加操作
    return __sync_fetch_and_add(value, 1) + 1;
}

static ALWAYS_INLINE int32_t 
OSAtomicDecrement32Barrier(volatile int32_t *value) {
    // 使用带内存屏障的原子减操作
    return __sync_fetch_and_sub(value, 1) - 1;
}

4. 不同架构的处理

// 针对不同架构的内存屏障实现
#if __has_feature(c_atomic)
    // 使用 C11 原子操作
    #define OSAtomicIncrement32Barrier(p) \
        __c11_atomic_add((_Atomic(int32_t) *)(p), 1, __ATOMIC_SEQ_CST)
#else
    // 使用平台特定的实现
    static ALWAYS_INLINE int32_t 
    OSAtomicIncrement32Barrier(volatile int32_t *value) {
        return __sync_fetch_and_add(value, 1) + 1;
    }
#endif

5. 使用场景

5.1 引用计数操作

bool objc_object::rootTryRetain() {
    // 使用带内存屏障的原子操作
    if (OSAtomicCompareAndSwapInt32Barrier(0, 1, &refcount)) {
        return true;
    }
    return false;
}

5.2 属性原子访问

// 原子属性的 setter
static inline void reallySetProperty(id self, SEL _cmd, id newValue, 
                                   ptrdiff_t offset, bool atomic) 
{
    if (atomic) {
        spinlock_t& slotlock = PropertyLocks[GOODHASH(offset)];
        slotlock.lock();
        // 写入值
        *((id *)((char *)self + offset)) = newValue;
        // 确保内存操作完成
        OSMemoryBarrier();
        slotlock.unlock();
    }
}

6. 内存序保证

// 1. Acquire 语义
#define ACQUIRE_BARRIER() \
    __asm__ __volatile__("dmb ish" : : : "memory")

// 2. Release 语义
#define RELEASE_BARRIER() \
    __asm__ __volatile__("dmb ish" : : : "memory")

// 3. 完全内存屏障
#define FULL_BARRIER() \
    __asm__ __volatile__("dmb ish" : : : "memory")

7. 性能考虑

// 1. 避免不必要的内存屏障
void performOperation() {
    if (!needsBarrier) {
        // 使用非屏障版本的操作
        OSAtomicIncrement32(value);
    } else {
        // 使用带屏障版本
        OSAtomicIncrement32Barrier(value);
    }
}

// 2. 合并内存屏障
void batchOperations() {
    // 一次内存屏障保护多个操作
    OSMemoryBarrier();
    // 执行多个操作
    operation1();
    operation2();
    operation3();
    OSMemoryBarrier();
}

总结要点:

1. 内存屏障类型:

  • 完全内存屏障
  • 获取屏障(Acquire)
  • 释放屏障(Release)

2. 使用场景:

  • 锁操作
  • 原子操作
  • 属性访问
  • 引用计数

3. 架构相关:

  • ARM 特殊处理
  • x86 内存序列
  • 不同平台实现

4. 性能影响:

  • 内存屏障开销
  • 合理使用
  • 优化策略

5. 注意事项:

  • 正确使用类型
  • 避免过度使用
  • 考虑性能影响
  • 平台兼容性

http://www.kler.cn/a/507132.html

相关文章:

  • Elasticsearch:Jira 连接器教程第一部分
  • 《鸿蒙Next平台:决策树面对噪声数据的鲁棒性逆袭》
  • 【Linux】11.Linux基础开发工具使用(4)
  • Vue3 Element-Plus el-tree 右键菜单组件
  • 大疆上云API基于源码部署
  • 人工智能任务19-基于BERT、ELMO模型对诈骗信息文本进行识别与应用
  • 服务器下发任务镭速利用变量实现高效的大文件传输效率
  • Python人工智能在气象中的应用,包括:天气预测、气候模拟、降雨量和降水预测、气象数据分析、气象预警系统
  • 【Element】一键重置表单resetFields
  • 【开源分享】nlohmann C++ JSON解析库
  • 学习 Git 的工作原理,而不仅仅是命令
  • 《零基础Go语言算法实战》【题目 2-28】读写不安全问题
  • arm使用ubi系统
  • windows10 安装 Golang 版本控制工具g与使用
  • Gartner预测2025年关键基础设施的CPS安全:确保机器人、无人机、自动驾驶汽车、人工智能等前沿技术应用和新场景安全
  • 【Flink系列】6. Flink中的时间和窗口
  • web前端第八次作业---制作音乐榜单
  • Unity WebGL:本机部署,运行到手机
  • 手摸手系列之 Java 通过 PDF 模板生成 PDF 功能
  • 专业140+总分410+宁波大学829信号与系统考研经验宁大电子信息与通信工程,真题,大纲,参考书。
  • 卷积神经网络的底层是傅里叶变换
  • CSS中的accent-color如何使用
  • SQL Server查询计划操作符——查询计划相关操作符(4)
  • Swift 专题二 语法速查
  • 如何调用短信服务接口给自己的网站设置短信验证码功能
  • IntelliJ IDEA:享受高效的 JAVA 开发