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

RFC-0187:允許處理中的第一個執行緒以 zx_thread_start 開頭
狀態已接受
區域
  • 核心
說明

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

變更
作者
審查人員
提交日期 (年/月)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 的說明文件,以反映新的語意。