コンピュータプログラム(プロセス、タスク、またはスレッド)は、一定期間非アクティブ状態になるスリープ状態になることがあります。最終的には、インターバルタイマーの期限が切れるか、信号または割り込みを受信すると、プログラムの実行が再開されます。
使用法
一般的なsleep システム コールは、時間値をパラメータとして受け取り、プロセスが実行を再開する前にスリープする最小時間を指定します。パラメータでは通常、秒数を指定しますが、一部のオペレーティング システムでは、ミリ秒やマイクロ秒などのより細かい解像度が提供されます。
ウィンドウズ
Windowsでは、このSleep()関数はスリープするミリ秒数を1つのパラメータとして受け取ります。この関数はkernel32.dllSleep()に含まれています。
[1]
このSleep()関数の分解能は現在のタイマー分解能以下であり、通常は16msですが、最小1msで、「メディアタイマー」APIファミリーを介して調整可能です。より高い精度を得るには、 gnulibで使用されるようなビジーループをtimeBeginPeriod()使用する必要があります。[2]QueryPerformanceCounter()
ユニックス
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ライブラリ関数は、多くの古いシステムでアラームシステム コールを介して実装されているため、シグナルを送信することによってのみ機能します。Windows の Sleep 関数は、シグナル (スレッドまたはそのプロセスが終了すること以外) がないため割り込むことができませんが、関連する SleepEx 関数を使用してスレッドを警告可能な状態にし、スレッドがスリープしている間に APC 呼び出しを行うことができます。また、たとえば別のスレッドの例外によりプロセスが終了した場合、スレッドは技術的に「割り込まれる」可能性があります。
用途
決して終了しない一部のシステム プログラムは、イベント ループを実行し、各サイクルの開始時にスリープ状態になり、何らかのイベントによって起動されるのを待ちます。イベントを受信すると、プログラムはイベントを処理し、次の待機サイクルの開始に戻ります。
その他のプログラムは、スリープ状態になり、一定の時間間隔後に実行を再開することで、定期的にイベントをポーリングします。実行が再開されると、プログラムはイベントまたはステータスの変更をポーリングし、スリープ中に発生したイベントを処理します。イベントを処理した後、プログラムは次の時間間隔で再びスリープ状態になります。これらの種類のプログラムでは、特定の種類のハートビートイベントまたはキープアライブシグナルを生成できます。
関数sleep()呼び出しを短時間繰り返して呼び出すことで、実行中のプログラムやコードの実行速度を遅くすることができます。このようにコードをスロットルすると、ハードウェアの過熱の影響を緩和したり、レガシープログラムのタイミングの問題を緩和したりするための大まかなメカニズムが提供されます。ソフトウェアの実行速度を制御するためにサイクルエミュレーション(エミュレータ経由)を活用するのではなく、スリープ状態と実行状態を循環させることの欠点は、起動時間が短すぎたり、スリープ時間が長すぎたり、またはその両方が組み合わさったりすると、対話型ソフトウェアが顕著なスタッターを取得することです。[8]
中断されない睡眠
割り込み不可のスリープ状態は、シグナルをすぐには処理しないスリープ状態です。待機中のリソースが使用可能になった場合、またはその待機中にタイムアウトが発生した場合にのみ起動します (スリープ時に指定されている場合)。これは主に、ディスクまたはネットワーク IO (入出力) を待機しているデバイス ドライバーによって使用されます。プロセスが割り込み不可のスリープ状態にある場合、スリープ中に蓄積されたシグナルは、プロセスがシステム コールまたはトラップから戻ったときに認識されます。
Unix系システムでは、コマンド ' ' は、プロセスの中断不可能なスリープ状態をps -l表すコード " " を使用します。 [9]このようなプロセスは、を使用しても強制終了できず、それらを取り除く唯一の単純な方法は、システムを再起動することです。[10] [11]DSIGKILL
参照
参考文献
- ^ MSDN ライブラリ リファレンス - Sleep()
- ^ 「winapi - Windows に nanosleep に相当するものはありますか?」。Stack Overflow。
- ^ – Linux マニュアル
- ^ – Linux マニュアル
- ^ – Linux マニュアル
- ^ Kuhn, Markus. 「ISO C 用の最新 API」www.cl.cam.ac.uk。
- ^ mion (2016-12-06). 「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-02-09閲覧。
- ^ 「割り込み不可能なスリープ (D) 状態のプロセス」Novell 2009-02-21 2017-02-09閲覧。
- ^ Fusco, John (2007-03-06). Linux プログラマーのツールボックス. Pearson Education. ISBN 9780132703048。
