Archive for June 17th, 2009

JobObject の壁

複数のプロセスをまとめて管理する仕組みとしてJobObjectというものがある。

http://msdn.microsoft.com/en-us/library/ms684161(VS.85).aspx

POSIX準拠の仕組みらしく、古くはapacheのようなヤツがいくつかのプロセスを立ち上げて堅牢性を向上させていたり、最近はGoogle Chromeなどでも使われている。

SetInformationJobObject のリファレンスを見ると、

http://msdn.microsoft.com/en-us/library/ms686216(VS.85).aspx

JobObjectに対して様々な制約をかけることができることが分かる。

例えば、総プロセッサ時間、総メモリ消費量のようなものだ。

その他に、JOB_OBJECT_UILIMIT_DISPLAYSETTINGS, JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS のようなものもあり、ジョブ配下のプロセスがシステム全体に影響を及ぼすことがないようにする仕組みと考えられる。

VISTAではすべてのプロセスは Explorer のジョブグループに属してしまうようだ。(しかもProcessExplorerでも見えない?)

CREATE_BREAKAWAY_FROM_JOB を使って新規プロセスを作ると、そこでは AssignProcessToJobObject が成功する。

UACのせいだとかいろんなことを言っている人がいるが、たぶん間違い。

http://social.msdn.microsoft.com/Forums/en-US/windowssecurity/thread/71c9599e-a3d5-4b79-bfc1-1800565c5b8a

だって REATE_BREAKAWAY_FROM_JOB だけで出来たもん。

で、どこにも書いてないけどほかにも様々な壁があるっぽい。

  • SHAppBarMessage が利かない。ウィンドウハンドルが別扱いになるからかな?
  • CHtmlView を利用したブラウザが、PowerPoint等を開くとき、powerpnt.exe はDCOM経由で立ち上がるためにJobObjectに加わらない。で、たぶんそのウィンドウがブラウザから制御できないため、MFC内でクラッシュする。致命的。
  • RegisterWindowMessage が別になる
  • Jobの外でコピーしたデータをジョブの中へペースト出来ない。逆はできるっぽい。