~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/Documentation/translations/zh_CN/core-api/refcount-vs-atomic.rst

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 .. include:: ../disclaimer-zh_CN.rst
  2 
  3 :Original: Documentation/core-api/refcount-vs-atomic.rst
  4 
  5 :翻译:
  6 
  7  司延腾 Yanteng Si <siyanteng@loongson.cn>
  8 
  9 .. _cn_refcount-vs-atomic:
 10 
 11 =======================================
 12 与atomic_t相比,refcount_t的API是这样的
 13 =======================================
 14 
 15 .. contents:: :local:
 16 
 17 简介
 18 ====
 19 
 20 refcount_t API的目标是为实现对象的引用计数器提供一个最小的API。虽然来自
 21 lib/refcount.c的独立于架构的通用实现在下面使用了原子操作,但一些 ``refcount_*()``
 22 和 ``atomic_*()`` 函数在内存顺序保证方面有很多不同。本文档概述了这些差异,并
 23 提供了相应的例子,以帮助开发者根据这些内存顺序保证的变化来验证他们的代码。
 24 
 25 本文档中使用的术语尽量遵循tools/memory-model/Documentation/explanation.txt
 26 中定义的正式LKMM。
 27 
 28 memory-barriers.txt和atomic_t.txt提供了更多关于内存顺序的背景,包括通用的
 29 和针对原子操作的。
 30 
 31 内存顺序的相关类型
 32 ==================
 33 
 34 .. note:: 下面的部分只涵盖了本文使用的与原子操作和引用计数器有关的一些内存顺
 35    序类型。如果想了解更广泛的情况,请查阅memory-barriers.txt文件。
 36 
 37 在没有任何内存顺序保证的情况下(即完全无序),atomics和refcounters只提供原
 38 子性和程序顺序(program order, po)关系(在同一个CPU上)。它保证每个
 39 ``atomic_* ()`` 和 ``refcount_*()`` 操作都是原子性的,指令在单个CPU上按程序
 40 顺序执行。这是用READ_ONCE()/WRITE_ONCE()和比较并交换原语实现的。
 41 
 42 强(完全)内存顺序保证在同一CPU上的所有较早加载和存储的指令(所有程序顺序较早
 43 [po-earlier]指令)在执行任何程序顺序较后指令(po-later)之前完成。它还保证
 44 同一CPU上储存的程序优先较早的指令和来自其他CPU传播的指令必须在该CPU执行任何
 45 程序顺序较后指令之前传播到其他CPU(A-累积属性)。这是用smp_mb()实现的。
 46 
 47 RELEASE内存顺序保证了在同一CPU上所有较早加载和存储的指令(所有程序顺序较早
 48 指令)在此操作前完成。它还保证同一CPU上储存的程序优先较早的指令和来自其他CPU
 49 传播的指令必须在释放(release)操作之前传播到所有其他CPU(A-累积属性)。这是用
 50 smp_store_release()实现的。
 51 
 52 ACQUIRE内存顺序保证了同一CPU上的所有后加载和存储的指令(所有程序顺序较后
 53 指令)在获取(acquire)操作之后完成。它还保证在获取操作执行后,同一CPU上
 54 储存的所有程序顺序较后指令必须传播到所有其他CPU。这是用
 55 smp_acquire__after_ctrl_dep()实现的。
 56 
 57 对Refcounters的控制依赖(取决于成功)保证了如果一个对象的引用被成功获得(引用计数
 58 器的增量或增加行为发生了,函数返回true),那么进一步的存储是针对这个操作的命令。对存
 59 储的控制依赖没有使用任何明确的屏障来实现,而是依赖于CPU不对存储进行猜测。这只是
 60 一个单一的CPU关系,对其他CPU不提供任何保证。
 61 
 62 
 63 函数的比较
 64 ==========
 65 
 66 情况1) - 非 “读/修改/写”(RMW)操作
 67 ------------------------------------
 68 
 69 函数变化:
 70 
 71  * atomic_set() --> refcount_set()
 72  * atomic_read() --> refcount_read()
 73 
 74 内存顺序保证变化:
 75 
 76  * none (两者都是完全无序的)
 77 
 78 
 79 情况2) - 基于增量的操作,不返回任何值
 80 --------------------------------------
 81 
 82 函数变化:
 83 
 84  * atomic_inc() --> refcount_inc()
 85  * atomic_add() --> refcount_add()
 86 
 87 内存顺序保证变化:
 88 
 89  * none (两者都是完全无序的)
 90 
 91 情况3) - 基于递减的RMW操作,没有返回值
 92 ---------------------------------------
 93 
 94 函数变化:
 95 
 96  * atomic_dec() --> refcount_dec()
 97 
 98 内存顺序保证变化:
 99 
100  * 完全无序的 --> RELEASE顺序
101 
102 
103 情况4) - 基于增量的RMW操作,返回一个值
104 ---------------------------------------
105 
106 函数变化:
107 
108  * atomic_inc_not_zero() --> refcount_inc_not_zero()
109  * 无原子性对应函数 --> refcount_add_not_zero()
110 
111 内存顺序保证变化:
112 
113  * 完全有序的 --> 控制依赖于存储的成功
114 
115 .. note:: 此处 **假设** 了,必要的顺序是作为获得对象指针的结果而提供的。
116 
117 
118 情况 5) - 基于Dec/Sub递减的通用RMW操作,返回一个值
119 ---------------------------------------------------
120 
121 函数变化:
122 
123  * atomic_dec_and_test() --> refcount_dec_and_test()
124  * atomic_sub_and_test() --> refcount_sub_and_test()
125 
126 内存顺序保证变化:
127 
128  * 完全有序的 --> RELEASE顺序 + 成功后ACQUIRE顺序
129 
130 
131 情况6)其他基于递减的RMW操作,返回一个值
132 ----------------------------------------
133 
134 函数变化:
135 
136  * 无原子性对应函数 --> refcount_dec_if_one()
137  * ``atomic_add_unless(&var, -1, 1)`` --> ``refcount_dec_not_one(&var)``
138 
139 内存顺序保证变化:
140 
141  * 完全有序的 --> RELEASE顺序 + 控制依赖
142 
143 .. note:: atomic_add_unless()只在执行成功时提供完整的顺序。
144 
145 
146 情况7)--基于锁的RMW
147 --------------------
148 
149 函数变化:
150 
151  * atomic_dec_and_lock() --> refcount_dec_and_lock()
152  * atomic_dec_and_mutex_lock() --> refcount_dec_and_mutex_lock()
153 
154 内存顺序保证变化:
155 
156  * 完全有序 --> RELEASE顺序 + 控制依赖 + 持有

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php