kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

マネージドコードでの共有メモリ

前振り

Windowsにはsvchost.exeというプロセスがいっぱい起動しています。これ、DLLになっているサービスを起動する親プロセス…なのですが、タスクマネージャで見ただけではどのプロセスがどのサービスを起動しているのかさっぱりわかりません。
参考:Windows 2000 の Svchost.exe の詳細
Windows XP Professional Edition の Svchost.exe の詳細
svchost.exeの他にもいわゆるアプリケーションサーバものはそうですね。単一のexeが親になって、呼ばれる側はdllとして提供すると。しかし、このような場合、どのpidでどのdllがロードされているのかわかりづらいです。sysinternals.comのlistdll.exeなどを使えばわかりますが。

本題

私が今作っているプログラムも同様で、一つのhoge.exeが同時に複数個起動する可能性があります。そうなると、タスクマネージャではどの処理を行っているのかわからない。そこで、svchost.exeのように、別コマンド経由で各hoge.exeの内部情報をダンプしよう…とおもいつきました。

実装検討

  1. ファイルに書く
  2. スレッドを作って、待機。指定されたイベントがくればpipeなどで情報を送信する
  3. プロセス毎に規則に則って共有メモリを作り、共有メモリの情報を参照する。

ファイルに書くというのはゴミが残りそうだから脱落。スレッドもこの程度のために作るのはちょっと大げさ…ということで、共有メモリを選択してみました。

いざ始めてみると

.NET Frameworkには共有メモリのクラスない?VSUGでもちょうどC#で共有メモリを使いたい - 初心者なんでも相談室 - Visual Studio User Groupという質問が出ていたけれど。
クラス作ろうとすると割と大変そうだし、仕方ないから別の要件で用意していた、ネイティブコードのDLLに共有メモリを扱うコードを追加。うーん、共有メモリって推奨されないのか…まぁ、なんとなくわからないでもないけれど。
こういう風にfoo.exeが書くだけ、bar.exeは参照するだけ。データは大きくても数KB、通信速度は重要視しない…という情報のやりとりする場合、もっともいいのはどんな方法なんだろう。