From: Chen-Yu Yeh <chenyou910331@gmail.com>
To: Alex Shi <alexs@kernel.org>, Jonathan Corbet <corbet@lwn.net>
Cc: Weijie Yuan <wy@wyuan.org>, Dongliang Mu <dzm91@hust.edu.cn>,
Yanteng Si <si.yanteng@linux.dev>,
linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org,
Chen-Yu Yeh <chenyou910331@gmail.com>
Subject: [PATCH 17/25] docs/zh_TW: process: sync volatile-considered-harmful.rst with the English original
Date: Fri, 6 Nov 2026 19:31:32 +0800 [thread overview]
Message-ID: <20261106113142.706783-18-chenyou910331@gmail.com> (raw)
In-Reply-To: <20261106113142.706783-1-chenyou910331@gmail.com>
The translation carries no "update to commit" marker. A comparison
against the current English text shows every paragraph is present, but
the prose was converted from zh_CN and several sentences drifted from
the original:
- cpu_relax() "happens to serve as a compiler barrier", not a memory
barrier
- the use of volatile "is likely to be seen as a bug" and will bring
additional scrutiny, rather than simply being a bug
- I/O memory accesses are "always" done through accessor functions,
and "busy-waiting is generally an anti-social act"
- render the "fixing it would be more trouble than it is worth" clause
of the jiffies item and the "justification" required of patches
removing volatile variables as in the original
- restore the emphasis on "within" in the critical section paragraph
- localize terminology (內核→核心, 代碼→程式碼, 內存→記憶體,
寄存器→暫存器, 變量→變數, 訪問→存取, 優化→最佳化, 線程→執行緒,
網絡適配器→網路卡, 爲→為, 裏→裡)
- use the same heading underline characters as the original, and put
the references and credit lines in separate paragraphs so they no
longer run together in the rendered output
update to commit 93431e0607e5 ("Replace HTTP links with HTTPS ones:
documentation")
Signed-off-by: Chen-Yu Yeh <chenyou910331@gmail.com>
---
.../process/volatile-considered-harmful.rst | 115 +++++++++---------
1 file changed, 59 insertions(+), 56 deletions(-)
diff --git a/Documentation/translations/zh_TW/process/volatile-considered-harmful.rst b/Documentation/translations/zh_TW/process/volatile-considered-harmful.rst
index edfc83f32672..6c54c9442524 100644
--- a/Documentation/translations/zh_TW/process/volatile-considered-harmful.rst
+++ b/Documentation/translations/zh_TW/process/volatile-considered-harmful.rst
@@ -7,92 +7,95 @@
:Original: :ref:`Documentation/process/volatile-considered-harmful.rst
<volatile_considered_harmful>`
-爲什麼不應該使用“volatile”類型
-==============================
+為什麼不應該使用“volatile”類型
+------------------------------
-C程序員通常認爲volatile表示某個變量可以在當前執行的線程之外被改變;因此,在內核
-中用到共享數據結構時,常常會有C程序員喜歡使用volatile這類變量。換句話說,他們經
-常會把volatile類型看成某種簡易的原子變量,當然它們不是。在內核中使用volatile幾
-乎總是錯誤的;本文檔將解釋爲什麼這樣。
+C程式設計師常認為volatile表示變數可能在目前的執行緒之外被改變;因此,在核心中
+使用共享資料結構時,他們有時會想用volatile。換句話說,他們常把volatile類型當成
+某種簡易的原子變數,但它並不是。在核心程式碼中使用volatile幾乎從來都不正確;
+本文件將說明原因。
-理解volatile的關鍵是知道它的目的是用來消除優化,實際上很少有人真正需要這樣的應
-用。在內核中,程序員必須防止意外的併發訪問破壞共享的數據結構,這其實是一個完全
-不同的任務。用來防止意外併發訪問的保護措施,可以更加高效的避免大多數優化相關的
-問題。
+理解volatile的關鍵在於:它的目的是抑制最佳化,而這幾乎從來不是我們真正想做的
+事。在核心中,必須保護共享資料結構免受不必要的並行存取,這是一個完全不同的任
+務。防範不必要並行的過程,也能以更有效率的方式避免幾乎所有與最佳化相關的問題。
-像volatile一樣,內核提供了很多原語來保證併發訪問時的數據安全(自旋鎖, 互斥量,內
-存屏障等等),同樣可以防止意外的優化。如果可以正確使用這些內核原語,那麼就沒有
-必要再使用volatile。如果仍然必須使用volatile,那麼幾乎可以肯定在代碼的某處有一
-個bug。在正確設計的內核代碼中,volatile能帶來的僅僅是使事情變慢。
+和volatile一樣,核心中讓資料並行存取變得安全的原語(自旋鎖、互斥鎖、記憶體屏障
+等)也是為了防止不必要的最佳化而設計的。如果正確使用了這些原語,就不需要再使用
+volatile。如果仍然需要volatile,那麼程式碼中幾乎肯定在某處有bug。在正確撰寫的
+核心程式碼中,volatile只會讓事情變慢。
-思考一下這段典型的內核代碼::
+思考一下這段典型的核心程式碼::
spin_lock(&the_lock);
do_something_on(&shared_data);
do_something_else_with(&shared_data);
spin_unlock(&the_lock);
-如果所有的代碼都遵循加鎖規則,當持有the_lock的時候,不可能意外的改變shared_data的
-值。任何可能訪問該數據的其他代碼都會在這個鎖上等待。自旋鎖原語跟內存屏障一樣—— 它
-們顯式的用來書寫成這樣 —— 意味着數據訪問不會跨越它們而被優化。所以本來編譯器認爲
-它知道在shared_data裏面將有什麼,但是因爲spin_lock()調用跟內存屏障一樣,會強制編
-譯器忘記它所知道的一切。那麼在訪問這些數據時不會有優化的問題。
+如果所有程式碼都遵循加鎖規則,那麼在持有the_lock期間,shared_data的值不可能意
+外改變。任何其他想要操作該資料的程式碼都會在這個鎖上等待。自旋鎖原語會充當記憶
+體屏障——它們是刻意這樣撰寫的——這表示資料存取不會被跨越它們而最佳化。所以編譯器
+可能自認為知道shared_data裡會是什麼,但由於spin_lock()呼叫充當記憶體屏障,會強
+制編譯器忘掉它所知道的一切。存取這些資料時不會有最佳化的問題。
-如果shared_data被聲名爲volatile,鎖操作將仍然是必須的。就算我們知道沒有其他人正在
-使用它,編譯器也將被阻止優化對臨界區內shared_data的訪問。在鎖有效的同時,
-shared_data不是volatile的。在處理共享數據的時候,適當的鎖操作可以不再需要
-volatile —— 並且是有潛在危害的。
+如果把shared_data宣告為volatile,加鎖仍然是必要的。但編譯器也會因此無法在臨界
+區 *內* 最佳化對shared_data的存取,而此時我們明知沒有其他人能操作它。在持有鎖期
+間,shared_data並不是volatile的。處理共享資料時,正確的加鎖讓volatile變得不必要
+——而且可能有害。
-volatile的存儲類型最初是爲那些內存映射的I/O寄存器而定義。在內核裏,寄存器訪問也應
-該被鎖保護,但是人們也不希望編譯器“優化”臨界區內的寄存器訪問。內核裏I/O的內存訪問
-是通過訪問函數完成的;不贊成通過指針對I/O內存的直接訪問,並且不是在所有體系架構上
-都能工作。那些訪問函數正是爲了防止意外優化而寫的,因此,再說一次,volatile類型不
-是必需的。
+volatile儲存類別原本是為記憶體映射的I/O暫存器而設計的。在核心中,暫存器存取同樣
+應該受鎖保護,但我們也不希望編譯器“最佳化”臨界區內的暫存器存取。不過在核心中,
+I/O記憶體存取一律透過存取函式完成;直接透過指標存取I/O記憶體是不被認可的做法,
+而且並非在所有架構上都能運作。這些存取函式就是為了防止不必要的最佳化而撰寫的,
+所以,再說一次,volatile是不必要的。
-另一種引起用戶可能使用volatile的情況是當處理器正忙着等待一個變量的值。正確執行一
-個忙等待的方法是::
+另一種可能讓人想使用volatile的情況,是處理器忙等(busy-wait)某個變數的值。執行
+忙等的正確方式是::
while (my_variable != what_i_want)
cpu_relax();
-cpu_relax()調用會降低CPU的能量消耗或者讓位於超線程雙處理器;它也作爲內存屏障一樣出
-現,所以,再一次,volatile不是必需的。當然,忙等待一開始就是一種反常規的做法。
+cpu_relax()呼叫可以降低CPU功耗,或讓位給超執行緒(hyperthreaded)的另一個邏輯處
+理器;它同時也剛好充當編譯器屏障,所以,再說一次,volatile是不必要的。當然,忙
+等本身通常就是一種不顧他人的行為。
-在內核中,一些稀少的情況下volatile仍然是有意義的:
+在核心中,仍有少數罕見的情況下使用volatile是合理的:
- - 在一些體系架構的系統上,允許直接的I/0內存訪問,那麼前面提到的訪問函數可以使用
- volatile。基本上,每一個訪問函數調用它自己都是一個小的臨界區域並且保證了按照
- 程序員期望的那樣發生訪問操作。
+ - 在確實支援直接存取I/O記憶體的架構上,上述存取函式可能會使用volatile。基本
+ 上,每一次存取函式呼叫本身就成為一個小的臨界區,確保存取依照程式設計師預期
+ 的方式發生。
- - 某些會改變內存的內聯彙編代碼雖然沒有什麼其他明顯的附作用,但是有被GCC刪除的可
- 能性。在彙編聲明中加上volatile關鍵字可以防止這種刪除操作。
+ - 會修改記憶體、但沒有其他可見副作用的行內組合語言程式碼,有被GCC刪除的風險。
+ 在asm敘述中加上volatile關鍵字可以防止這種刪除。
- - Jiffies變量是一種特殊情況,雖然每次引用它的時候都可以有不同的值,但讀jiffies
- 變量時不需要任何特殊的加鎖保護。所以jiffies變量可以使用volatile,但是不贊成
- 其他跟jiffies相同類型變量使用volatile。Jiffies被認爲是一種“愚蠢的遺留物"
- (Linus的話)因爲解決這個問題比保持現狀要麻煩的多。
+ - jiffies變數很特殊,每次引用它時都可能得到不同的值,但讀取它時不需要任何特殊
+ 的加鎖。所以jiffies可以是volatile,但強烈不贊成再新增其他這類變數。在這方
+ 面,jiffies被認為是一個“愚蠢的歷史遺留”問題(Linus的原話);修正它的麻煩會
+ 比它的價值還大。
- - 由於某些I/0設備可能會修改連續一致的內存,所以有時,指向連續一致內存的數據結構
- 的指針需要正確的使用volatile。網絡適配器使用的環狀緩存區正是這類情形的一個例
- 子,其中適配器用改變指針來表示哪些描述符已經處理過了。
+ - 指向一致性記憶體(coherent memory)中、可能被I/O裝置修改的資料結構的指標,有
+ 時可以正當地使用volatile。網路卡使用的環形緩衝區就是這類情況的一個例子,網路
+ 卡會改變其中的指標,以表示哪些描述符已經處理完畢。
-對於大多代碼,上述幾種可以使用volatile的情況都不適用。所以,使用volatile是一種
-bug並且需要對這樣的代碼額外仔細檢查。那些試圖使用volatile的開發人員需要退一步想想
-他們真正想實現的是什麼。
+對大多數程式碼來說,上述使用volatile的理由都不適用。因此,使用volatile很可能被
+視為bug,並使程式碼受到額外的審查。想使用volatile的開發者應該退一步,想想自己真
+正想達成的是什麼。
-非常歡迎刪除volatile變量的補丁 - 只要證明這些補丁完整的考慮了併發問題。
+一般都歡迎移除volatile變數的補丁——只要附上能證明並行問題已經過周全考慮的理由。
-註釋
-----
+
+參考資料
+========
[1] https://lwn.net/Articles/233481/
+
[2] https://lwn.net/Articles/233482/
致謝
-----
+====
+
+最初由Randy Dunlap推動並進行研究
-最初由Randy Dunlap推動並作初步研究
由Jonathan Corbet撰寫
-參考Satyam Sharma,Johannes Stezenbach,Jesper Juhl,Heikki Orsila,
-H. Peter Anvin,Philipp Hahn和Stefan Richter的意見改善了本檔。
+感謝Satyam Sharma、Johannes Stezenbach、Jesper Juhl、Heikki Orsila、
+H. Peter Anvin、Philipp Hahn和Stefan Richter的意見讓本文件得以改進。
--
2.43.0
next prev parent reply other threads:[~2026-11-06 11:32 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-06 11:31 [PATCH 00/25] docs/zh_TW: process: resync translations with the English originals Chen-Yu Yeh
2026-11-06 11:31 ` [PATCH 01/25] docs/zh_TW: process: sync 1.Intro.rst with the English original Chen-Yu Yeh
2026-11-06 11:31 ` [PATCH 02/25] docs/zh_TW: process: sync 2.Process.rst " Chen-Yu Yeh
2026-11-06 11:31 ` [PATCH 03/25] docs/zh_TW: process: sync 4.Coding.rst " Chen-Yu Yeh
2026-11-06 11:31 ` [PATCH 04/25] docs/zh_TW: process: sync 5.Posting.rst " Chen-Yu Yeh
2026-11-06 11:31 ` [PATCH 05/25] docs/zh_TW: process: sync 6.Followthrough.rst " Chen-Yu Yeh
2026-11-06 11:31 ` [PATCH 06/25] docs/zh_TW: process: sync 7.AdvancedTopics.rst " Chen-Yu Yeh
2026-11-06 11:31 ` [PATCH 07/25] docs/zh_TW: process: sync 8.Conclusion.rst " Chen-Yu Yeh
2026-11-06 11:31 ` [PATCH 08/25] docs/zh_TW: process: sync code-of-conduct-interpretation.rst " Chen-Yu Yeh
2026-11-06 11:31 ` [PATCH 09/25] docs/zh_TW: process: sync code-of-conduct.rst " Chen-Yu Yeh
2026-11-06 11:31 ` [PATCH 10/25] docs/zh_TW: process: sync gdb-kernel-debugging.rst " Chen-Yu Yeh
2026-11-06 11:31 ` [PATCH 11/25] docs/zh_TW: process: sync development-process.rst " Chen-Yu Yeh
2026-11-06 11:31 ` [PATCH 12/25] docs/zh_TW: process: sync email-clients.rst " Chen-Yu Yeh
2026-11-06 11:31 ` [PATCH 13/25] docs/zh_TW: process: sync kernel-driver-statement.rst " Chen-Yu Yeh
2026-11-06 11:31 ` [PATCH 14/25] docs/zh_TW: process: sync kernel-enforcement-statement.rst " Chen-Yu Yeh
2026-11-06 11:31 ` [PATCH 15/25] docs/zh_TW: process: sync management-style.rst " Chen-Yu Yeh
2026-11-06 11:31 ` [PATCH 16/25] docs/zh_TW: process: sync security-bugs.rst " Chen-Yu Yeh
2026-11-06 11:31 ` Chen-Yu Yeh [this message]
2026-11-06 11:31 ` [PATCH 18/25] docs/zh_TW: process: sync 3.Early-stage.rst " Chen-Yu Yeh
2026-11-06 11:31 ` [PATCH 19/25] docs/zh_TW: process: sync coding-style.rst " Chen-Yu Yeh
2026-11-06 11:31 ` [PATCH 20/25] docs/zh_TW: process: sync embargoed-hardware-issues.rst " Chen-Yu Yeh
2026-11-06 11:31 ` [PATCH 21/25] docs/zh_TW: process: sync howto.rst " Chen-Yu Yeh
2026-11-06 11:31 ` [PATCH 22/25] docs/zh_TW: process: sync license-rules.rst " Chen-Yu Yeh
2026-11-06 11:31 ` [PATCH 23/25] docs/zh_TW: process: sync stable-api-nonsense.rst " Chen-Yu Yeh
2026-11-06 11:31 ` [PATCH 24/25] docs/zh_TW: process: sync submit-checklist.rst " Chen-Yu Yeh
2026-11-06 11:31 ` [PATCH 25/25] docs/zh_TW: process: sync submitting-patches.rst " Chen-Yu Yeh
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261106113142.706783-18-chenyou910331@gmail.com \
--to=chenyou910331@gmail.com \
--cc=alexs@kernel.org \
--cc=corbet@lwn.net \
--cc=dzm91@hust.edu.cn \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=si.yanteng@linux.dev \
--cc=wy@wyuan.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®