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

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

目前程序中的第一個執行緒必須以 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

本 RFC 建議允許用戶端在程序生命週期內,對所有執行緒使用 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_start 中的 ZX_HANDLE_INVALID)。

您可以在單一變更中完成實作,詳情請參閱這篇文章

效能

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

人體工學

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

安全性考量

程序間的控制代碼轉移方式維持不變,且在程序中的第一個執行緒啟動後呼叫 zx_process_start 會導致錯誤。

說明文件

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