コンピュータプログラム(プロセス、タスク、またはスレッド)は、スリープ状態(一定時間非アクティブ状態)になることがあります。インターバルタイマーの満了、またはシグナルや割り込みの受信によって、プログラムは実行を再開します。
使用法
典型的なsleepシステムコールは、プロセスが実行を再開するまでの最小スリープ時間を指定するための時間値をパラメータとして受け取ります。パラメータは通常は秒単位で指定しますが、一部のオペレーティングシステムではミリ秒やマイクロ秒といったより細かい単位が提供されています。
ウィンドウズ
Windowsでは、このSleep()関数はスリープ時間(ミリ秒)を1つのパラメータとして受け取ります。このSleep()関数はkernel32.dllに含まれています。[ 1 ]
このSleep()関数の分解能は、現在のタイマー分解能(通常は16ms、最小1ms)を超えません。この分解能は、「メディアタイマー」APIファミリーを介して調整可能です。より高い精度が必要な場合は、 gnulibで使用されているような、のビジーループtimeBeginPeriod()を使用する必要があります。[ 2 ]QueryPerformanceCounter()
Unix
Unix系オペレーティングシステムやその他のPOSIXオペレーティングシステムでは、sleep()関数は、スリープする秒数を表す符号なし整数型の単一のパラメータを渡して呼び出されます。[ 3 ]より高精度なバージョンはnanosleep()関数であり、現在は非推奨となっていますusleep。[ 4 ] POSIXでは、拡張バージョンを介してクロックソースを選択することもできますclock_nanosleep()。[ 5 ]
のバージョンはC言語clock_nanosleep()の一部として提案されましたが、却下されました。同じ提案のUTC時間部分はC11に追加されました。[ 6 ]
Cの例
Windows APIの場合:
Sleep ( 2 * 1000 ); // 2秒間スリープするUnix または POSIX システムコールの場合:
sleep ( 2 ); // 2秒間スリープする低レベルの機能
スリープは、スレッドまたはプロセスに残りのタイムスライスを放棄させ、指定された期間、実行不可状態を維持させます。一般的には最小実行時間は保証されますが、指定された時間が経過した後、スレッドが直ちに、あるいはすぐに、あるいはそもそも実行されるという厳密な保証はありません。スリープ中のスレッドがいつ再び実行されるかは、スケジューラの裁量に委ねられ、スレッドの優先度やタイマーの精度といった実装の詳細に依存します。
POSIXシステムでは、nanosleepおよび関連システムコールはシグナルによって割り込まれ、残りのスリープ時間を返します。一方、 sleepライブラリ関数は、多くの古いシステムではalarmシステムコールを介して実装されているため、シグナルを送信することによってのみ機能します。WindowsのSleep関数は、(スレッドまたはそのプロセスが終了する以外の)シグナルが存在しないため割り込むことができません。ただし、関連関数SleepExを使用してスレッドをアラート可能な状態にすることで、スレッドがスリープしている間にAPC呼び出しを行うことができます。また、例えば別のスレッドで例外が発生してプロセスが終了した場合など、スレッドは技術的に「割り込まれる」可能性があります。
用途
決して終了しないシステムプログラムの中には、イベントループを実行するものがあります。イベントループとは、各サイクルの開始時にスリープ状態になり、何らかのイベントによって起動されるのを待つものです。イベントを受信すると、プログラムはイベントを処理し、次の待機サイクルの開始点に戻ります。
他のプログラムは、一定時間後にスリープ状態に入り、実行を再開することで、定期的にイベントをポーリングします。実行が再開されると、プログラムはイベントやステータスの変化をポーリングし、スリープ中に発生したイベントを処理します。イベントの処理後、プログラムは再び次の時間間隔でスリープ状態に入ります。これらのプログラムは、 特定の種類のハートビートイベントやキープアライブ信号を生成できます。
関数sleep()呼び出しを短時間繰り返し呼び出すことで、実行中のプログラムやコードの実行速度を低下させることができます。このようにコードをスロットリングすることで、ハードウェアの過熱の影響を軽減したり、レガシープログラムのタイミング問題を緩和したりするための大まかなメカニズムが提供されます。ソフトウェアの実行速度を制御するために、エミュレータを介したサイクルエミュレーションを活用するのではなく、スリープ状態と実行状態を循環させることの欠点は、起動時間が短すぎる場合、スリープ時間が長すぎる場合、あるいはその両方である場合、対話型ソフトウェアに顕著なスタッターが発生することです。[ 8 ]
中断されない睡眠
割り込み不可スリープ状態とは、シグナルをすぐには処理しないスリープ状態です。待機中のリソースが利用可能になった場合、または待機中にタイムアウトが発生した場合(スリープ時に指定されている場合)にのみ復帰します。この状態は主に、ディスクまたはネットワークIO(入出力)を待機するデバイスドライバによって使用されます。プロセスが割り込み不可スリープ状態にある場合、スリープ中に蓄積されたシグナルは、プロセスがシステムコールまたはトラップから戻ったときに認識されます。
Unix系システムでは、コマンド ' 'は、プロセスを中断できないスリープ状態にするためにps -lコード " " を使用します。 [ 9 ]このようなプロセスは、を使用しても強制終了できず、それらを取り除く唯一の単純な方法はシステムを再起動することです。[ 10 ] [ 11 ]DSIGKILL
参照
参考文献
- ^ MSDN ライブラリリファレンス - Sleep()
- ^ 「winapi - Windows で nanosleep に相当するものはありますか?」。Stack Overflow。
- ^ – Manned.org のLinuxマニュアル
- ^ – Manned.org のLinuxマニュアル
- ^ – Manned.org のLinuxマニュアル
- ^ Kuhn, Markus. 「ISO C向けの最新API」 . www.cl.cam.ac.uk.
- ^ mion (2016年12月6日). 「BES – Battle Encoder Shirase 1.6.3 (安定版) & 1.7.4 for Windows 7/XP/2000」 . mion.faireal.net . 2017年2月9日閲覧。
- ^マルレッタ、アンジェロ (2015-03-12)。「CPULIMIT」。GitHub 。2017 年 2 月 9 日に取得。
- ^ "top(1) - Linuxマニュアルページ" . man7.org . 2016年12月12日. 2017年2月9日閲覧。
- ^ 「割り込み不可能なスリープ(D)状態のプロセス」 Novell 、 2009年2月21日。 2017年2月9日閲覧。
- ^ Fusco, John (2007-03-06). Linuxプログラマーズ・ツールボックス. ピアソン・エデュケーション. ISBN 9780132703048。