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

此 RFC 建议允许客户端对进程生命周期中的所有线程使用 zx_thread_start,而不是强制客户端解决此类问题。

请务必注意,这不需要更改在进程之间传输句柄的方式的语义。zx_process_start 仍将是将句柄传输到新进程的唯一方式。

利益相关方

哪些人对此 RFC 的接受与否有利益相关?(此部分为可选部分,但建议填写。)

教练:davemoore@google.com

Reviewers:

  • 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 的文档将更新以反映新的语义。