.. include:: ../disclaimer-zh_CN.rst :Original: Documentation/core-api/refcount-vs-atomic.rst :Translator: Yanteng Si <siyanteng@loongson.cn> .. _cn_refcount-vs-atomic: ======================================= 与atomic_t相比,refcount_tçš„APIæ˜¯è¿™æ ·çš„ ======================================= .. contents:: :local: 简介 ==== refcount_t APIçš„ç›®æ ‡æ˜¯ä¸ºå®žçŽ°å¯¹è±¡çš„å¼•ç”¨è®¡æ•°å™¨æ供一个最å°çš„API。虽然æ¥è‡ª lib/refcount.c的独立于架构的通用实现在下é¢ä½¿ç”¨äº†åŽŸåæ“作,但一些 ``refcount_*()`` å’Œ ``atomic_*()`` 函数在内å˜é¡ºåºä¿è¯æ–¹é¢æœ‰å¾ˆå¤šä¸åŒã€‚本文档概述了这些差异,并 æ供了相应的例å,以帮助开å‘è€…æ ¹æ®è¿™äº›å†…å˜é¡ºåºä¿è¯çš„å˜åŒ–æ¥éªŒè¯ä»–们的代ç 。 本文档ä¸ä½¿ç”¨çš„术è¯å°½é‡éµå¾ªtools/memory-model/Documentation/explanation.txt ä¸å®šä¹‰çš„æ£å¼LKMM。 memory-barriers.txtå’Œatomic_t.txtæ供了更多关于内å˜é¡ºåºçš„背景,包括通用的 和针对原åæ“作的。 内å˜é¡ºåºçš„相关类型 ================== .. note:: 下é¢çš„部分åªæ¶µç›–了本文使用的与原åæ“作和引用计数器有关的一些内å˜é¡º åºç±»åž‹ã€‚如果想了解更广泛的情况,请查阅memory-barriers.txt文件。 在没有任何内å˜é¡ºåºä¿è¯çš„情况下(å³å®Œå…¨æ— åºï¼‰ï¼Œatomicså’Œrefcountersåªæ供原 å性和程åºé¡ºåºï¼ˆprogram order, po)关系(在åŒä¸€ä¸ªCPU上)。它ä¿è¯æ¯ä¸ª ``atomic_* ()`` å’Œ ``refcount_*()`` æ“作都是原å性的,指令在å•ä¸ªCPUä¸ŠæŒ‰ç¨‹åº é¡ºåºæ‰§è¡Œã€‚这是用READ_ONCE()/WRITE_ONCE()和比较并交æ¢åŽŸè¯å®žçŽ°çš„。 强(完全)内å˜é¡ºåºä¿è¯åœ¨åŒä¸€CPUä¸Šçš„æ‰€æœ‰è¾ƒæ—©åŠ è½½å’Œå˜å‚¨çš„指令(所有程åºé¡ºåºè¾ƒæ—© [po-earlier]指令)在执行任何程åºé¡ºåºè¾ƒåŽæŒ‡ä»¤ï¼ˆpo-later)之å‰å®Œæˆã€‚它还ä¿è¯ åŒä¸€CPU上储å˜çš„程åºä¼˜å…ˆè¾ƒæ—©çš„指令和æ¥è‡ªå…¶ä»–CPUä¼ æ’的指令必须在该CPU执行任何 程åºé¡ºåºè¾ƒåŽæŒ‡ä»¤ä¹‹å‰ä¼ æ’到其他CPU(A-累积属性)。这是用smp_mb()实现的。 RELEASE内å˜é¡ºåºä¿è¯äº†åœ¨åŒä¸€CPUä¸Šæ‰€æœ‰è¾ƒæ—©åŠ è½½å’Œå˜å‚¨çš„指令(所有程åºé¡ºåºè¾ƒæ—© 指令)在æ¤æ“作å‰å®Œæˆã€‚它还ä¿è¯åŒä¸€CPU上储å˜çš„程åºä¼˜å…ˆè¾ƒæ—©çš„指令和æ¥è‡ªå…¶ä»–CPU ä¼ æ’的指令必须在释放(release)æ“作之å‰ä¼ æ’到所有其他CPU(A-累积属性)。这是用 smp_store_release()实现的。 ACQUIRE内å˜é¡ºåºä¿è¯äº†åŒä¸€CPU上的所有åŽåŠ 载和å˜å‚¨çš„指令(所有程åºé¡ºåºè¾ƒåŽ 指令)在获å–(acquire)æ“作之åŽå®Œæˆã€‚它还ä¿è¯åœ¨èŽ·å–æ“作执行åŽï¼ŒåŒä¸€CPU上 储å˜çš„所有程åºé¡ºåºè¾ƒåŽæŒ‡ä»¤å¿…é¡»ä¼ æ’到所有其他CPU。这是用 smp_acquire__after_ctrl_dep()实现的。 对Refcounters的控制ä¾èµ–(å–决于æˆåŠŸï¼‰ä¿è¯äº†å¦‚果一个对象的引用被æˆåŠŸèŽ·å¾—(引用计数 器的增é‡æˆ–å¢žåŠ è¡Œä¸ºå‘生了,函数返回true),那么进一æ¥çš„å˜å‚¨æ˜¯é’ˆå¯¹è¿™ä¸ªæ“ä½œçš„å‘½ä»¤ã€‚å¯¹å˜ å‚¨çš„æŽ§åˆ¶ä¾èµ–没有使用任何明确的å±éšœæ¥å®žçŽ°ï¼Œè€Œæ˜¯ä¾èµ–于CPUä¸å¯¹å˜å‚¨è¿›è¡ŒçŒœæµ‹ã€‚è¿™åªæ˜¯ 一个å•ä¸€çš„CPU关系,对其他CPUä¸æ供任何ä¿è¯ã€‚ 函数的比较 ========== 情况1) - éž â€œè¯»/修改/写â€ï¼ˆRMW)æ“作 ------------------------------------ 函数å˜åŒ–: * atomic_set() --> refcount_set() * atomic_read() --> refcount_read() 内å˜é¡ºåºä¿è¯å˜åŒ–: * none (ä¸¤è€…éƒ½æ˜¯å®Œå…¨æ— åºçš„) 情况2) - 基于增é‡çš„æ“作,ä¸è¿”回任何值 -------------------------------------- 函数å˜åŒ–: * atomic_inc() --> refcount_inc() * atomic_add() --> refcount_add() 内å˜é¡ºåºä¿è¯å˜åŒ–: * none (ä¸¤è€…éƒ½æ˜¯å®Œå…¨æ— åºçš„) 情况3) - 基于递å‡çš„RMWæ“作,没有返回值 --------------------------------------- 函数å˜åŒ–: * atomic_dec() --> refcount_dec() 内å˜é¡ºåºä¿è¯å˜åŒ–: * å®Œå…¨æ— åºçš„ --> RELEASEé¡ºåº æƒ…å†µ4) - 基于增é‡çš„RMWæ“作,返回一个值 --------------------------------------- 函数å˜åŒ–: * atomic_inc_not_zero() --> refcount_inc_not_zero() * æ— åŽŸå性对应函数 --> refcount_add_not_zero() 内å˜é¡ºåºä¿è¯å˜åŒ–: * 完全有åºçš„ --> 控制ä¾èµ–于å˜å‚¨çš„æˆåŠŸ .. note:: æ¤å¤„ **å‡è®¾** 了,必è¦çš„顺åºæ˜¯ä½œä¸ºèŽ·å¾—对象指针的结果而æ供的。 情况 5) - 基于Dec/Sub递å‡çš„通用RMWæ“作,返回一个值 --------------------------------------------------- 函数å˜åŒ–: * atomic_dec_and_test() --> refcount_dec_and_test() * atomic_sub_and_test() --> refcount_sub_and_test() 内å˜é¡ºåºä¿è¯å˜åŒ–: * 完全有åºçš„ --> RELEASEé¡ºåº + æˆåŠŸåŽACQUIREé¡ºåº æƒ…å†µ6)其他基于递å‡çš„RMWæ“作,返回一个值 ---------------------------------------- 函数å˜åŒ–: * æ— åŽŸå性对应函数 --> refcount_dec_if_one() * ``atomic_add_unless(&var, -1, 1)`` --> ``refcount_dec_not_one(&var)`` 内å˜é¡ºåºä¿è¯å˜åŒ–: * 完全有åºçš„ --> RELEASEé¡ºåº + 控制ä¾èµ– .. note:: atomic_add_unless()åªåœ¨æ‰§è¡ŒæˆåŠŸæ—¶æ供完整的顺åºã€‚ 情况7)--基于é”çš„RMW -------------------- 函数å˜åŒ–: * atomic_dec_and_lock() --> refcount_dec_and_lock() * atomic_dec_and_mutex_lock() --> refcount_dec_and_mutex_lock() 内å˜é¡ºåºä¿è¯å˜åŒ–: * å®Œå…¨æœ‰åº --> RELEASEé¡ºåº + 控制ä¾èµ– + æŒæœ‰