RFC-0074:公開程序開始時間 | |
---|---|
狀態 | 已接受 |
領域 |
|
說明 | 讓可從使用者空間查詢程序開始時間。 |
毛皮變化 | |
作者 | |
審查人員 | |
提交日期 (年-月-日) | 2021-02-19 |
審查日期 (年-月-日) | 2021-03-11 |
摘要
我們重構 ZX_INFO_PROCESS
,以公開程序的開始時間,並
清除描述其執行階段的標記我們說一個程序有有效的開始
ZX_INFO_PROCESS_FLAG_STARTED
標記出現時,並將該標記定義為
呼叫 zx_process_start()
的單調時間 (有效時)。
提振精神
首次提出時為 crbug.com/726484 和 https://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
符合目前的系統呼叫結構政策,儲存位元組
也不會增加執行這項作業所需的工作量
(而且還能大幅減輕一位工程師的負擔)。
實作
將舊結構體重新命名為
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
)。新增結構 (
zx_info_process_v2_t
) 和主題 (ZX_INFO_PROCESS_V2
)。變更核心以追蹤流程開始時間 辨識新的主題和結構更新所有程式碼 (樹狀結構內和樹狀結構外) 以使用
ZX_INFO_PROCESS_V2
。將
ZX_INFO_PROCESS
和zx_info_process_t
別名變更為參照 v2 主題和結構等待前一個變更全面推出。
更新所有程式碼 (樹狀結構內和樹狀結構外) 以再次使用
ZX_INFO_PROCESS
。移除 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()
系統呼叫似乎公開這個問題。