RFC-0074:公開程序開始時間

RFC-0074:公開程序開始時間
狀態已接受
領域
  • 核心
說明

讓可從使用者空間查詢程序開始時間。

毛皮變化
  • 488412
作者
審查人員
提交日期 (年-月-日)2021-02-19
審查日期 (年-月-日)2021-03-11

摘要

我們重構 ZX_INFO_PROCESS,以公開程序的開始時間,並 清除描述其執行階段的標記我們說一個程序有有效的開始 ZX_INFO_PROCESS_FLAG_STARTED 標記出現時,並將該標記定義為 呼叫 zx_process_start() 的單調時間 (有效時)。

提振精神

首次提出時為 crbug.com/726484https://fxbug.dev/42105649,Chromium 已提出要求 功能,以便提供追蹤事件的基本時間、擴充 已支援 Linux、macOS 和 Windows 的跨平台介面。 此外,https://fxbug.dev/42119376 也申請了利用相同功能, 並在當機報告中納入運作時間。

設計

ProcessDispatcher 這個簡單直接的擴充項目中,我們會記錄 初始執行緒在 ProcessDispatcher::AddInitializedThread() 的時間 然後傳入 ProcessDispatcher::GetInfo()。第一種方法是 主要的「開頭」zx_process_start() 的日常安排,後者則是 (包含 zx_get_object_info()) 用於帶有 ZX_INFO_PROCESS 的程序帳號代碼。

針對 zx_object_get_info() 填入的結構,目前我們已:

typedef struct zx_info_process {
    // The process's return code; only valid if |exited| is true.
    // If the process was killed, it will be one of the ZX_TASK_RETCODE values.
    int64_t return_code;
    // True if the process has ever left the initial creation state,
    // even if it has exited as well.
    bool started;
    // If true, the process has exited and |return_code| is valid.
    bool exited;
    // True if a debugger is attached to the process.
    bool debugger_attached;
    uint8_t padding1[5];
} zx_info_process_t;

我們改成:

typedef struct zx_info_process {
    // The process's return code; only valid if the
    // |ZX_PROCESS_INFO_FLAG_EXITED| flag is set. If the process was killed, it
    // will be one of the |ZX_TASK_RETCODE| values.
    int64_t return_code;
    // The monotonic time at which zx_process_start() was called, only valid
    // if the |ZX_INFO_PROCESS_FLAG_STARTED| flag is set.
    zx_time_t start_time;
    // Bitwise OR of ZX_INFO_PROCESS_FLAG_* values.
    uint32_t flags;
    uint8_t padding1[4];
} zx_info_process_t;

針對下列哪一個標記值會導入:

// Whether the process has started. zx_process_info_t::start_time is only
// valid if this flag is set.
#define ZX_INFO_PROCESS_FLAG_STARTED (1u << 0)

// Whether the process has exited.
#define ZX_INFO_PROCESS_FLAG_EXITED (1u << 1)

// Whether a debugger is attached to the process.
#define ZX_INFO_PROCESS_FLAG_DEBUGGER_ATTACHED (1u << 2)

布林值對旗標重構並非必要,但這種做法 zx_info_process_t 符合目前的系統呼叫結構政策,儲存位元組 也不會增加執行這項作業所需的工作量 (而且還能大幅減輕一位工程師的負擔)。

實作

  1. 將舊結構體重新命名為 zx_info_process_v1_t,並建立別名來參照 將其歸為舊名稱 (zx_info_process_t -> zx_info_process_v1_t)。重新命名 和ZX_INFO_PROCESS主題ZX_INFO_PROCESS_V1建立別名 舊名稱 (ZX_INFO_PROCESS -> ZX_INFO_PROCESS_V1)。

  2. 新增結構 (zx_info_process_v2_t) 和主題 (ZX_INFO_PROCESS_V2)。變更核心以追蹤流程開始時間 辨識新的主題和結構

  3. 更新所有程式碼 (樹狀結構內和樹狀結構外) 以使用 ZX_INFO_PROCESS_V2

  4. ZX_INFO_PROCESSzx_info_process_t 別名變更為參照 v2 主題和結構

  5. 等待前一個變更全面推出。

  6. 更新所有程式碼 (樹狀結構內和樹狀結構外) 以再次使用 ZX_INFO_PROCESS

  7. 移除 v1 主題和結構,以及 v2 別名。

這些類型的 Rust 和 Go 版本也會類似更新。

成效

加入的邏輯應該會產生可忽略的執行階段費用,尤其是 而重新改造

安全性考量

如果程式已有程序的控制代碼,就能執行更多操作,並收集更多 開始處理的時間此外,開始時間已是 許多其他作業系統中都面臨暴露的危險性。

隱私權注意事項

請參閱上方的「安全性考量」一節。

測試

Zircon 的程序相關核心測試會延長為宣告,例如 計算 zx_process_start() 前後所擷取的時間樣本, 並確認錄製的開始時間還有尚未啟動的程序 已取消設定「ZX_INFO_PROCESS_FLAG_STARTED」。

說明文件

系統將據此更新 ZX_INFO_PROCESS 說明文件。

缺點、替代方案和未知

這也算是公開「開始」也可做為一般任務層級 (如 ZX_INFO_TASK_RUNTIME 下方所示) 的概念。若是討論串,則 以縮排的方式延長:執行緒的開始時間就是 系統會呼叫 zx_thread_start()。對工作來說,說法最自然 它用來「開始」第一個子項開始時由於工作可以建立巢狀結構 但這會引入步行工作子樹狀結構, 比處理其他兩種工作型別更為複雜。最終 不符合目前的需求 因此可迴避工作階層步行的必要性

既有藝術品和參考資料

Linux:/proc/[pid]/stat 公開 starttime。 FreeBSD:/proc/[pid]/status 會以空格分隔的統計資料清單,顯示開始時間。 macOS:proc_pidinfo() 系統呼叫似乎公開這個問題。