From ee5956bb9ce637d7743b93ce6749cac883339e67 Mon Sep 17 00:00:00 2001 From: Tang Yizhou <yizhou.tang@shopee.com> Date: Wed, 29 Jun 2022 09:32:40 +0800 Subject: [PATCH] docs/zh_CN: Add mutex-design Chinese translation Translate locking/mutex-design.rst into Chinese. Signed-off-by: Tang Yizhou <yizhou.tang@shopee.com> Reviewed-by: Alex Shi <alexs@kernel.org> Reviewed-by: Yanteng Si<siyanteng@loongson.cn> Link: https://lore.kernel.org/r/20220629013240.65386-3-yizhou.tang@shopee.com Signed-off-by: Jonathan Corbet <corbet@lwn.net> --- .../translations/zh_CN/locking/index.rst | 2 +- .../zh_CN/locking/mutex-design.rst | 145 ++++++++++++++++++ 2 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 Documentation/translations/zh_CN/locking/mutex-design.rst diff --git a/Documentation/translations/zh_CN/locking/index.rst b/Documentation/translations/zh_CN/locking/index.rst index 76a8be9bf78b7..f0b10707668d8 100644 --- a/Documentation/translations/zh_CN/locking/index.rst +++ b/Documentation/translations/zh_CN/locking/index.rst @@ -14,6 +14,7 @@ .. toctree:: :maxdepth: 1 + mutex-design spinlocks TODOList: @@ -22,7 +23,6 @@ TODOList: * lockdep-design * lockstat * locktorture - * mutex-design * rt-mutex-design * rt-mutex * seqlock diff --git a/Documentation/translations/zh_CN/locking/mutex-design.rst b/Documentation/translations/zh_CN/locking/mutex-design.rst new file mode 100644 index 0000000000000..6aad54372a6c9 --- /dev/null +++ b/Documentation/translations/zh_CN/locking/mutex-design.rst @@ -0,0 +1,145 @@ +.. SPDX-License-Identifier: GPL-2.0 +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/locking/mutex-design.rst + +:ç¿»è¯: + + åèºè Tang Yizhou <tangyeechou@gmail.com> + +================ +éç¨äºæ¥éåç³»ç» +================ + +:å稿: + + Ingo Molnar <mingo@redhat.com> + +:æ´æ°: + + Davidlohr Bueso <davidlohr@hp.com> + +ä»ä¹æ¯äºæ¥éï¼ +-------------- + +å¨Linuxå æ ¸ä¸ï¼äºæ¥éï¼mutexï¼æçæ¯ä¸ä¸ªç¹æ®çå éåè¯ï¼å®å¨å ±äº«å åç³»ç»ä¸ +强å¶ä¿è¯åºååï¼èä¸ä» ä» æ¯æå¨å¦æ¯çæç±»ä¼¼çç论æç§ä¹¦ä¸åºç°çéç¨æ¯è¯âç¸äº +ææ¥âãäºæ¥éæ¯ä¸ç§ç¡ç éï¼å®çè¡ä¸ºç±»ä¼¼äºäºè¿å¶ä¿¡å·éï¼semaphoresï¼ï¼å¨ +2006年被å¼å ¥æ¶[1]ï¼ä½ä¸ºåè çæ¿ä»£åãè¿ç§æ°çæ°æ®ç»ææä¾äºè®¸å¤ä¼ç¹ï¼å æ¬æ´ +ç®åçæ¥å£ï¼ä»¥åå¨å½æ¶æ´å°ç代ç éï¼è§ç¼ºé·ï¼ã + +[1] https://lwn.net/Articles/164802/ + +å®ç° +---- + +äºæ¥éç±âstruct mutexâ表示ï¼å¨include/linux/mutex.hä¸å®ä¹ï¼å¹¶å¨ +kernel/locking/mutex.cä¸å®ç°ãè¿äºé使ç¨ä¸ä¸ªåååéï¼->ownerï¼æ¥è·è¸ª +å®ä»¬çå½å¨æå çéç¶æãåæ®µownerå®é ä¸å å«çæ¯æåå½åéææè ç +`struct task_struct *` æéï¼å æ¤å¦ææ 人ææéï¼åå®çå¼ä¸ºç©ºï¼NULLï¼ã +ç±äºtask_structçæéè³å°æL1_CACHE_BYTES对é½ï¼ä½ä½ï¼3ï¼è¢«ç¨æ¥åå¨é¢å¤ +çç¶æï¼ä¾å¦ï¼çå¾ è å表é空ï¼ãå¨å ¶æåºæ¬çå½¢å¼ä¸ï¼å®è¿å æ¬ä¸ä¸ªçå¾ éåå +ä¸ä¸ªç¡®ä¿å¯¹å ¶åºåå访é®çèªæéãæ¤å¤ï¼CONFIG_MUTEX_SPIN_ON_OWNER=yç +ç³»ç»ä½¿ç¨ä¸ä¸ªèªæMCSéï¼->osqï¼è¯æ³¨ï¼MCSæ¯ä¸¤ä¸ªäººåçå并缩åï¼ï¼å¨ä¸æç +ï¼iiï¼ä¸æè¿°ã + +åå¤è·å¾ä¸æèªæéæ¶ï¼æä¸ç§å¯è½ç»è¿çè·¯å¾ï¼åå³äºéçç¶æï¼ + +(i) å¿«éè·¯å¾ï¼è¯å¾éè¿è°ç¨cmpxchg()ä¿®æ¹éçææè 为å½åä»»å¡ï¼ä»¥æ¤åååå° + è·åéãè¿åªå¨æ ç«äºçæ åµä¸ææï¼cmpxchg()æ£æ¥å¼æ¯å¦ä¸º0ï¼æä»¥3ä¸ªç¶æ + æ¯ç¹å¿ 须为0ï¼ã妿éå¤å¨ç«äºç¶æï¼ä»£ç è¿å ¥ä¸ä¸ä¸ªå¯è½çè·¯å¾ã + +(ii) ä¸éè·¯å¾ï¼ä¹å°±æ¯ä¹è§èªæï¼å½éçææè æ£å¨è¿è¡å¹¶ä¸æ²¡æå ¶å®ä¼å 级æ´é«ç + ä»»å¡ï¼need_reschedï¼éè¦éæ°è°åº¦ï¼åå¤è¿è¡æ¶ï¼å½åä»»å¡è¯å¾èªææ¥è·å¾ + éãåçæ¯ï¼å¦æéçææè æ£å¨è¿è¡ï¼å®å¾å¯è½ä¸ä¹ å°±ä¼éæ¾éãäºæ¥éèªæä½ + 使ç¨MCSéæéï¼è¿æ ·åªæä¸ä¸ªèªæä½å¯ä»¥ç«äºäºæ¥éã + + MCSéï¼ç±Mellor-CrummeyåScottæåºï¼æ¯ä¸ä¸ªç®åçèªæéï¼å®å ·æä¸äº + çæ³çç¹æ§ï¼æ¯å¦å ¬å¹³ï¼ä»¥åæ¯ä¸ªCPUå¨è¯å¾è·å¾éæ¶å¨ä¸ä¸ªæ¬å°åéä¸èªæã + å®é¿å äºå¸¸è§çâæ£æµ-设置âèªæéå®ç°å¯¼è´çï¼CPUæ ¸é´ï¼ç¼åè¡åå¼¹ + ï¼cacheline bouncingï¼è¿ç§æè´µçå¼éãä¸ä¸ªç±»MCSéæ¯ä¸ºå®ç°ç¡ç éç + ä¹è§èªæèä¸é¨å®å¶çãè¿ç§å®å¶MCSéçä¸ä¸ªéè¦ç¹æ§æ¯ï¼å®æä¸ä¸ªé¢å¤ç屿§ï¼ + å½èªæä½éè¦éæ°è°åº¦æ¶ï¼å®ä»¬è½å¤éåºMCSèªæééåãè¿è¿ä¸æ¥æå©äºé¿å + 以ä¸åºæ¯ï¼éè¦éæ°è°åº¦çMCSèªæä½å°ç»§ç»èªæçå¾ èªæä½ææè ï¼å³å°è·å¾ + MCSéæ¶å´ç´æ¥è¿å ¥æ ¢éè·¯å¾ã + +(iii) æ ¢éè·¯å¾ï¼æåçææ®µï¼å¦æä»ç¶æ æ³è·å¾éï¼è¯¥ä»»å¡ä¼è¢«æ·»å å°çå¾ éåä¸ï¼ + ä¼ç ç´å°è¢«è§£éè·¯å¾å¤éãå¨é常æ åµä¸ï¼å®ä»¥TASK_UNINTERRUPTIBLEç¶æ + é»å¡ã + +è½ç¶ä»å½¢å¼ä¸çï¼å æ ¸äºæ¥éæ¯å¯ç¡ç çéï¼è·¯å¾(ii)使å®å®é ä¸æä¸ºæ··åç±»åãéè¿ +ç®åå°ä¸ä¸æä¸ä¸ªä»»å¡å¹¶å¿ççå¾ å ä¸ªå¨æï¼è䏿¯ç«å³ç¡ç ï¼è¿ç§éå·²ç»è¢«è®¤ä¸ºæ¾è +æ¹åä¸äºå·¥ä½è´è½½çæ§è½ã注æï¼è¿ç§ææ¯ä¹è¢«ç¨äºè¯»åä¿¡å·éï¼rw-semaphoresï¼ã + +è¯ä¹ +---- + +äºæ¥éåç³»ç»æ£æ¥å¹¶å¼ºå¶æ§è¡ä»¥ä¸è§å: + + - æ¯æ¬¡åªæä¸ä¸ªä»»å¡å¯ä»¥ææè¯¥äºæ¥éã + - åªæéçææè å¯ä»¥è§£éè¯¥äºæ¥éã + - ä¸å è®¸å¤æ¬¡è§£éã + - ä¸å 许éå½å é/è§£éã + - äºæ¥éåªè½éè¿APIè¿è¡åå§åï¼è§ä¸æï¼ã + - ä¸ä¸ªä»»å¡ä¸è½å¨ææäºæ¥éçæ åµä¸éåºã + - ææéçå ååºåä¸å¾è¢«éæ¾ã + - 被ææçéä¸è½è¢«éæ°åå§åã + - äºæ¥éä¸è½ç¨äºç¡¬ä»¶æè½¯ä»¶ä¸æä¸ä¸æï¼å¦å°ä»»å¡ï¼taskletï¼å宿¶å¨ã + +å½CONFIG DEBUG_MUTEXES被å¯ç¨æ¶ï¼è¿äºè¯ä¹å°è¢«å®å ¨å¼ºå¶æ§è¡ãæ¤å¤ï¼äºæ¥é +è°è¯ä»£ç è¿å®ç°äºä¸äºå ¶å®ç¹æ§ï¼ä½¿éçè°è¯æ´å®¹æãæ´å¿«éï¼ + + - 彿å°å°è°è¯è¾åºæ¶ï¼æ»æ¯ä½¿ç¨äºæ¥éç符å·åç§°ã + - å éç¹è·è¸ªï¼å½æ°å符å·åæ¥æ¾ï¼ç³»ç»ææçå ¨é¨éçåè¡¨ï¼æå°åºå®ä»¬ã + - ææè è·è¸ªã + - æ£æµèªæéå½çéå¹¶æå°ææç¸å ³ä¿¡æ¯ã + - æ£æµå¤ä»»å¡ç¯å½¢ä¾èµæ»éï¼å¹¶æå°ææåå½±åçéåä»»å¡ï¼å¹¶ä¸åªéäºè¿äºä»»å¡ï¼ã + + +æ¥å£ +---- +éæå®ä¹äºæ¥é:: + + DEFINE_MUTEX(name); + +卿åå§åäºæ¥é:: + + mutex_init(mutex); + +以ä¸å¯ä¸ææ¹å¼ï¼uninterruptibleï¼è·åäºæ¥é:: + + void mutex_lock(struct mutex *lock); + void mutex_lock_nested(struct mutex *lock, unsigned int subclass); + int mutex_trylock(struct mutex *lock); + +以å¯ä¸ææ¹å¼ï¼interruptibleï¼è·åäºæ¥é:: + + int mutex_lock_interruptible_nested(struct mutex *lock, + unsigned int subclass); + int mutex_lock_interruptible(struct mutex *lock); + +å½åååéå为0æ¶ï¼ä»¥å¯ä¸ææ¹å¼ï¼interruptibleï¼è·åäºæ¥é:: + + int atomic_dec_and_mutex_lock(atomic_t *cnt, struct mutex *lock); + +éæ¾äºæ¥é:: + + void mutex_unlock(struct mutex *lock); + +æ£æµæ¯å¦å·²ç»è·åäºæ¥é:: + + int mutex_is_locked(struct mutex *lock); + +ç¼ºé· +---- + +ä¸å®æåç设计åç®çä¸åï¼'struct mutex' æ¯å æ ¸ä¸æå¤§çéä¹ä¸ãä¾å¦ï¼å¨ +x86-64ä¸å®æ¯32åèï¼è 'struct semaphore' æ¯24åèï¼rw_semaphoreæ¯ +40åèãæ´å¤§çç»æä½å¤§å°æå³çæ´å¤çCPUç¼ååå åå ç¨ã + + +使¶ä½¿ç¨äºæ¥é +-------------- + +æ»æ¯ä¼å éæ©äºæ¥éè䏿¯ä»»ä½å ¶å®éåè¯ï¼é¤éäºæ¥éçä¸¥æ ¼è¯ä¹ä¸åéï¼å/æä¸´çåº +黿¢éè¢«å ±äº«ã -- 2.30.2