スポンサーリンク

SLEEP(9) FreeBSD カーネル開発者マニュアル SLEEP(9)

名称

sleep, msleep, tsleep, wakeup − イベントのウェイト

書式

#include <sys/param.h>
#include <sys/systm.h>
#include <sys/proc.h>

int

tsleep(void *ident, int priority, const char *wmesg, int timo);

int

msleep(void *ident, struct mtx *mtx, int priority, const char *wmesg, int timo);

void

wakeup(void *ident);

void

wakeup_one(void *ident);

解説

関数 tsleep() および wakeup() はイベントに基づいたプロセスのブロックを取 り扱います。プロセスが外部イベントを待たなければならない場合には、そのプ ロセスは tsleep() によってスリープ状態に置かれます。パラメータ ident は、 プロセスがどのイベント上でスリープしているかを識別する一意的な任意のアド レスです。単一の ident 上でスリープしている全てのプロセスは後で、 wakeup() によって起こされます。これは、しばしば割り込みルーチンの中から呼 び出され、プロセスがブロックしているリソースが現在利用可能になったことを 示します。

パラメータ wmesgps(1) のようなツールのためのスリープ状態を解説する文 字列です。これらのプログラムの任意の文字列を表示するための領域の制限のた め、このメッセージは 6 文字を超えるべきではありません。

wakeup_one() 関数はパラメータ ident 上でスリープしているキューの中の最初 のプロセスを実行可能にするために使用されます。これは、多数のプロセスが同 じアドレス上でスリープしているが、実行可能となったときその中の 1 つのみが 実際には役に立つ作業ができるときに、システムが飽和することを防ぐことが可 能です。

tsleep() 関数は一般的なスリープの呼び出しです。明示された識別子上の wakeup が実行されるまでの間、現在のプロセスを一時停止させます。それからそ のプロセスは明示された優先度 priority で実行可能にされます。長くて timo / hz 秒間 (0 はタイムアウトなしを意味します) スリープします。 Giant ロック が保持されていないなら、 timo は 0 以外でなければなりません。 priority が PCATCH フラグを含む場合には、スリープの前後でシグナルがチェックされます。 そうでない場合には、シグナルはチェックされません。起こされた場合には 0 を 返し、タイムアウトが経過した場合には EWOULDBLOCK を返します。 PCATCH が設 定されていてシグナルが配信される必要がある場合で、可能であれば現在のシス テムコールが再開始されるべきである場合には ERESTART が返され、 (EINTR を 返す) シグナルによってそのシステムコールが中断されるべき場合には EINTR が 返されます。

msleep() 関数は tsleep の変種です。パラメータ mtx は、スリープの前に抜 け、 msleep() が戻る前に入る mutex です。 priority が PDROP フラグを含む 場合には、戻る前に mtx 引数を再取得しません。ある状態を不可分にチェックで きることを保証し、その状態の変更も対応する wakeup も失うことなく現在のプ ロセスを中断できることを保証するために、この mutex は使用されます。

戻り値

上記を参照してください。

関連項目

ps(1), malloc(9), mi_switch(9)

歴史

sleep/wakeup プロセス同期機構はとても古いです。これはとても早期のバージョ ンの UNIX で登場しました。

tsleep() 関数は 4.4BSD で登場しました。

sleep() 関数は伝統的な形式でした。これはタイムアウトも wmesg も指定できな いため、使用取り止めとなりました。

作者

このマニュアルページは Jörg Wunsch ⟨joerg@FreeBSD.org⟩ によって書かれまし た。

FreeBSD 10.0 December 17, 1998 FreeBSD 10.0

スポンサーリンク