2)静的vsプロセス:「静的データ」が正確に何を意味するかによって異なります。
DLLの場合、「静的データ」は、モジュール内のどこかに配置され、読み取り専用フラグで保護されたバイトのセットです。DLLをロードする人は誰でも、同じバイトを見ることができます。これは、それらがDLL自体の一部であるためです。もちろん、そのデータはほとんど不変であり、コンパイル/ビルド時に決定されます。これは、たとえば、「リソース」が保持され、アセンブリで使用できる方法です。
C#コードの場合、「静的」データ(フィールド、プロパティ、イベント)は、名前空間とクラスの形式でいくつかの便利な名前でカプセル化された単なるグローバル変数です。それらは完全にグローバルではありません。.NetにはJREのクラスローダーと同様のAppDomainの概念があり、同じプロセスで別々の.Netアプリケーションを実行できます。これらのアプリケーションは、正確に実行されている場合でも、相互にメモリを上書きしません。同じ静的フィールドを持つ同じコード。さらに、静的フィールドを[ThreadLocal]属性でマークして、フィールドを「グローバルにグローバル」ではなく「スレッドごとにグローバル」にすることができます。アプリ内のすべてのスレッドには、独自の「静的」バージョンがあります。田畑。などなど
プロセスについて言えば、頭の中にあると思われる形で「DLLを介して共有および通信する」方法はありません。DLLの共有とは、共通のコードを共有することです。データメモリは「プロセス」の定義によって分離されており、データはもちろんプロセスのメモリに存在します。
システムの下位レベルで言えば、実際には仮想メモリサブシステムのレベルでいくつかの共有があります。コードモジュールが共有されている場合、システムは同じ99個のプロセスが同じDLLファイルを使用していることに気付き、それを1回だけロードすることを決定し、そのファイルの単一ページを複数のプロセスのメモリの同様のページにマップする場合があります。。このように、それは一度ロードされ、複数回使用され、真の共有が発生します。ただし、動的に割り当てられたメモリではなく、コードがロードされて共有されることに注意してください。下位レベルの言語は、その種の共有を「悪用」することができ、実際にコードの読み取り専用保護を解除してコードメモリに書き込むことができたため、同じページを共有するすべてのプロセスにデータが自動的に伝播されましたが、これは現在悪と見なされています:)
メモリマッピングはさておき、それはすべて、DLLを持っていることはコミュニケーションにあまり役立たないことを意味します。
1)スレッドの場合-可能であり、プロセスの場合-方法を知っているように聞こえますが、できません。限目。上記を参照。
さて、あなたの問題を解決するために:それの核心はあなたがプロセス間で通信したいということです。このトピックは、略して「IPC」または「プロセス間通信」と呼ばれます。それを扱う古典的な方法は、初心者のために、次のとおりです。
- 共有メモリ(同じメモリページをいくつかのプロセスにマッピングします。C#では醜いです)
- ファイル(9つのプロセスが同じファイルに対して適切な方法で読み取り/書き込みを試みます)
- ネットワーク/ソケット(tcp、udp ..説明は必要ないと思います)
- パイプ(2つの側面を持つ特別なファイル:1つはデータの書き込み、もう1つはデータの読み取り、一方は1つのプロセスで使用され、もう一方は2番目のプロセスで使用され、一方向のソケット接続と同じように「チャネル」があります)
- 共通データベース(プロセスは同じテーブルに書き込み、同じテーブルから読み取る=相互に通信できます)
- (Web)サービス(ネットワーク/ソケット/パイプ-きれいなWSDLインターフェースとプロキシクラスでカプセル化されています)
等々。それを使用する方法についてほとんど考えていない場合-それは非常に簡単です:たとえば、パイプまたはネットワーク/ソケット接続によって、他の人からすべてのデータを収集する1つの特別なプロセスを準備し、その後、プロセスは単純に典型的な方法。これは、「ブローカー」または「サービス」プロセスです。データを収集して均一に並べ替える必要があるため、このようなプロセスを回避するのはかなり困難です。順序を調整する必要があり、実行するには(ほとんどの)データが手元にある必要があります。それを念頭に置いておくと、サービスプロセスを個別にする必要がないことに気付くかもしれません。(データを生成する)「作業中」のプロセスの1つが、並べ替えジョブも処理する場合があります。必要なのは、データシンクが1つになるように、なんらかの方法でオーケストレーションすることです。そして、誰もがシンクが誰であるかを知っているでしょう。ここで話をやめます。
どういうわけか、シンクが1つしかないのはなぜか、ソートするすべてのデータについてプロセスが完全な知識を持っている必要があるのはなぜか疑問に思い始めた場合、実際には必要ありません。マルチコア/マルチプロセスマシン(または分散プラットフォーム)で使用されるスマートな並べ替えアルゴリズムはかなりあります。これらのアルゴリズムは、部分的に並べ替えを実行し、すべてを接着して、ほぼ瞬時に全体として並べ替えることができます。それらは単純な「一般的なグローバルデータシンクサービス」よりも理解するのが少し難しいですが、一度理解すると、ファイルベースのストレージにそのようなアルゴリズムを書くことは、ソケットやパイプを介してIPCを書くよりも速く/簡単になるかもしれません。
ただし、C#ライブラリを活用することで、Webサービス、.Net Remoting、または共通データベース(sql express?mysql?)を介してIPCを実行することは良いスタートになると思います。多くのプロセスの調整に慣れたら、パイプ、ソケット、memmap、その他のものを後で使用できるようにしておきます。
具体的なコミュニケーションの仕組みを一つ選んで聞いてみると、見つけやすく、説明しやすくなります。