スリープ
何か仕事をさせるためにプログラムするわけですから、普通は何もしないというプログラムは必要ありません。何もしないならプログラム自体しなければよいわけですから。
しかし、不思議なことに機械語の時代から、この何もしないというプログラムが可能でした(正確には何もしないという命令)。例えば、8ビットプロセッサーのZ80にはNOP(No Operation)という命令がありました。
本当に何もしないかと言えば、実は1つだけ仕事をしていたのです。それは時間の消費です。NOP命令を実行すると一定時間だけ消費して次の命令に進んだのです(正確にはメモリから命令を読み出して何もしないで、次の命令に行くまでの時間)。
これと同様な命令がUNIXというOSにもあります。sleepというコマンドです。sleepの後に秒数を指定するとその間、時間を消費します(暇つぶしのようですね)。このような命令の存在理由のほとんどは時間の調整です。つまり、他の処理をさせるための時間稼ぎです。
- ①処理A (完了するまでに2秒掛かる)
- ②処理B (処理Aの処理結果を元に処理Bを行なう)
このような手順では処理Aの完了を待つ必要があります。処理Aの完了時間が確実に分からない場合は割り込み処理や完了通知を待つ等の判断を処理Aと処理Bの間に行ないますが、処理Aの作業がほぼ2秒、遅くても5秒は絶対に掛からないと確証が取れるなら、処理Aと処理Bの間に5秒間の待ち時間を設ければよいわけです。そこで、次のようになります。
- ①処理A (完了するまでに2秒掛かる)
- ②待ち時間(安全をとって5秒間待つ)
- ③処理B (処理Aの処理結果を元に処理Bを行なう)
待ち時間があることにより、プログラム処理の全体効率は落ちますが、とりあえず処理Bは正常に行なえます。
rpnでもバッチファイルなどを作る上で、コマンドを連続実行すると似たような状況が起こるかもしれません。そこで、カレンダー・システムパッケージではsleepプログラムを提供しています。sleepプログラムは指定された秒数だけ何もせずに待ちます。
このrpn式を実行すると単に10秒待ちます。そして、10秒が経過するとDOSプロンプトに戻ってきます。ただし、正確に10秒は刻めません。最大1秒の誤差があります。もともと精度の高い待ち時間プログラムではないので、数十秒のような長さなら気にならないのですが、1秒や2秒等の短時間での使用には注意が必要です。
- rpn 1 -c sleepは最小0秒より長く最大1秒未満(平均は0.5秒)。
- rpn 2 -c sleepは最小1秒より長く最大2秒未満(平均は1.5秒)。
sleepを最もよく使うシーンは、乱数が関係する場合でしょう。rpnは乱数の種を時間情報から得るため、1秒以内に終了するような短い処理の場合、計算結果が同じになってしまいます。
9 9
このような場合は、rpn式の間にsleepプログラムを入れます。
9 10
乱数が正常に機能していることが分かりますね。
本講座で使用したプログラムは、カレンダー・システムパッケージとして購入することができます。xypとnpdはrpnの姉妹ソフトウェアです。詳しくはプロダクトを参照ください。