BES - Battle Encoder Shirase
for Windows 2000/XP

1.0 beta5 - 10 June 2005

BES is a small tool which limits the CPU usage for a specified process: for instance, you can limit the CPU usage of a process which would use CPU 100%, down to 50% (or any percentage you like). With this, you can use other programs comfortably while doing something CPU-intensive in the background. By limiting the CPU load, you can also cool down your CPU immediately when it happens to get too hot. Of course the processing speed will slow down proportionally if you limit the CPU usage, but it should be much better than crashing because of heat or (in the worst scenario) having your computer broken with a burned CPU.

Furthermore, BES can hide any windows you don't want to be seen for some reason, without killing the process, and restore the hidden windows again anytime you like.

BES is GPL'ed free software, distributed with source code.

BES is going to be multilingual, the interface language will more or less change depending on your system locale. Although I have not yet written the manual in other languages than Japanese, you can basically use it easily as it is intuitive and the default inteface language is English.

Just in case you wonder, BES stands for "Battle Encoder Shirase," a parody of two anime titles: Battle Programmer Shirase and Battle Fairy Yukikaze.

Send your feedback to bes@faireal.net. We are looking for Chinese and Korean translators.

Download

1.0 beta5

1.0 beta4

1.0 beta3

1.0 beta2

1.0 beta1

Older files

Screenshots

BES バトルエンコーダーシラセ

プロセスごとのCPU負荷率を制限。重い作業をしながら他の作業を軽快にしたり、 CPU過熱時に緊急冷却したり、見られたくないウィンドウを不可視にできるGPLフリーソフトウェア。

概要

BES (Battle Encoder Shirase) は、 プロセスごとのCPU使用率を1%単位で制限するGPLなフリーソフトウェアです。

例えば、普通ならCPU負荷100%になる重い作業をCPUの80%だけに割り当て、 残りの20%で、重い作業をしながら他の作業を軽快に行えます。 2GHzのCPUを1.8Gと200Mの2個のCPUに分割して、前者で重い作業をやらせながら後者でウェブを見たり、 1CPUしかなくても、エンコ専用のマシンと軽作業用のマシンを持っているかのように、体感上CPUリソースを分割できます (最大4分割)。

過熱の原因となるプロセスのCPU使用率を絞れば、 CPUが過熱したとき、作業を続行しつつもCPUを緊急冷却でき、 熱暴走などのトラブルを防ぎます。 夏でもCPUが危険な温度に近づいてもエンコはやめない、でも緊急シャットダウンされたら困るからCPUの温度は下げてやる。 「バトル・エンコーダー」の名の由来です。

当然、CPU負荷を20%絞れば(5分の4)、処理時間は4分の5に伸びます。 「遅くして冷却する」という面ではクロックを絞ることに似ていますが、それをもっとソフトよりの高水準(OS側のAPI関数)で実現し、 クロックを絞らず、プロセス側を遅くします。 ゆえに、作業スピードを落とすだけでなく、CPUに空きを作って、他のことを割り込ませることが可能になります。

そのしくみは単純で、 基本的には、ターゲットのプロセスの全スレッドを把握し続け、 0.1秒周期で全スレッドのサスペンドとレジュームを繰り返すだけです。 簡単なことなのになぜかこれまで(知る範囲では)なかったコロンブスの卵のようなソフトです。 他ソフトのスレッドに介入して勝手にサスペンドしたりする点に倫理的などの抵抗があって、誰も作らなかったのかもしれませんね…。

Watchとは

プロセスがいったん終了してプロセスIDが変化しても、実行ファイルのパスから判別・追尾する新機能で、 バッチファイルを使って古典的な方法でLAMEなどのバッチエンコードをするときに使えるようにということを念頭に置いていますが、 実はあまりテストしてません。VirtualDubやAviUtlの「バッチエンコード」は主体のプログラムが起動しっぱなしで親のIDは変わらないので、 Watchでなく通常のLimitで大丈夫です。

Hideとは

選択したプロセスに属する全ウィンドウを不可視にする機能です。 バックグラウンドで時間がかかる作業をさせているとき、そのウィンドウがじゃまな場合、 あるいはセキュリティ上その他の理由でそのプログラムを実行していることを見えなくしたいときに使えます。 ウィンドウを不可視にするだけでプロセスは普通に続きます。可視に戻すには、不可視にしたプロセスを選択して、 Showコマンドを実行してください。 Showコマンドはどのウィンドウを可視にするかある程度自動判定しますが、可視にする必要のない(見えなくて本来の)ウィンドウまで可視にしてしまうことがあります。このような場合は、いったん不可視にしてから、Ask/showを実行して、1ウィンドウずつ可視化するか確認してください。 意図的にAsk/showを使うと、本来不可視状態で運用されている隠れたウィンドウを強制的に表示させることもできます。

注意事項

もうすぐ正式公開できると思いますが、今は初心者の方はご遠慮ください。 ドキュメントが準備できておらず、何のボタンだか分からないボタンがあったりするでしょうが、 正式公開前にはちゃんと説明を書きます。

本質的にハックなソフトです。 万一BESがターゲットをサスペンドしたままレジューム前のタイミングでクラッシュすると、 ターゲットが完全に停止してしまいます(万一そうなったら、BESを再起動しターゲットを再選択してUnfreezeボタンを押してください。 全スレッドのサスペンドカウントを0にリセットします)。 制限動作中のBESを強制終了するのは極力、避けてください。 また、キャプチャーなどの本質的にリアルタイムでないとダメで「負荷を減らしてのんびりやらせることが許されない」プロセスに適用しないでください。 これらの意味と危険が理解できる方のみ、ご使用ください。 Windows MEは同梱の非ユニコード版なら動作する可能性がありますが未詳。 フィードバックは掲示板にお願いします。

メニュー等、すべては日本語化してません。 原則として、日本語の文字をUTF-8で保持しています。 後から日本語英語以外の文字を入れやすくする意味もありますが、 それ以前に、開発環境の都合で、SJISが通らないためです。 日本語版のWindows上ではコンパイルできないかもしれず、ロケールを英語にしたらできるかもしれません。 VCですがクラスライブラリは使わず生のAPI32でべたべた書いてるのでノーマルなVCユーザから見ると汚いでしょうし、 今となっては自分でもちゃんとクラスを設計して清潔に書きたいのですが、 もともと1ファイルで数行で簡潔する小物だったのを少しずつ思いつきで増築したらこんなことになってしまい、 今さら書き直すとどうせバグが入るので、放置してます。

使用法

実際の画面表示はバージョンや環境によって多少異なります。

まず起動すると、右上に Target... というボタンがあるので、これをクリックするか、 Tまたはエンターキーを押して次のようなリストを出します。

このリストは、その時点でそのOS上で動いている全プロセスのうち、 BESから負荷率を制限できる可能性があるものの一覧です。 Unicodeビルドでは、このアプリ側としては、多言語の文字が混在することもできます(API側の制限あり)。

VirtualDub や AviUtl は [+] のような印がついて、一番上にリストアップされます。 これは「敵性」つまりCPU負荷が高い作業を行う要注意プロセスを示しています。 ターゲットとして一度でも「攻撃」すると、そのプロセスは自動的に「敵性」登録されます。 また、リストから選択してFoe/Unknown/Friendを押すことで、手動で「敵」「不明」「味方」登録もできます。 Unfreeze は、万一ターゲットが止まったままになってしまったとき(ターゲットを一時休止させた瞬間にBESがクラッシュしたときなど)、 そのターゲットをリストから選んでUnfreezeを押すことで、ターゲットの全スレッドのレジュームを試みます。 これも通常は必要ない機能ですが、万一のために一応実装してあります。

CPU使用率を制限したいプロセスを選んだら、右上の Limit this を押すと、 確認画面がでますので、確認してください。

CPU使用率の制限はControlボタンで行います。 最大3プロセスを独立して制限でき、3プロセスのそれぞれについて個別に制限開始・制限停止もできます。 メインウィンドウの Unlimit all は、全部の制限をいっぺんに止めます。Escキーは制限動作中には全制限解除になり、 アイドル時はプログラム自体の終了となります。

初期状態で33%のタイムスライスを横取りします。 制限率を変更すると、そのプログラム(実行ファイル名)に対する制限率として、次回以降にもその値が適用されます。 もちろん、次回以降にまた制限率を変更することもできます。

補足説明

BESは、 起動中の任意のソフトウェア(正確には「プロセス」。通常、CPU負荷率が高いプロセスに対して使用)を、 一定の周期でミリ秒単位のごく短い時間、強制的に一時休止させることで、 CPUの負荷率、CPUの温度を下げます。 負荷率が高いプロセスを「働きづめ」にさせず、設定割合で「休み休み働く」ようにするわけです。 その分、処理時間は伸びますが、原則として、処理結果そのものに影響が及ぶことはありません。

夏場の動画エンコードに活用してください。 多少エンコード時間が伸びても、システムが緊急シャットダウンしてしまったりするよりいいですから…。

本来非常用ツールですが、結構「重宝している」というフィードバックがあります。 OpenThread 関数について教えてくれた1664さんに感謝します。

もともと動画の作成のときのCPUの過熱(熱暴走・緊急シャットダウン・ハード的な故障)を予防する目的で作ったツールですが、その他のいろいろな目的に応用できます。 サスペンド/レジュームは、例えば1秒につき0.05秒だけ休む、といった感じなので、ユーザには体感できない場合も多いです。 フリーソフトウェア(GPL)です。 Windows 2000/XP で動作します。 同梱されているソース(汚い)を自分でビルドするには、OpenThread をサポートしている比較的新しいSDKが必要です。

現在、まだベータ段階です。 BESはプロセスを周期的に短時間一時停止させます。 リアルタイムで動作する必要がある録画などのプロセスに用いないでください。 また、マルチスレッドでスレッド間の同期(待ち合わせ)の処理が厳密でないアプリに用いると、 予期せぬ結果が生じる可能性があります(そのような事例は過去に一件も報告されていませんが、 理論上はあり得ます。これは、そのアプリの側の問題です)。

CPUの過熱は本来ハードウェア的な冷却(放熱)で対処すべきであること、 本ソフトは基本的には非常用の緊急手段であること、もともと無保証のフリーウェアであり、 しかもベータ的なテスト版であることをご理解の上、ご利用ください。

BESは、ターゲットとなるプロセスに含まれる全スレッドを繰り返しサスペンド/レジュームします。 プロセス内でスレッドの数が増減したり、スレッドのIDが変化しても、自動追尾します。

BESは、CPU全体の出力を絞るわけではなく、プロセスごとに、CPUからのタイムスライスの配分の割合を変えます。 CPUの総出力は変わらないので、 BESによってターゲットが強制的に休んでいる間に、CPUは他の仕事ができます。 例えば、普通ならCPU負荷100%になり、他のアプリが重くなってしまう仕事に対してBESで30%の制御をかけると、 CPU負荷は70%となり、残りの30%で他の作業を軽快に行うことができます。

BESは、アプリをターゲットとするのではなく、プロセス(インスタンス)をターゲットとします。 例えば、同じパスにあるVirtualDub.exeを二つ起動して、 一方で重いエンコードをさせながら、他方で軽い作業をする場合、 前者にのみBESで制御をかけることができます。

BESは最大3個のプロセスをターゲットとすることができ、 それぞれ1%単位で「どのくらいの割合でプロセスを休ませるか」を設定できます。 デフォルトは33%であり、処理時間が1.5倍になる代わり、負荷が2/3に減ります。 CPUの過熱が問題の場合、MBMのようなモニターツールと併用すると便利です。

BESはシステムトレイに常駐することができます。

制限事項: 非ユニコード版では、一般にASCII以外の文字を正しく表示できないが、ターゲットを数値のIDで認識するため、動作は可能。ユニコード版では、ターゲットのWindowタイトルなどにユニコード文字があっても問題ないが、ターゲットの実行ファイルのパスのユニコード文字の扱いには制約がある。どうも使用しているTool Help Libraryの関数群がユニコードに真に対応していないようで、だとすると当面アプリ側からはどうしようもない。

Changelog

mion <mion@faireal.net>

[ UP ]