RFC-0236:VMO 快照-修改的本機副本

RFC-0236:VMO 已修改快照的本機副本
狀態已接受
領域
  • 核心
說明

目標是推出新的 VMO 子項類型,以便透過快照擷取支援的 VMO 中任何修改的頁面。

問題
  • 123742
毛皮變化
作者
審查人員
提交日期 (年-月-日)2023-07-20
審查日期 (年-月-日)2023-12-12

摘要

目標是推出新的 VMO 子類型,讓快照 。

提振精神

目前核心支援兩種 VMO 本機副本 (又稱為子項 VMO): 原始快照,也就是 VMO 在複製後看不到彼此變更的內容 作業完成,而且子項建立的快照本機副本 可以在作業完成後,看到父項 VMO 的變更,除了 以便針對寫入的子項網頁顯示屬性。

複製作業可以在 VMO 本機副本上重複執行,進而建立 子項 VMO 的階層結構為了簡化 Zircon 核心的實作方式, 允許使用混合階層;您可以建立真實快照的階層 寫入 VMO 的階層

隨著 Starnix 的問世,fork() 必須有效率地獲得 Fuchsia 的支援。 Fork 需要將父項程序的整個位址空間複製到 子項程序,包括匿名記憶體與分頁式資料, 擔任 VMO

核心僅支援匿名的匿名快照,因此發生問題 而如果是頁面伺服器支援的 VMO,則僅支援寫入快照的本機副本。 因此,無法以複製形式達成 fork() 合約,因此必須強制使用 Starnix 實作 Eager 複製和/或其他 CPU 和記憶體密集型替代方案。

相關人員

誰會負責確認 RFC 是否已獲接受?(這個部分為選填,但 encouraged.)

csuter@google.com、jamesr@google.com

講師:

davemoore@google.com

審查者:

rashaeqbal@google.com、jamesr@google.com

諮詢:

列出應審查 RFC,但不需經過核准的人員。

csuter@google.com、adanis@google.com、cpu@google.com、mvanotti@google.com、 lindkvist@google.com

社交功能:

設計文件已與 Zircon 團隊和 Starnix 和處理中的工作 CL 也與利害關係人分享,以便進行基準化作業。

需求條件

  • 針對同時具有頁面伺服器支援的 VMO,以高效率複製位址空間 以及匿名的 VMO
  • 程序無法存取 VMO 後,不應浪費記憶體 父項 VMO 或子項 VMO 的「最後一項帳號代碼關閉」,也就是 這兩種情況
vmo = create_vmo();
   loop {
      child = create_snapshot_modified(vmo)
      child.write(...)
      vmo = child  // old vmo is dropped
   }
vmo = create_vmo();
   loop {
      vmo.write(...)
      child = create_snapshot_modified(vmo)
      // child is dropped
   }

設計

ZX_VMO_CHILD_SNAPSHOT_MODIFIED 是一種新的 VMO 本機副本,會允許 建立經過快照修改的子類型建立專案

此標記會建立一個子項目,以保留存有網頁的快照 受到呼叫器支援 VMO 的子項修改。從語意的角度來說,這就像超熱 會在父項中所有未由網頁工具支援的頁面上執行副本。以下日期的頁面: 網頁伺服器支援的上層項目,至少在寫入時執行複製作業 複製到本機副本這與原始快照語意不同 就像在 VMO 中的所有頁面建立快速副本一樣

首次在支援頁面器的 VMO 中使用時,語意 但使用了 SNAPSHOT_AT_LEAST_ON_WRITE建立本機副本的控制代碼 這個物件一開始與父項相同,但還是可以修改 以免發生差異

用於比對任何匿名 VMO 時,SNAPSHOT_MODIFIED 副本將 已升級,享有快照語意,類似於現有的複製類型升級 SNAPSHOT_AT_LEAST_ON_WRITE 使用的語意。

這個標記不適用於具有固定區域、配量或 VMO 的 VMO 複製作業 繼承自 zx_vmo_create_physical()zx_vmo_create_contiguous()

保護殼

經過頁面器支援的 VMO 修改快照

為受呼叫器支援的 VMO 建立單一 SNAPSHOT_MODIFIED 副本時 就如同已建立單一 SNAPSHOT_AT_LEAST_ON_WRITE 本機副本一樣當時 本機副本執行時,新的 VMO 會與父項相同。

除非另一個 SNAPSHOT_MODIFIED 在本機副本上執行,否則此物件仍可 已修改。本機副本中所有未經修改的頁面,在寫入時至少都會有複製的版本 語意

經過至少寫入一次或修改快照後修改快照

以呼叫器支援的 VMO

SNAPSHOT_MODIFIEDSNAPSHOT_AT_LEAST_ON_WRITE 行為相同 且兩種情況皆採用呼叫式 VMO。SNAPSHOT_MODIFIED 的呼叫端,會產生相同的語意。屬於 非分頁式支援的頁面不會有快照 釋出寫入時複製的語意

快照之後修改過快照

在這種情況下,語意會升級為快照,類似下方的快照: snapshot-at-least-on-write.

不支援的案例

目前不支援以下情況,且如果採用 SNAPSHOT_MODIFIED 已嘗試複製,會傳回 ZX_ERR_NOT_SUPPORTED

經過快照修改的快照鏈結結尾

經修改的快照可擴大用於 「寫入最少快照」鏈結但這可能會造成混淆, 從複製的 VMO 中未經分支的網頁可以看到修改內容 是單向 VMO 鏈結,其中最接近 讀取。這會導致不一致的原先承諾, 任何修改頁面都可以建立快照

經過修改的快照鏈結中間,即寫入至少一次的快照

如果 VMO 有子項 (即 ,因為這可能會導致資料不一致 階層

命名法

zx_vmo_create_child() 中複製類型旗標的現有命名慣例 旨在以描述所提供語意的方式為旗標命名。目前 此標記名稱是 SNAPSHOT_MODIFIED,因為匯總了 本機副本中修改過的頁面即為快照。類似選項是 SNAPSHOT_MODIFICATIONS。其他考慮的旗標是SNAPSHOT_MIXED 這會描述語意,但較不清楚 「SNAPSHOT_PAGER_MODIFICATIONS」是另外考慮的項目,但不理想 讓 VMO 與呼叫器結合

實作

修改快照會影響 Zircon 中的幾個檔案,但可分為 變更 CL,用來在核心內部新增對新快照類型的支援 選項旗標新增至 syscall。

我們會新增部分核心測試,驗證新的 並納入更複雜的核心測試 和選項旗標的簡介

成效

在多數情況下,只有在建立新程式碼時,才會呼叫 經過快照修改的本機副本,因此現有程式碼的效能在預期範圍內 變更。例外狀況是建立 SNAPSHOT_AT_LEAST_ON_WRITE 時 基本做法包括取得 VMO 鎖定的額外取得程序 如果這會導致效能降低 複製選擇程式碼以避免這種情況。

安全性考量

修改快照不太可能產生任何安全漏洞 ,且並未導入任何新功能。

測試

核心單元測試和核心測試將包含在相關 CL 中。

說明文件

我們會發布以 Zircon 開發人員為目標對象的詳細設計文件。這項服務 將概述新的資料結構、支援與不支援的案例 和替代方案

系統會在 zx_vmo_create_child() 中新增標記,並將 說明:

ZX_VMO_CHILD_SNAPSHOT_MODIFIED - 建立子項,如同 任何人在上層網頁 (無頁面) 未支援的網頁中執行了立即複製,例如 受呼叫器支援 VMO 的子項修改過的網頁。已支援呼叫器 頁面至少會有寫入語意的語意這個旗標可能無法用於 使用 zx_vmo_create_physical()、zx_vmo_create_contiguous() 和 VMO 建立的 VMO 包含固定頁面或這類 VMO 的子系這也不是 適用於使用 SNAPSHOT_AT_LEAST_ON_WRITE 建立的 VMO,並且已安裝 非 Slice 子項或非分頁式 VMO 的子項。

缺點、替代方案和未知

使用 現有的 Zircon VMO 基本功能服務網頁的運作方式 同時,當其子項形成單一 VMO 時 具有寫入語意的單向鏈結。

可以在匿名 VMO 上使用的快照旗標,來建立隱藏 VmCowPages 是目標 VMO 及其新快照的共同祖系。阿斯 沒有指向隱藏 VmCowPages 可以修改 就無法變動。隱藏的 VmCowPages 會保留來自 目標 VMO,子項的修改內容具有「寫入時複製」語意。 因此,在此階層中搜尋網頁時,需要在樹狀結構中 若是在隱藏根層級

很難將現有的快照資料結構用於 就像原始 VMO 一樣,根 VMO 會一直隱藏 成為左派的孩子如果呼叫器仍指向原始 VMO (現在包含隱藏的父項) 必須傳播網頁器作業 ,以在其子項的要求中提供網頁。這個 將頁面新增至非運作中的節點時,會造成資料不一致的問題 保持開啟。

最簡單的解決方法是建立混合階層,也就是 顯示和有一個隱藏子項,做為快照的隱藏根 。

有很多方式可以向使用者說明提供的語意。 的描述,則概述了在 另一種取景方式則是修改及複製 。範例如下:

「這個標記將會建立一個子項目,用來保留任何已修改網頁的快照 。如果根 vmo 寫入未經修改的網頁 已修改快照的子項,就會看到變更。這個 不同於原始快照語意 副本已建立。」

這個說明是正確,但需要進一步說明 請注意,此行為需要網頁工具才能運作 在匿名 VMO 上使用快照語意。

SNAPSHOT_MODIFIED 能夠取代 SNAPSHOT_AT_LEAST_ON_WRITE 嗎?

在寫入時逐步淘汰快照並不容易 兩個複製類型的語意不同,因此快照經過修改 可能會導致非預期的行為雖然這兩種副本類型都提供「至少 寫入時複製修改過的快照可以混合 相同 VMO 中至少寫入時頁面此外,這項變更 則需要進行效能測試VMO 獲得呼叫式回應後 每次建立本機副本時,「快照儲存」會分配較少的記憶體 未建立任何隱藏的共同祖系。因此,遷移應用程式的所有用途 在某些使用情況下,「寫入至少少量快照」可能會引發效能迴歸 用途

建議重新調查「SNAPSHOT_AT_LEAST_ON_WRITE」。 但是,這會簡化 zx_vmo_create_child() 的 API fdio 輔助程式承諾使用與 SNAPSHOT_MODIFIED 相容的語意。

既有藝術品和參考資料

zx_vmo_create_child()