名稱
futex - 建立使用者空間同步工具的基石。
SYNOPSIS
「futex」是快速使用者空間 MTEX。屬於低階
同步基元是較高等級的構成要素
pthread_mutex_t
和 pthread_cond_t
等 API。
Futexe 因為設計為不進入核心或分配核心 是無爭論情境下的資源
說明
Zircon futex 實作目前支援三種分散式的作業 超過 6 次系統呼叫:
zx_status_t zx_futex_wait(const zx_futex_t* value_ptr,
zx_futex_t current_value,
zx_handle_t new_futex_owner,
zx_time_t deadline);
zx_status_t zx_futex_wake(const zx_futex_t* value_ptr, uint32_t wake_count);
zx_status_t zx_futex_wake_single_owner(const zx_futex_t* value_ptr);
zx_status_t zx_futex_requeue(const zx_futex_t* value_ptr,
uint32_t wake_count,
zx_futex_t current_value,
const zx_futex_t* requeue_ptr,
uint32_t requeue_count,
zx_handle_t new_requeue_owner);
zx_status_t zx_futex_requeue_single_owner(const zx_futex_t* value_ptr,
zx_futex_t current_value,
const zx_futex_t* requeue_ptr,
uint32_t requeue_count,
zx_handle_t new_requeue_owner);
zx_status_t zx_futex_get_owner(const zx_futex_t* value_ptr, uint64_t* koid);
這些元件都會共用 value_ptr
參數,也就是
一個相符的使用者空間整數。這個虛擬位址
用於追蹤特定執行緒的漏洞
等你探索。核心目前不會修改
*value_ptr
(但如果您日後可能會執行某些作業,請見下方說明)
這類)。完全由使用者空間程式碼決定,
以便建構互斥鎖等項目。
請注意,使用地址標記時,使用者空間指標
核心中的 Futex 實例不會總是有 1 對 1 的對應關係。位址
已移除並使用架構專屬的標記資訊
。例如,在 ARM 上,Top-Byte-Ignore (TBI) 是
已啟用,值為 0x0A000000FF123450
的 Futex 指標具有相同的值
設為 futex 指標,並將值設為 0x0B000000FF123450
,因為
這兩個標記 (0x0A
和 0x0B
) 不同,兩者位址位元相同。
請參閱 zx_futex_wait()
、zx_futex_wake()
、zx_futex_requeue()
和
zx_futex_get_owner()
手冊頁面瞭解詳情。
權利
Futex 物件沒有任何相關聯的權利。
使用者空間程式碼只能在 futex:等待和喚醒 (重新排入佇列是這兩者的組合)。由於 futexes 只是一個程序的本機概念,會撤銷其中任一個對於 就會讓毛茸茸的功能變得沒價值。
此外,從核心的角度來看,futexes 是暫時物件, 只有在 futex 具有等候程序時才會出現狀態。不符合耐用狀態 要有存活性,就愈來愈無法持續 CANNOT TRANSLATE
Linux futexes 的差異
請注意,每個虛擬機器上 都有 IP 位址這與 Linux 版本不同 ,以區分私人 Futex 作業 就是我們單純處理中的請求) 位址空間。
如前所述,所有的 Futex 運算都會保留
從核心取消修改的「futex」。其他可能的作業,如
Linux 的 FUTEX_WAKE_OP
,必須對值進行不可拆分的操控
,但我們目前的實作不需要。
擁有權和優先順序繼承
總覽
某些執行階段可能需要基於 futexes 實作同步基元 這些物件會展現優先順序繼承行為為了支援這些使用者 Zircon futexes 具有「所有權」的概念可用來實作 以及一些基本問題你可以選擇是否要使用這項功能。
任意時候,毛茸茸可能是由單件商品所有,或屬於單件 。如果執行緒擁有一或多個 futexe,其有效優先順序就會變成 其基本優先順序上限,以及目前所有 目前擁有的所有未來螺旋槳。執行緒消失後 CANNOT TRANSLATE 上述關係一旦執行緒不再擁有任何 futexe 項目後, 優先順序會回到基本優先順序
使用者空間程式碼必須負責向 futex 擁有者的信號發出信號 建構特定類型的內容時,如何正確應用擁有權概念 需要優先繼承行為的同步物件。
Zircon futexe 最多只能有一位擁有者。多個人類的存軍 不支援優先繼承的目的毛茸茸的主人可以 不能同時成為同一毛茸茸的生長。
指派擁有權
透過各個「等待」的方式,指派毛衣的擁有權或「排入佇列」作業。在 如果是重新佇列作業,目標 Futex 是重新佇列的後置字串,而不是 Wake_futex。使用者將帳號代碼傳遞至執行緒,指出目前擁有者是誰 後半部應為 ZX_HANDLE_INVALID (如果沒有擁有者)。
- 將有效的帳號代碼傳遞至執行緒,表示稍後轉換擁有者是 構成使用者空間程式碼的責任傳送無效的帳號代碼或帳號代碼 會導致等待/重新佇列作業失敗。
- 尚未開始的執行緒可能不是漏斗所有的擁有者。任何嘗試 將 futex 的擁有權指派給尚未開始的執行緒 會導致等待/重新佇列作業失敗。
- 結束的執行緒不一定是毛茸茸的擁有者。如果執行緒結束 然而,肥皂為無人了如果 使用者嘗試將 Futex 的擁有權指派給已結束的執行緒, 等待/重新佇列作業的行為,就像是將 ZX_HANDLE_INVALID 以 新的生殖器擁有者
- 如果等待/重新佇列作業成功,目標 Futex 的擁有者 「一律」設為指定的執行緒,如果設為「不」 傳遞 ZX_HANDLE_INVALID。
- 特別是在等待/重新佇列作業因不相符而失敗時 球員的預期值與實際 Futex 值之間 futex 會維持不變,該作業的狀態碼將會變為 ZX_ERR_BAD_STATE.無論值為何,系統一律會傳回這個錯誤代碼 。即使傳遞的值 導致傳回 ZX_ERR_BAD_HANDLE 的狀態。
轉移擁有權
核心可能會代表使用者轉移 Futex 的擁有權
會在喚醒作業或重新佇列作業期間啟動。於重新排入佇列時
作業,轉乘的目標為 wake_futex,而非 requeue_futex。
只有在使用
zx_futex_wake_single_owner()
或 zx_futex_requeue_single_owner()
喚醒/重新佇列作業的變體。的 single_owner
變體
這些作業只會釋放一個等候程序
將 Futex 的擁有權指派給發行的執行緒。
- 如果喚醒作業期間「沒有」等候者,則代表目前尚無 擁有者。這一點將維持不變。
- 如果重新佇列作業因預期的 Futex 值不符而失敗 以及實際的毛皮值 不變。
- 成功呼叫 喚醒/重新佇列作業,並將目標 Futex 的擁有者設為 什麼都不做。
關於肥胖的論文
Fuss、Futexes 和 Furwocks:在 Linux 中快速鎖定使用者層級鎖定、Hubertus Franke 和 Rusty Russell
這是描述 Linux Futex 的原始白皮書。這項服務 記錄了原始實作的歷史記錄和設計 可能之前 (失敗) 嘗試建立快速的使用者空間 同步處理基元和成效評估。
《Futexes Are Tricky》、Ulrich Drepper
本文件將說明 在 Linux 中啟動 futexes。探討核心實作,並 進一步說明正確且有效率的使用者空間 互斥鎖、條件變數等的實作。
-
針對「Futexes」的深入解說,總結來說 可免除
FUTEX_CMP_REQUEUE
Locking in WebKit、Filip Pizlo
提供 WebKit 上鎖基底的深入導覽, 基準和分析。包含「停車位」的詳細說明 "這種概念可讓模型以極精簡的方式呈現使用者空間 互斥鎖。