2015年9月26日土曜日

タスクスケジューラから起動されたプロセスの優先度

恥の記録と、ついでと言っては何ですが、表題の件を変更する方法をご紹介します。

前置きです。

タスクスケジューラから起動されたプロセスの優先度は通常以下のCPU優先度が割り当てられます。
つまり、他に忙しく仕事をしているプロセスがいると、実行権が回ってきづらくなります。

さらに、Windows Vistaからは低優先度IOという機能が導入されましたが、タスクスケジューラから起動されたプロセスは、IO優先度も低くされます。
これまた他のプロセスが盛大に読み書きを行っているとお鉢が回ってこなくなります。

デフォルト設定としてはそれでいいですし不満はありませんが、いまさらこんなことを書くのはWindows10に移行した折、うっかりこのことを失念していたため、恥の記録として残します。

私の場合、ログオン時に段階的に起動していきたいプロセスのためのバッチファイルをタスクスケジューラでトリガを「ユーザのログオン時」として起動しています。

例えば、単純にSpinelとTvRockをスタートアップ起動に登録していた場合、両者が同時に起動しようとして、さらにTvRockから起動されるRecTestがSpinelの完了まで延々再起動されて邪魔臭いので(録画中に再起動するなって言われそうですが・・・番組情報取得中とか長い番組とかでたまーにやってしまいます)、Spinelの起動を待ってTvRockを起動する、とか、スタートアップに登録しておくと一斉に起動されて操作の邪魔だからちょっと時間をおいて起動する、とかが目的です。

Vistaのころは、それに加えて実行に管理者権限を要求するプロセスをスタートアップに登録しておいても起動させてくれなくなったため、それを回避するという目的もありましたが、現在では常駐していてほしいけど管理者権限を要求する、というようなプロセスはあまり見かけなくなりました。
たしかNECのSmartVisionかIOデータのmAgicTVだったような・・・なんだか録画がらみばかりですねえ。

で、だから何だというと、重い処理をしている間に録画を開始する時刻になってRecTestが起動されても、Spinelになかなか実行権が回らないのでプロセス間通信がうまくいかず、挙句にRecTestが起動をあきらめてしまう場合があります。

そういう時に限って全画面で作業やゲームをしていたり、無人でバックアップやタモリ倶楽部のエンコードを行っていたりするので起動をあきらめたことに気づかなかったりします。

そこでそのような事故を減らすべく優先度を通常にしていたのですが、Windows10に移行したとき、そのバッチファイルを手動でタスクスケジューラに登録した時に、優先度の変更をすっかり忘れていました。

さて、優先度の変更方法ですが、残念ながら設定画面からでは変更も確認もできません。
そのため、
  1. GUIから優先度を変更したいタスクをエクスポートします。
    →UTF16で記述されたXMLファイルとして保存されます。
  2. エクスポートされたXMLファイル中のPriorityの値が優先度を示しますので、その値を変更して保存します。
  3. 名前の重複でエラーとなるため、エクスポート元となったタスクを削除します。
  4. 変更を加えたXMLファイルをインポートします。

Priorityの値が示す意味は以下のようになります。
CPU優先度IO優先度
6通常通常
7通常以下
9最低
通常の手段で作成されたタスクは、Priorityに7が指定されています。
なお、6未満の数を指定しても、実際には通常以上のCPU優先度にはなりません。また、IO優先度はそもそも「通常」が最高の優先度となります。なんせ機能名が低優先度IO(Low Priority IO)っていうくらいですからねえ(正確には、メモリマネージャには「重大」という特権的優先度がありますが、カーネル内部の話です)。
また、CPU優先度とIO優先度を個別にも指定できません。

以上、恥の記録と、おまけでした。

1 件のコメント: