CPU使用率を制限するには


カヲル君(は君づけ)  2004-06-22 17:58:35  No: 9564

皆さんおはようございます。ウォレスです。

興味本位的な話、のようですが実際に、何分もかかるような非常に重たい数値演算処理を行っています。

その間、フォームの描画さえ覚束ないようになります。

Win2K以上に限っても良いので、何かスマートな手法がありましたら、ご教授願います。

※スレッドにすれば解決?でしょうか?
(恥ずかしながらスレッドは使った事がありません。ォィォィ)

シンクロもとい使用率を下限70、上限90%の間に制限できるようにできないのか?
っていうのが主題ではあります。


jok  2004-06-22 18:38:26  No: 9565

> 何分もかかるような非常に重たい数値演算処理を行っています。

分単位なら大して大きな計算というほどでもないと思います。

> その間、フォームの描画さえ覚束ないようになります。

それはそうでしょう。ひとつのスレッドでは実行は一つだけです。
GUI 部分はイベントドリブンでメッセージに応答して動作しています。
ひたすら数値計算していれば、応答できないのは当然です。

> ※スレッドにすれば解決?でしょうか?

そうですね。数値計算のようなGUIを制御しない動作こそ、別スレッドで
実行すべきです。普通はコンソールアプリにするとスレッドを意識することなく
普通のシングルスレッドでも十分です。

> 使用率を下限70、上限90%の間に制限できるようにできないのか?

CPU使用率はOSが決めることなので難しいです。プログラマは、スレッドごとに
優先度を設定できるくらいですか。それも、他のアプリが忙しいか暇かにより
ますので、CPU使用率を数値で制御することはできません。分単位なら、さらっと
計算してしまえばいいのではないでしょうか。


ウォレス  2004-06-22 19:22:08  No: 9566

早速の回答、有難うございます。
仰る事の半分くらいは分かった、と思います。

>普通はコンソールアプリにするとスレッドを意識することなく
>普通のシングルスレッドでも十分です

ここの処が分かりません。
コンソールアプリ、とは昔でいうDOSアプリのことですよね?
(実際は640Kの壁など今はないのでしょうが)
演算タスクをGUIを持たない単体EXEにしておいて、ShellExecuteか何かで起動する。という事でしょうか?


jok  2004-06-22 20:29:26  No: 9567

> コンソールアプリ、とは昔でいうDOSアプリのことですよね?

違います。れっきとした Win32 アプリです。見かけが似ているだけで、
コマンドプロンプトとコンソールアプリは別のものです。Delphi で
新規作成から作られるコンソールアプリは32ビットアプリです。
TMemoryStream などのクラスも使えますから、計算結果をファイルの
保存したり、また、コンソールに表示することもできます。

コンソールアプリで Hello,World を作ったことがないのが驚きです。


ウォレス  2004-06-23 01:24:48  No: 9568

>コンソールアプリで Hello,World を作ったことがないのが驚きです。
・・ありません(ォィォィ)
Formを置いてボタン張って、イベントに記述する、っていう程度しかないのです。

はるかむか〜しにTurboC++でそういうのを作った事はあるかも。

いつもWEBのサンプルコードでcoutがあると四苦八苦してmemoに置き換えたりしています(^^;


sadoyama  URL  2004-06-23 18:29:20  No: 9569

偶然というか、この10日間、CPU使用率のテストを繰り返しています。
  私の環境はWindows2000pro SP4, CPU 1GHz, メモリ256MBです。
  CPU使用率 100%を1時間も続けるとOSがシャットダウンし、再起動もできなくなりますが、タイミングによっては10数分でもそうなることがあり、初めて怖さを知りました。
  Sleep(1);をループ内にかませると使用率0から1%になり、使用率100%は解決しますが、気が遠くなるほど処理が遅くなり使い物になりません。
  短い処理であれば、そうでもないのですが、そういう場合はSleep(1);を入れる必要もまずありません。

>使用率を下限70、上限90%の間に制限できるようにできないのか?
  使用する機種が限定されていて、複数使用する場合CPUの性能が似通っていれば、Sleep(1);の実行回数を調整することで可能なことが解りました。
  下記例の場合、私の環境では常時50%を維持できました。
  この状態で他のアプリを並行使用すると何が起こるかはまだ調べていませんが。

-- 例 --
var
  i, j: Cardinal;
begin
  j := 0;
  for i := 0 to $FFFFFFFF do
  begin
    Inc(j);
    Application.ProcessMessages;

    if i mod $1FFFF = 0 then  Sleep(1);  // ここ!!
  end;
end;  

  OSをクラッシュさせるようでは、他人のPCで実験させてもらうわけにはいかなかったのですが、このコードで幾つかこれから試させてもらおうと思っています。


jok  2004-06-23 18:47:04  No: 9570

> CPU使用率 100%を1時間も続けるとOSがシャットダウンし、再起動もできなく
> なりますが、タイミングによっては10数分でもそうなることがあり、初めて怖
> さを知りました。

CPU使用率100% だとソフトウェアに影響がでるんでしょうか? ちょっと信じら
れません。CPU の熱暴走とかのハード的な理由じゃないでしょうか。

> 下記例の場合、私の環境では常時50%を維持できました。

これを二つ起動しても100%にならないでしょう? 長時間の数値計算の場合は
多重のループを含んでいる場合が多いですよね。たまに Sleep() を挟むのは
有効かもしれませんね。計算量は一定ですから、その分、必ず遅くなりますけど。


sadoyama  URL  2004-06-23 19:35:01  No: 9571

>CPU使用率100% だとソフトウェアに影響がでるんでしょうか? ちょっと信じられません。
>CPU の熱暴走とかのハード的な理由じゃないでしょうか。
事実を報告しますと、Windowsより、強制終了する旨のメッセージが表示されました。
「エラー」というメッセージはなかったように記憶しています。
理由の付記もなかったと思います。
何せ、いつ起こるか解らないので、気づいたときは終了してしまっています。
このメッセージを見れたこと自体奇跡的だと思っています。
感触として、統括能力を失ったWindowsが頭にきて勝手に閉店させてしまう。
更に、自分自身も自殺してしまう-ということのようです。
再起動できなくなる理由は、システムのルート上の次のファイルの1つ以上が破壊されたためで、事前にブートディスクをフロッピーに作っておいて、これでWindowsを再起動して、フロッピーディスクより上書きコピーすれば直ります。(Windows2000)
これが発見できるまでは、いちいち再インストールして大変でした。
・bootfont.bin
・NTDETECT.COM
・ntldr

>これを二つ起動しても100%にならないでしょう? 
この発想気づきませんでした。面白いですね。
果汁50%を2本飲んだら100%になるのだろうか。早速試してみました。
75%と出ました。
何か法則性があるような値なので、もう一つ起動すると87.5%かと悪乗り。
3つで83%、4つで86% でした。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加