【linux開発】タイマ使用setimer
setitimer
Linuxは、プロセスごとに3つのsetitimer間隔タイマを提供します. ITIMER_REAL:実時間を減らして、期限が切れる時SIGALRM信号を出す. ITIMER_VIRTUAL:有効時間(プロセス実行時間)を減らし、SIGVTALRM信号を生成する. ITIMER_PROF:プロセスの有効時間とシステム時間(プロセスのスケジュールにかかる時間)を短縮します.これは、システムカーネル時間とユーザ時間を計算するために使用されることが多い.SIGPROF信号を生成します.
REAL時間とは、私たち人間が自然に感じる時間であり、英語のコンピュータドキュメントにもwall-clockという用語がよく使われています.はっきり言えば、私たちが通常言っている時間です.例えば、今は午後5時10分です.では、1分間のREAL時間の後は午後5時11分です.
VIRTUAL時間はプロセス実行時間であり、Linuxはマルチユーザマルチタスクシステムであり、過去1分以内に指定されたプロセスが実際にCPU上で実行される時間は1分もないことが多い.他のプロセスはLinuxによってスケジューリングされて実行されるため、それらの時間内に自然時間が流れているが、指定されたプロセスは実際に実行されていない.VIRTUAL時間は、プロセスの実際の有効な実行時間を指定します.例えば、5時10分からの1分間において、プロセスP 1がLinuxによってスケジューリングされ、CPUの実行時間が30秒である場合、VIRTUAL時間はプロセスP 1にとって30秒である.この時点で自然時間は5時11分になったが,プロセスP 1の目から見ると,時間は30秒しか経っていない.
PROF時間は比較的ユニークで、プロセスP 1にとって5時10分から1分以内であり、自分の実行時間は30秒であるが、実際にはまだ10秒のカーネルがP 1を実行して開始したシステム呼び出しであり、この10秒もPROF時間に加わる.この時間定義は主にプロセスの性能を全面的に測定するために用いられる.なぜなら、プログラムの性能を統計するとき、10秒のシステム呼び出し時間もP 1のヘッダに計算されるべきであるからである.これがPROFという名前の由来かもしれません.
setimer Timerを使用するには、次のインタフェースAPIを理解する必要があります.
itimervalの定義は次のとおりです.
getitimer関数は、間隔タイマの時間値を得てvalueに保存します.
setitimer関数は、間隔タイマの時間値をnewvalとする.古い値をoldvalに保存します.whichは、3つのタイマのどちらを使用するかを示します.
itimerval構造のit_valueは、最初の呼び出し後にタイマがトリガーされる時間であり、この値が0に減少すると、システムはプロセスに対応する信号を送信します.その後it_internvalは周期タイミングトリガタイマです.
具体的な例を示します.
リスト9,setitmer例
このプログラムはPROF時間を使用しており、2秒ごとにPROF時間が経過すると
setitimerタイマの精度はms、すなわち1000分の1秒であり、ほとんどのアプリケーションのニーズを満たすのに十分であることを指摘する必要があります.しかし、マルチメディアなどのアプリケーションでは、より精度の高いタイミングが必要になる可能性があります.では、次のタイマ:POSIX Timerの使用を検討する必要があります.
Linuxは、プロセスごとに3つのsetitimer間隔タイマを提供します.
REAL時間とは、私たち人間が自然に感じる時間であり、英語のコンピュータドキュメントにもwall-clockという用語がよく使われています.はっきり言えば、私たちが通常言っている時間です.例えば、今は午後5時10分です.では、1分間のREAL時間の後は午後5時11分です.
VIRTUAL時間はプロセス実行時間であり、Linuxはマルチユーザマルチタスクシステムであり、過去1分以内に指定されたプロセスが実際にCPU上で実行される時間は1分もないことが多い.他のプロセスはLinuxによってスケジューリングされて実行されるため、それらの時間内に自然時間が流れているが、指定されたプロセスは実際に実行されていない.VIRTUAL時間は、プロセスの実際の有効な実行時間を指定します.例えば、5時10分からの1分間において、プロセスP 1がLinuxによってスケジューリングされ、CPUの実行時間が30秒である場合、VIRTUAL時間はプロセスP 1にとって30秒である.この時点で自然時間は5時11分になったが,プロセスP 1の目から見ると,時間は30秒しか経っていない.
PROF時間は比較的ユニークで、プロセスP 1にとって5時10分から1分以内であり、自分の実行時間は30秒であるが、実際にはまだ10秒のカーネルがP 1を実行して開始したシステム呼び出しであり、この10秒もPROF時間に加わる.この時間定義は主にプロセスの性能を全面的に測定するために用いられる.なぜなら、プログラムの性能を統計するとき、10秒のシステム呼び出し時間もP 1のヘッダに計算されるべきであるからである.これがPROFという名前の由来かもしれません.
setimer Timerを使用するには、次のインタフェースAPIを理解する必要があります.
int getitimer(int which,struct itimerval *value);
int setitimer(int which,struct itimerval *newval,
struct itimerval *oldval);
itimervalの定義は次のとおりです.
struct itimerval {
struct timeval it_interval;
struct timeval it_value;
}
getitimer関数は、間隔タイマの時間値を得てvalueに保存します.
setitimer関数は、間隔タイマの時間値をnewvalとする.古い値をoldvalに保存します.whichは、3つのタイマのどちらを使用するかを示します.
itimerval構造のit_valueは、最初の呼び出し後にタイマがトリガーされる時間であり、この値が0に減少すると、システムはプロセスに対応する信号を送信します.その後it_internvalは周期タイミングトリガタイマです.
具体的な例を示します.
リスト9,setitmer例
void print_info(int signo)
{
printf(“timer fired
”); // , timer
}
void init_sigaction(void)
{
struct sigaction act;
act.sa_handler= print_info;
act.sa_flags=0;
sigemptyset(&act.sa_mask);
sigaction(SIGPROF,&act,NULL); // SIGPROF print_info
}
void init_time()
{
struct itimerval value;
value.it_value.tv_sec=2;
value.it_value.tv_usec=0;
value.it_interval=value.it_value;
setitimer(ITIMER_PROF,&value,NULL); // timer, SIGPROF
}
int main()
{
len=strlen(prompt);
init_sigaction();
init_time();
while(1);
exit(0);
}
このプログラムはPROF時間を使用しており、2秒ごとにPROF時間が経過すると
timer fired
文字列が印刷されます.setitimerタイマの精度はms、すなわち1000分の1秒であり、ほとんどのアプリケーションのニーズを満たすのに十分であることを指摘する必要があります.しかし、マルチメディアなどのアプリケーションでは、より精度の高いタイミングが必要になる可能性があります.では、次のタイマ:POSIX Timerの使用を検討する必要があります.