名 前
futex − 高 速 ユ ー ザ ー 空 間 ロ ッ ク 機 構
書 式
#include <linux/futex.h>
説 明
Linux カ ー ネ ル は 、 ユ ー ザ ー 空 間 で 高 速 な ロ ッ ク 機 構 や セ マ フ ォ を 使 用 す る た め の 基 礎 的 要 素 と し て futex ("Fast user−space mutexes"; 高 速 ユ ー ザ ー 空 間 mutex) を 提 供 し て い る 。 futex は 非 常 に 基 本 的 な も の で 、 POSIX mutex の よ う な 高 度 な ロ ッ ク 機 構 の 概 念 を 構 築 す る の に 役 立 っ て い る 。 こ の ペ ー ジ は す べ て の 設 計 決 定 を 記 述 す る よ う に は な っ て お ら ず 、 ア プ リ ケ ー シ ョ ン や ラ イ ブ ラ リ の 開 発 に 関 係 す る こ と が ら に 限 っ て い る 。 実 際 に は プ ロ グ ラ マ の 多 く は 直 接 は futex を 扱 わ な い が 、 そ の 代 わ り futex に 基 づ い て 構 築 さ れ た シ ス テ ム ラ イ ブ ラ リ (例 え ば NPTL ス レ ッ ド ) に 依 存 す る こ と に な る だ ろ う 。
futex は 異 な る プ ロ セ ス 間 で 共 有 す る こ と の で き る メ モ リ ー 片 で 識 別 さ れ る 。 こ れ ら の 異 な る プ ロ セ ス で は 、 同 じ ア ド レ ス が 付 与 さ れ て い る 必 要 は な い 。 裸 の 姿 で は futex の セ マ ン テ ィ ク ス は セ マ フ ォ と 同 じ で あ る 。 futex は 不 可 分 操 作 で (atomically) イ ン ク リ メ ン ト し た り デ ク リ メ ン ト し た り で き る カ ウ ン タ ー で 、 プ ロ セ ス は 値 が 正 に な る の を 待 つ こ と が で き る 。
futex の
操 作 は 、 競 合
が な い 場 合 に
は 完 全 に ユ ー
ザ ー 空 間 で 行
な わ れ る 。 カ
ー ネ ル は 競 合
が 起 こ っ た 場
合 の 仲 裁 に 関
与 す る だ け で
あ る 。 良 識 あ
る 設 計 で は 競
合 が 起 こ ら な
い よ う 努 力 す
る が 、 futex も 競 合
状 態 に 関 し て
最 適 化 さ れ て
い る 。 裸 の 姿
で は 、 futex は 不 可
分 な ア セ ン ブ
リ 命 令 で の み
操 作 さ れ る ア
ラ イ ン メ ン ト
の 揃 っ た int 型 の
変 数 で あ る 。
複 数 の プ ロ セ
ス は こ の int 型 変
数 を 、 mmap(2) を 用
い る か 、 共 有
メ モ リ ー セ グ
メ ン ト を 介 す
る か 、 メ モ リ
ー 空 間 を 共 有
す る (こ の 場 合
、 ア プ リ ケ ー
シ ョ ン は 一 般
的 に マ ル チ ス
レ ッ ド で あ る
と 呼 ば れ る ) か
方 法 で 共 有 す
る 。 セ マ ン テ
ィ ク ス
futex の 操 作 は す べ
て ユ ー ザ ー 空
間 か ら 始 ま る
が 、 必 要 に 応
じ て futex(2) シ ス テ
ム コ ー ル を 用
い て カ ー ネ ル
と 通 信 す る 。
futex を "up" す る に は 、 ホ ス ト CPU に 対 し int 型 変 数 を 不 可 分 操 作 で イ ン ク リ メ ン ト す る よ う な 、 適 切 な ア セ ン ブ リ 命 令 を 実 行 す る 。 そ の あ と 、 実 際 に 0 か ら 1 に 変 化 し た か ど う か を チ ェ ッ ク し 、 変 化 し て い れ ば 待 ち プ ロ セ ス (waiter) は な い と い う こ と で あ り 、 操 作 は 完 了 す る 。 こ れ は 競 合 の な い 場 合 で あ り 、 高 速 で よ く 起 こ る は ず で あ る 。 競 合 が あ る 場 合 、 不 可 分 操 作 の イ ン ク リ メ ン ト で カ ウ ン タ ー は −1 (ま た は 他 の 負 の 数 ) か ら 変 化 す る 。 こ れ が 検 出 さ れ る と 、 待 ち プ ロ セ ス が あ る と い う こ と で あ る 。 ユ ー ザ ー 空 間 で は カ ウ ン タ ー を 1 に 設 定 し 、 FUTEX_WAKE を 用 い て カ ー ネ ル に 待 ち プ ロ セ ス を wake (起 床 ) さ せ る よ う 指 示 す る 。
futex の 獲 得 を 待 つ 、 す な わ ち futex を "down" す る に は 反 対 の 操 作 を 行 な う 。 不 可 分 操 作 で カ ウ ン タ ー を デ ク リ メ ン ト し 、 カ ウ ン タ ー が 0 に 変 化 し た か ど う か を チ ェ ッ ク す る 。 変 化 し て い れ ば 操 作 は 完 了 し futex は 競 合 し て い な い と い う こ と で あ る 。 0 に な ら な か っ た 場 合 、 プ ロ セ ス は カ ウ ン タ ー を −1 に 設 定 し 、 他 の プ ロ セ ス が そ の futex を up す る の を 待 つ よ う カ ー ネ ル に 要 求 し な け れ ば な ら な い 。 こ れ は FUTEX_WAIT を 行 な う こ と で 実 現 さ れ る 。
futex(2) シ ス テ ム コ ー ル に は 、 省 略 可 能 な 引 数 と し て タ イ ム ア ウ ト を 渡 す こ と が で き 、 カ ー ネ ル は そ の futex が up さ れ る の を ど れ く ら い の 期 間 待 つ べ き か を 指 定 す る こ と が で き る 。 こ の 場 合 、 セ マ ン テ ィ ク ス は も っ と 複 雑 に な る た め 、 よ り 詳 細 な 情 報 を 得 る に は プ ロ グ ラ マ は futex(2) を 参 照 す る こ と 。 同 じ ペ ー ジ に 非 同 期 の futex 待 ち に つ い て も 記 さ れ て い る 。
バ ー ジ ョ ン
最 初 の futex 対 応 は Linux 2.5.7 で 組 み 込 ま れ た が 、 上 記 の セ マ ン テ ィ ク ス と は 異 な る 。 現 在 の セ マ ン テ ィ ク ス は Linux 2.5.40 以 降 で 利 用 可 能 で あ る 。
注 意
再 び 繰 り 返 し て お く が 、 裸 の futex は エ ン ド ユ ー ザ ー が 容 易 に 使 え る 概 念 と し て 意 図 さ れ た も の で は な い 。 実 装 者 は 、 ア セ ン ブ リ 言 語 に 慣 れ て お り 、 以 下 に 挙 げ る futex ユ ー ザ ー 空 間 ラ イ ブ ラ リ の ソ ー ス を 読 み 終 え て い る こ と が 要 求 さ れ る 。 こ の マ ニ ュ ア ル ペ ー ジ に は futex(2) プ リ ミ テ ィ ブ の 最 も 一 般 的 な 使 用 法 が 記 さ れ て い る 。 こ れ は 決 し て 唯 一 の 使 用 法 で は な い 。
関 連 項 目
Fuss, Futexes and Furwocks: Fast Userlevel Locking in Linux (proceedings of the Ottawa Linux Symposium 2002), futex の 使 用 例 ラ イ ブ ラ リ , futex−*.tar.bz2 ftp://ftp.kernel.org/pub/linux/kernel/people/rusty/">ftp://ftp.kernel.org/pub/linux/kernel/people/rusty/.
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。