Unix-system-calls-futex

提供:Dev Guides
移動先:案内検索

[top]#

[[File:]]

[[File:]]

|Web |This Site

  • 初心者向けのUnix *
  • 高度なUnix *

選択した読書

Copyright©2014 by finddevguides

  Home     References     Discussion Forums     About TP  

futex()-Unix、Linuxシステムコール

[[File:]] image :http://www.finddevguides.com/images/next.gif [next] image:http://www.finddevguides.com/add- this.gif [AddThisソーシャルブックマークボタン]

広告

NAME

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_引数は、カウンターを格納する整列された整数を指す必要があります。 実行する操作は、値_val_とともに、_op_パラメーターを介して渡されます。

現在、5つの操作が定義されています。

Tag

説明

*FUTEX_WAIT*

この操作は、futexアドレス_uaddr_に値_val_がまだ含まれていることを原子的に検証し、このfutexアドレスでFUTEX_WAKEを待機してスリープします。 _timeout_引数がNULL以外の場合、その内容は待機の最大期間を示し、それ以外の場合は無限です。 引数_uaddr2_および_val3_は無視されます。

*futex* (7)の場合、カウントのデクリメントが負の値(競合を示す)を示した場合、この呼び出しが実行され、別のプロセスがfutexを解放してFUTEX_WAKE操作を実行するまでスリープします。
*FUTEX_WAKE*

この操作は、このfutexアドレスで待機している_val_プロセスを最大で起動します(つまり、 FUTEX_WAIT内)。 引数_timeout uaddr2_、および_val3_は無視されます。

*futex* (7)の場合、futex値が1に設定されると(使用可能であることを示す)、カウントをインクリメントして待機者がいることが示された場合、これが実行されます。
*FUTEX_FD*

非同期ウェイクアップをサポートするために、この操作はファイル記述子をfutexに関連付けます。 別のプロセスがFUTEX_WAKEを実行すると、プロセスは_val_で渡されたシグナル番号を受け取ります。 呼び出しプロセスは、使用後に返されたファイル記述子を閉じる必要があります。 引数_timeout uaddr2_、および_val3_は無視されます。

競合状態を防ぐために、呼び出し元は、FUTEX_FDが戻った後にfutexがアップしたかどうかをテストする必要があります。

*FUTEX_REQUEUE* (Linux 2.5.70以降)

この操作は、FUTEX_WAKEが使用され、起動されたすべてのプロセスが別のfutexを取得する必要がある場合に、「雷鳴の群れ」効果を回避するために導入されました。 この呼び出しは、_val_プロセスを起動し、アドレス_uaddr2_のfutex上の他のすべての待機者をキューに再配置します。 引数_timeout_および_val3_は無視されます。

*FUTEX_CMP_REQUEUE* (Linux 2.6.7以降)

FUTEX_REQUEUEの使用目的に競合があったため、FUTEX_CMP_REQUEUEが導入されました。 これはFUTEX_REQUEUEに似ていますが、最初に場所_uaddr_に値_val3_がまだ含まれているかどうかを確認します。 そうでない場合、エラーEAGAINが返されます。 引数_timeout_は無視されます。

返り値

実行された操作に応じて、返される値の意味は異なります。

Tag Description
FUTEX_WAIT Returns 0 if the process was woken by a FUTEX_WAKE call. In case of timeout, ETIMEDOUT is returned. If the futex was not equal to the expected value, the operation returns EWOULDBLOCK. Signals (or other spurious wakeups) cause FUTEX_WAIT to return EINTR.
FUTEX_WAKE Returns the number of processes woken up.
FUTEX_FD Returns the new file descriptor associated with the futex.
FUTEX_REQUEUE Returns the number of processes woken up.
FUTEX_CMP_REQUEUE Returns the number of processes woken up.

エラー

Error Code Description
EACCES No read access to futex memory.
EAGAIN FUTEX_CMP_REQUEUE found an unexpected futex value. (This probably indicates a race; use the safe FUTEX_WAKE now.)
EFAULT Error in getting timeout information from userspace.
EINVAL An operation was not defined or error in page alignment.
ENFILE The system limit on the total number of open files has been reached.

ノート

繰り返しますが、裸のfutexは、エンドユーザーにとって使いやすい抽象化を意図したものではありません。 実装者は、アセンブリの知識があり、以下で参照されるfutexユーザー空間ライブラリのソースを読んでいることが期待されます。

バージョン

最初のfutexサポートはLinux 2.5.7に統合されましたが、上記とは異なるセマンティクスを備えています。 ここに示したセマンティクスを使用した4パラメーターシステムコールは、Linux 2.5.40で導入されました。 Linux 2.5.70では、1つのパラメーターが追加されました。 Linux 2.6.7では、6番目のパラメーターが追加されました。特にs390アーキテクチャでは厄介です。

準拠

このシステムコールはMinux固有です。

[[File:]] image :http://www.finddevguides.com/images/next.gif [next] [[File:]]

広告

  
Advertisements