refcount_t API 与 atomic_t 的比较 【ChatGPT】

简介: refcount_t API 与 atomic_t 的比较 【ChatGPT】

refcount_t API 与 atomic_t 的比较

介绍

相关的内存排序类型

函数比较

  1. 非“读/修改/写”(RMW)操作
  2. 基于增量的操作,不返回值
  3. 基于减量的 RMW 操作,不返回值
  4. 基于增量的 RMW 操作,返回值
  5. 通用的减法/减量基于 RMW 操作,返回值
  6. 其他基于减量的 RMW 操作,返回值
  7. 基于锁的 RMW

介绍

refcount_t API 的目标是为实现对象的引用计数器提供一个最小的 API。虽然 lib/refcount.c 中的通用体系结构无关实现使用原子操作,但是在一些 refcount_() 和 atomic_() 函数之间存在一些差异,涉及内存排序保证。本文档概述了这些差异,并提供了相应的示例,以帮助维护者验证其代码针对这些内存排序保证的变化。

本文档中使用的术语试图遵循 tools/memory-model/Documentation/explanation.txt 中定义的正式 LKMM。

memory-barriers.txt 和 atomic_t.txt 提供了更多关于内存排序的背景知识,特别是针对原子操作。

相关的内存排序类型

注意

以下部分仅涵盖了原子操作和引用计数器相关的一些内存排序类型,并在本文档中使用。要了解更广泛的情况,请参阅 memory-barriers.txt 文档。

在没有任何内存排序保证的情况下(即完全无序),原子操作和引用计数器仅提供原子性和程序顺序(po)关系(在同一 CPU 上)。它保证每个 atomic_() 和 refcount_() 操作都是原子的,并且指令在单个 CPU 上按程序顺序执行。这是使用 READ_ONCE()/WRITE_ONCE() 和比较交换原语实现的。

强(完全)内存排序保证了在同一 CPU 上所有先前的加载和存储(所有 po-更早的指令)在执行同一 CPU 上的任何 po-后续指令之前完成。它还保证了在同一 CPU 上所有先前的存储和来自其他 CPU 的所有传播存储必须在原始 CPU 上执行任何 po-后续指令之前传播到所有其他 CPU(具有累积属性)。这是使用 smp_mb() 实现的。

RELEASE 内存排序保证了在同一 CPU 上所有先前的加载和存储(所有 po-更早的指令)在操作之前完成。它还保证了在同一 CPU 上所有先前的存储和来自其他 CPU 的所有传播存储必须在释放操作之前传播到所有其他 CPU(具有累积属性)。这是使用 smp_store_release() 实现的。

ACQUIRE 内存排序保证了在同一 CPU 上所有后续的加载和存储(所有 po-后续指令)在获取操作之后完成。它还保证了在同一 CPU 上所有后续的存储在获取操作执行后必须传播到所有其他 CPU。这是使用 smp_acquire__after_ctrl_dep() 实现的。

对于引用计数器的成功控制依赖性保证了如果成功获取对象的引用(引用计数增加或添加发生,函数返回 true),则进一步的存储将按顺序执行。对于存储的控制依赖性不是使用任何显式的屏障实现的,而是依赖于 CPU 不对存储进行推测。这仅是单个 CPU 关系,并且不对其他 CPU 提供任何保证。

函数比较

  1. 非“读/修改/写”(RMW)操作函数变更:
  • atomic_set() --> refcount_set()
  • atomic_read() --> refcount_read()
  1. 内存排序保证变更:
  • 无(均完全无序)
  1. 基于增量的操作,不返回值函数变更:
  • atomic_inc() --> refcount_inc()
  • atomic_add() --> refcount_add()
  1. 内存排序保证变更:
  • 无(均完全无序)
  1. 基于减量的 RMW 操作,不返回值函数变更:
  • atomic_dec() --> refcount_dec()
  1. 内存排序保证变更:
  • 完全无序 --> RELEASE 排序
  1. 基于增量的 RMW 操作,返回值函数变更:
  • atomic_inc_not_zero() --> refcount_inc_not_zero()
  • 无原子对应项 --> refcount_add_not_zero()
  1. 内存排序保证变更:
  • 完全有序 --> 成功时对存储进行控制依赖
  1. 注意
    我们在这里真的假设获得对象指针时提供了必要的排序!
  2. 通用的减法/减量基于 RMW 操作,返回值函数变更:
  • atomic_dec_and_test() --> refcount_dec_and_test()
  • atomic_sub_and_test() --> refcount_sub_and_test()
  1. 内存排序保证变更:
  • 完全有序 --> RELEASE 排序 + 成功时的 ACQUIRE 排序
  1. 其他基于减量的 RMW 操作,返回值函数变更:
  • 无原子对应项 --> refcount_dec_if_one()
  • atomic_add_unless(&var, -1, 1) --> refcount_dec_not_one(&var)
  1. 内存排序保证变更:
  • 完全有序 --> RELEASE 排序 + 控制依赖
  1. 注意
    atomic_add_unless() 仅在成功时提供完全排序。
  2. 基于锁的 RMW函数变更:
  • atomic_dec_and_lock() --> refcount_dec_and_lock()
  • atomic_dec_and_mutex_lock() --> refcount_dec_and_mutex_lock()
  1. 内存排序保证变更:
  • 完全有序 --> RELEASE 排序 + 控制依赖 + 成功时持有 spin_lock()

本文来自博客园,作者:摩斯电码,未经同意,禁止转载

合集: 翻译1

标签: 翻译

好文要顶 关注我 收藏该文 微信分享

摩斯电码

粉丝 - 334 关注 - 54

+加关注

0

0

升级成为会员

« 上一篇: Linux kernel memory barriers 【ChatGPT】

相关文章
|
小程序 API
【微信小程序-原生开发】实用教程07 - Grid 宫格导航,详情页,侧边导航(含自定义页面顶部导航文字)
【微信小程序-原生开发】实用教程07 - Grid 宫格导航,详情页,侧边导航(含自定义页面顶部导航文字)
601 0
|
JSON Ubuntu Unix
如何在 Ubuntu 20.04 上安装和使用 Docker
如何在 Ubuntu 20.04 上安装和使用 Docker
1781 0
如何在 Ubuntu 20.04 上安装和使用 Docker
|
JavaScript 前端开发
JavaScript 中如何检测一个变量是一个 String 类型?
JavaScript 中如何检测一个变量是一个 String 类型?
440 2
|
算法 Python 计算机视觉
python五行代码解决滑块验证的缺口距离识别,破解滑块验证
目前网上关于滑块的缺口识别的方法很多,但是都不极简,看起来繁杂,各种算法的都有,有遍历的有二分法的,今天写个最简单,准确率最高的。 直接看代码: def FindPic(target, template):     """     找出图像中最佳匹配位置     :param target: 目...
4378 0
|
机器学习/深度学习 计算机视觉 Python
python目标识别及实例分割代码(可以套用自己的数据)
python目标识别及实例分割代码(可以套用自己的数据)
|
机器学习/深度学习 编解码 人工智能
使用《Deep Image Prior》来做图像复原
图像复原是指从退化的图像中恢复未知的真实图像。
1333 0
|
敏捷开发 Ubuntu Unix
一网成擒全端涵盖,在不同架构(Intel x86/Apple m1 silicon)不同开发平台(Win10/Win11/Mac/Ubuntu)上安装配置Python3.10开发环境
时光荏苒,过隙白驹,进入2023年,著名敏捷开发语言Python也放出了3.10最终版,本次我们来展示一下在不同的系统和平台中,高效部署Python3.10开发环境,这里我们并不依赖其他的三方软件,只通过Python官方的安装包进行配置,编辑器我们依然使用微软开源的Vscode,争取在一分钟以内就可以在一台干净的开发机上部署好环境,省去一些不必要的步骤。
一网成擒全端涵盖,在不同架构(Intel x86/Apple m1 silicon)不同开发平台(Win10/Win11/Mac/Ubuntu)上安装配置Python3.10开发环境
|
负载均衡 Linux 调度
NO_HZ: 降低调度时钟中断 【ChatGPT】
NO_HZ: 降低调度时钟中断 【ChatGPT】
|
缓存 算法 Linux
xenomai /PREEMPT-RT 实时性优化指南
xenomai /PREEMPT-RT 实时性优化指南
1770 0
xenomai /PREEMPT-RT 实时性优化指南
|
关系型数据库 TensorFlow 算法框架/工具
Docker技术概论(4):Docker CLI 基本用法解析
Docker技术概论(4):Docker CLI 基本用法解析
1566 1