Windows: コマンドラインで優先度を指定しプロセスを起動する方法
思ったよりも良い情報がヒットしなかったので、まとめておきます。
start
コマンドで基本優先度を指定し起動できる
cmd
の start
コマンドでは、以下のようにオプションで優先度を指定してプロセスを開始できます。
start " " /HIGH python.exe
このとき、" "
の部分は、一見無意味ですが毎回配置しておくと良いです。この " "
は以下のヘルプで ["タイトル"]
の部分に該当するのですが、[コマンド/プログラム]
がダブルクォートされているかつ ["タイトル"]
が与えられていない場合に、優先的にコマンド部分をタイトルとして解釈してしまうという、仕様なのかバグなのか分からないような挙動を cmd
はします1(どう考えてもタイトルの方が重要ではないと思うんですけどね)。
> help start
指定されたプログラムまたはコマンドを実行するためにウィンドウを開きます。
START ["タイトル"] [/D パス] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
[/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
[/NODE <NUMA ノード>] [/AFFINITY <16 進数の関係マスク>] [/WAIT] [/B]
[/MACHINE <x86|amd64|arm|arm64>][コマンド/プログラム] [パラメーター]
"タイトル" ウィンドウのタイトル バーに表示するタイトル。
パス 開始するディレクトリ。
B 新しいウィンドウを作成せずにアプリケーションを起動します。
アプリケーションは Ctrl + C を無視します。
アプリケーションで Ctrl + C を有効にしていない場合、
Ctrl + Break がアプリケーションを中断する唯一の方法です。
I 新しい環境は、現在の環境ではなく、cmd.exe に渡された元の環境に
なります。
MIN ウィンドウを最小化の状態で起動します。
MAX ウィンドウを最大表示の状態で起動します。
SEPARATE 16 ビットの Windows プログラムを別メモリ領域で起動します。
SHARED 16 ビットの Windows プログラムを共有メモリ領域で起動します。
LOW IDLE 優先度クラスでアプリケーションを起動します。
NORMAL NORMAL 優先度クラスでアプリケーションを起動します。
HIGH HIGH 優先度クラスでアプリケーションを起動します。
REALTIME REALTIME 優先度クラスでアプリケーションを起動します。
ABOVENORMAL ABOVENORMAL 優先度クラスでアプリケーションを起動します。
BELOWNORMAL BELOWNORMAL 優先度クラスでアプリケーションを起動します。
NODE 優先 NUMA
(Non-Uniform Memory Architecture) ノードを 10 進数の整数で指定します。
使い道
特定のプログラムを高優先度で起動するためのショートカット作成などに使えると思います。
start
は cmd
の組み込みコマンドなので、バイナリの直接指定や Powershell から同じように利用することはできません。ゆえに、ショートカットファイルなどでは、以下のように cmd
にコマンドを委譲する形で記述する必要があります。
C:\WINDOWS\system32\cmd.exe /C start /high " " "C:\Program Files\VideoLAN\VLC\vlc.exe"
高優先度での起動は、シングルスレッドでしか動作しない古いゲームの速度改善などに使えるかと思います2。ただ、搭載コア数が多く、CPU が回ってこない状況が発生しにくいマシンでは、あまり意味はないのかもしれません。
VLC メディアプレイヤーでは、優先度を「高」にすると、ややシークが速くなった気がします3。
REALTIME 優先度について
どの Windows からこの仕様になったのか定かではないですが (VISTA?)、プロセス優先度クラスを REALTIME_PRIORITY_CLASS
に上げるのに、管理者権限が必要です。なので、REALTIME 優先度が必要な場合、cmd
を管理者権限で実行したり、ショートカットファイルではショートカットの設定で「管理者として実行」にチェックを入れたりする必要があります。
リアルタイム優先度は非常に強力であり、慎重に扱う必要があります。リアルタイム優先度は、他のすべての操作(マウスやキーボードの入力、ディスクキャッシュなど)よりも高く、プログラムが CPU を完全に占有する可能性があります。