RFC-0187:允許處理程序中的第一個執行緒以 zx_thread_start 開頭

RFC-0187:允許程序中的第一個執行緒以 zx_thread_start 啟動
狀態已接受
區域
  • 核心
說明

目前,程序中的第一個執行緒必須使用 zx_process_start 啟動。這項 RFC 建議允許使用 zx_thread_start 啟動第一個執行緒。

Gerrit 變更
作者
審查人員
提交日期 (年-月-日)2022-08-04
審查日期 (年-月-日)2022-09-31

摘要

這份 RFC 建議允許使用 zx_thread_start 啟動程序中的第一個執行緒,而不需要變更句柄轉移的語意。

提振精神

目前,程序中的第一個執行緒必須使用 zx_process_start 啟動,後續的執行緒則必須使用 zx_thread_start 啟動。這兩種系統呼叫有兩個不同之處:

  1. zx_process_start 需要程序和執行緒的句柄才能啟動,而 zx_thread_start 只需要執行緒的句柄。
  2. zx_process_start 可讓呼叫端將句柄轉移至已啟動的程序。

如果用戶端未明確使用 zx_thread_start 啟動執行緒 (例如使用標準執行緒程式庫),這項限制可能會強制採用重大的解決方法。

請考慮 Starnix 的情況,該系統會使用 Rust 的 std::thread 建立及啟動新的執行緒。當 Starnix 在程序中建立第一個執行緒時,它無法告知基礎程式庫「建立但不啟動」執行緒,也無法告知程式庫使用 zx_process_start 而非 zx_thread_start

與其強制要求用戶端解決這類問題,不如讓用戶端在程序生命週期中,針對所有執行緒使用 zx_thread_start,以便解決此問題。

請注意,這項功能不需要變更在程序之間轉移句柄的語義。zx_process_start 仍是將句柄轉移至新程序的唯一方法。

相關人員

誰會受到這項 RFC 是否通過的影響?(此為選用部分,但建議您填寫)。

協助人員:davemoore@google.com

審查者:

  • abarth@google.com
  • cpu@google.com
  • mcgrathr@google.com
  • travisg@google.com

諮詢:

社會化:

過去一年,我們已與核心團隊的多位成員討論過這項異動。

設計

此 RFC 不需要變更介面,只會變更在程序中第一個執行緒上呼叫 zx_thread_start 的語意。

實作

這項變更可讓 zx_thread_start(thread, thread_entry, stack, arg1, arg2) 用於啟動程序中的任何執行緒。呼叫 zx_thread_start 等同於呼叫 zx_process_start(process, thread, entry, stack, ZX_HANDLE_INVALID, arg2)

唯一的差異在於 zx_thread_start 不需要明確的程序句柄,且允許呼叫端設定 arg1 (此為 zx_process_startZX_HANDLE_INVALID 的保留值)。

實作作業可在單一變更中完成,請參閱這裡的說明。

成效

系統會針對變更執行標準核心基準測試。

人體工學

這項異動可讓用戶端在程序中建立所有執行緒時使用標準執行緒程式庫,進而改善用戶端的人體工學。

安全性考量

程序之間的句柄轉移方式保持不變,在程序中啟動第一個執行緒後呼叫 zx_process_start 會導致錯誤。

說明文件

zx_process_startzx_thread_start 的說明文件將更新,以反映新的語意。