待機
読み:たいき
外語:wait
機会が来ることを待つこと。
概要
コンピューターの処理でも、ある処理のあと、いくらかの時間を待つ必要などが生じることが多々あり、この場合に待機することになる。
プログラミングにおいては、次の二種類がある。
- 他への応答性のある待機 (sleep関数など)
- 他への応答性に乏しい待機 (delay関数など、ビジーウェイト/ループウェイト、ポーリング)
特徴
プログラミング
プログラミングでウェイトを作る方法は様々存在する。
例えばLinux(Androidのカーネル含む)でウェイトを作りたい場合、ユーザー空間ではsleep()やusleep()、nanosleep()などが使われる。カーネル内では短時間ならば*delay関数、それ以外ならば*sleep関数を使うことが多い。
そのほかにも、taskletやworkqueue、あるいはタイマーを用いて自力で実装することも可能である。
いずれにせよ、システムの動作状況や呼び出しに要する時間、あるいはシステムタイマーの粒度など様々な要因により、指定した時間よりも若干延ばされる傾向にある。
ライブラリ関数
通常のアプリケーションを作成するためのライブラリ関数である。
POSIX.1-2001では、次が定義されている。
unistd.h
#include <unistd.h>
unsigned int sleep(unsigned int seconds);
int usleep(useconds_t usec);
time.h
#include <time.h>
int nanosleep(const struct timespec *req, struct timespec *rem);
カーネル関数
カーネルでは、一般のライブラリ関数とは異なるものが使われている。Linuxカーネルの場合は、次の通り。
delay関数
delay関数はビジーウェイトであり、内部ではループ処理等で処理時間を稼いでいる。
linux/delay.h
void mdelay( unsigned long msecs ) ;
void udelay( unsigned long usecs ) ;
void ndelay( unsigned long nsecs ) ;
sleep関数
sleep関数は、ウェイト中に、CPUを他のスレッドに対してスケジューリングする。
通常はSIGALRMなどのシグナルを用いて実装されており、時間が経過してシグナルが発生すると、元の処理に戻るようになっている。
linux/delay.h
void ssleep( unsigned int seconds );
void msleep( unsigned int msecs ) ;
unsigned long msleep_interruptible( unsigned int msecs ) ;
再検索