RFC-0007:執行緒終止移除

RFC-0007:Zircon 移除執行緒終止功能
狀態已接受
區域
  • Kernel
說明

本文將說明移除執行緒終止功能的原因。

Gerrit 變更
作者
審查人員
提交日期 (年-月-日)2020-09-25
審查日期 (年-月-日)2020-10-06

摘要

過去,zx_task_kill 允許使用者模式終止個別執行緒。不過,終止個別執行緒會鼓勵不良做法,而且很可能導致程序處於不良狀態。因此,應移除終止個別執行緒的功能。

動機和問題陳述

使用者模式無法合理終止個別執行緒。公開這類設施會鼓勵不良做法。

在 Fuchsia 上,與其他系統一樣,終止執行緒是採非同步方式進行;對於正在執行的執行緒,沒有實用的方法可判斷終止執行緒的安全位置。對於遭到封鎖 (等待) 的執行緒,較安全且通常很簡單的解決方法是新增邏輯,讓執行緒在喚醒後自行結束。

終止執行緒的危險

  • 鎖定狀態可能會維持不變,包括控制堆積的全域鎖定。
  • 記憶體可能會流失。至少是執行緒堆疊,但通常還有許多其他部分。
  • 執行階段處於不一致的狀態。至少 C 和 Go 執行階段是如此。
  • 在系統呼叫途中終止執行緒,會導致程序處於不明狀態。核心運作正常,但程序無法得知發生了什麼事,以及哪些事未發生。
  • 擊敗 RAII 包裝函式和自動清除作業。事實上,這會破壞 Fuchsia 使用的高階語言所提供的大部分保證。

設計

如果將執行緒控制代碼傳遞至下列系統呼叫,系統呼叫就會失敗並傳回 ZX_ERR_NOT_SUPPORTED

zx_status_t zx_task_kill(zx_handle_t handle);

程序和工作仍可照常終止。

實作

幸好,Fuchsia 不太會用到終止執行緒。唯一的使用案例是測試程式碼,用於檢查執行緒是否發生特定例外狀況。這段程式碼將會更新,以便在處理例外狀況後,例外執行緒自行結束。如果程式碼中的例外狀況無法復原,可以在執行緒繼續執行前,將例外狀況執行緒的指令指標直接設為 zx_thread_exit 或執行階段的執行緒結束函式。這些測試可能仍會洩漏例外執行緒儲存在堆積中的內容,但執行階段的狀態會更好,且測試程序結束時,系統會收集洩漏的內容。

效能

不適用

安全性考量

不適用

隱私權注意事項

不適用

測試

我們會更新 Zircon 核心測試,確保 zx_task_kill syscall 的行為符合預期。 可以進行一些靜態分析,找出傳遞執行緒的 zx_task_kill 呼叫網站。

我們會遵循完整的 Fuchsia 大規模變更 (LSC) 程序,確保這項變更經過適當測試。

說明文件

zx_task_kill 的說明文件將更新,反映執行緒無法終止。

缺點、替代方案和未知事項

這項提案的替代方案是維持現狀,也就是允許終止執行緒。在 Fuchsia 的整個歷史中,執行緒一直可以終止,但程式依賴此行為的任何可接受用途案例都不存在。因此,我們認為可以安全移除執行緒終止作業。

既有技術和參考資料