futex() - Unix,Linux系統呼叫 - 技術教學
Tutorials Point


  Unix入門
  Unix Shell程式設計
  高階Unix
  Unix有用參考
  Unix有用資源
  精選閱讀

版權所有 © 2014 tutorialspoint



  首頁     參考     討論論壇     關於TP  

futex() - Unix,Linux系統呼叫


previous next AddThis Social Bookmark Button

廣告

名稱

futex - 快速使用者空間鎖定系統呼叫

概要

#include <linux/futex.h>

#include <sys/time.h>

int futex(int *uaddr, int op, int val, const struct timespec * timeout , int *uaddr2, int val3);

描述

futex() 系統呼叫提供了一種方法,允許程式等待給定地址的值發生變化,以及喚醒等待特定地址的任何程序的方法(雖然不同程序中相同記憶體的地址可能不相等,但核心會在內部對映它們,因此在不同位置對映的相同記憶體對於futex() 呼叫將對應)。正如futex(7)中所述,它通常用於實現共享記憶體中鎖的競爭情況。

futex(7)操作未在使用者空間無競爭地完成時,需要呼叫核心進行仲裁。仲裁可以意味著使呼叫程序休眠,或者相反,喚醒等待程序。

此函式的呼叫者應遵守futex(7)中規定的語義。由於這些語義涉及編寫非行動式彙編指令,這反過來可能意味著大多數使用者實際上是庫作者,而不是一般的應用程式開發人員。

uaddr 引數需要指向一個儲存計數器的對齊整數。要執行的操作透過op 引數傳遞,以及一個值val

目前定義了五個操作

標籤描述
FUTEX_WAIT
 此操作會原子地驗證 futex 地址uaddr 是否仍然包含值val,並在等待此 futex 地址上的 FUTEX_WAKE 時休眠。如果timeout 引數非空,則其內容描述等待的最大持續時間,否則為無限期等待。引數uaddr2val3 被忽略。

對於futex(7),如果遞減計數得到負值(表示競爭),則執行此呼叫,並將休眠直到另一個程序釋放 futex 並執行 FUTEX_WAKE 操作。

FUTEX_WAKE 此操作最多喚醒val 個等待此 futex 地址(即在 FUTEX_WAIT 內部)的程序。引數timeoutuaddr2val3 被忽略。

對於futex(7),如果遞增計數顯示有等待者,則在 futex 值設定為 1(表示可用)後執行此操作。

FUTEX_FD 為了支援非同步喚醒,此操作將檔案描述符與 futex 關聯。如果另一個程序執行 FUTEX_WAKE,則該程序將接收在val中傳遞的訊號編號。呼叫程序必須在使用後關閉返回的檔案描述符。

為了防止競爭條件,呼叫者應該在 FUTEX_FD 返回後測試 futex 是否已增加。

FUTEX_REQUEUE(自 Linux 2.5.70 起)為了避免使用 FUTEX_WAKE 時出現“驚群效應”(thundering herd effect),並需要獲取另一個 futex 的所有喚醒程序,引入了此操作。此呼叫喚醒val 個程序,並將所有其他等待者重新排隊到地址uaddr2 上的 futex。
FUTEX_CMP_REQUEUE(自 Linux 2.6.7 起)FUTEX_REQUEUE 的預期用途存在競爭,因此引入了 FUTEX_CMP_REQUEUE。這類似於 FUTEX_REQUEUE,但首先檢查位置uaddr 是否仍然包含值val3。如果不是,則返回錯誤 EAGAIN。

返回值

根據執行的操作,返回值可能具有不同的含義。

標籤描述
FUTEX_WAIT 如果程序被 FUTEX_WAKE 呼叫喚醒,則返回 0。超時的情況下,返回 ETIMEDOUT。如果 futex 不等於預期值,則操作返回 EWOULDBLOCK。訊號(或其他虛假喚醒)導致 FUTEX_WAIT 返回 EINTR。
FUTEX_WAKE 返回喚醒的程序數。
FUTEX_FD 返回與 futex 關聯的新檔案描述符。
FUTEX_REQUEUE 返回喚醒的程序數。
FUTEX_CMP_REQUEUE 返回喚醒的程序數。

錯誤

錯誤程式碼描述
EACCES 沒有對 futex 記憶體的讀取訪問許可權。
EAGAIN FUTEX_CMP_REQUEUE 發現 futex 值意外。(這可能表示競爭;現在使用安全的 FUTEX_WAKE。)
EFAULT 從使用者空間獲取timeout 資訊時出錯。
EINVAL 未定義操作或頁面對齊錯誤。
ENFILE 已達到開啟檔案的系統總數限制。

備註

需要重申的是,裸 futex 並非旨在作為面向終端使用者的易於使用的抽象。預期實現者精通匯編語言,並閱讀過下面引用的 futex 使用者空間庫的原始碼。

版本

最初的 futex 支援合併到 Linux 2.5.7 中,但語義與上述描述不同。具有此處給定語義的 4 引數系統呼叫是在 Linux 2.5.40 中引入的。在 Linux 2.5.70 中添加了一個引數。在 Linux 2.6.7 中添加了第六個引數——混亂,尤其是在 s390 架構上。

符合標準

此係統呼叫是 Minux 特定的。



previous next Printer Friendly

廣告


  

廣告



廣告