この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 2494|答える: 1

[ヒント] 共有記憶について2、3つのポイントがあります

[リンクをコピー]
掲載地 2024/07/23 14:50:48 | | | |
プロセス間通信に共有メモリが使われる古いシステムの移設に参加すること(例:ウィンドウサービス ASP.NET 呼び出す)が、この技術の重要性を理解しざるを得ません。 NET開発者のあまり人気のない技術、特別な注記。

【共有記憶とは何か?】 】
クロスプロセス通信にはInterprocess Communictaion(IPC)という用語があり、Windowsプラットフォーム上で以下のオプションがあります:参考文献:ハイパーリンクのログインが見えます。

クリップボード
プログラムAはコンテンツをクリップボードに貼り付け、プログラムBはクリップボードからコンテンツを取り出します。
COM
OLE Compound DocumentはWordファイルをExcelのワークシートに埋め込むことができ、Excelは2クリックで編集可能です。
データコピー
プログラムAは合意された形式でプログラムBにWM_COPYDATAメッセージを送信します
DDE
DDEは、異なるアプリケーション間で異なるフォーマットでデータを交換できるようにする通信プロトコルであり、これはクリップボードの拡張とみなせ、一度の転送に加えて連続的に転送することができます。 (比較的パフォーマンスが悪く、現在は推奨されません)
ファイルマッピング
ファイルマッピングとは、複数のアプリケーションが共有ファイルマッピングを通じてデータを交換するプロセス内のメモリの一部としてファイルをシミュレートすることを指します。これは名前付き共有メモリ(Named Shared Memory)と呼ばれる共有ファイルマッピングを通じて行われます。これは様々なIPC手法の中で最も高性能ですが、Mutexのような同期機構によって防止されなければなりません。
郵便スロット
一方通行通信では、MailslotクライアントがメッセージをMailslotサーバーに送信し、サーバーがメッセージを読み取ると削除されるため、クロスマシン送信をサポートし、1対多でブロードキャストすることも可能です。 (ブロードキャストメッセージの長さは400バイトに制限されており、メッセージの長さは1対1の送信が確立された際にMailslotサーバーによって決定されます)
パイプ
双方向伝送は匿名パイプと名前付きパイプに分けられます。 匿名パイプは一般的に親プログラムと子プログラム間の標準的な入出力の方向性に使われ、双方向通信のために2つのパイプを構築すべきで、これはネットワークを越えて行うことができず、依存関係を持つプロセスに限定されます。 ネームドパイプは任意のプロセス間でデータ交換やクロスネットワークのプロセス転送に使用できます。
RPC
リモートプロシージャコール(RPC)は、アプリケーションが他のアプリケーションが提供する機能を呼び出すことを可能にするもので、ネットワーク間で呼び出すことができます。 Windows RPCはISO DCE標準に準拠し、クロスオペレーティングシステムの統合をサポートしています。
Windowsソケット
TCP/IPやその他のネットワークプロトコルに基づく抽象的な通信インターフェースであり、データ交換は最下層のネットワーク接続を通じて行われます。
共有メモリはC/C++開発者がよく使うデータ交換方式であり(Linux上で共有メモリで実装されたIPCの例をGoogleで多く見つけられます)、そのためC/C++開発者はWindowsプラットフォームの通信チャネルとしてよく選びます。

【共有記憶実習】
使う人は少ないですが、.NETにはSystem.IO.MemoryMappedFilesという組み込みの名前空間があり、ファイル操作とほぼ同じように共有メモリを操作するのは難しくありません。FileStream関連の操作経験があればすぐに始められます。MSDNの例を参照してください。私はミニプログラムの演習を書きました。ハイパーリンクのログインが見えます。

私は2つのプログラムを書きました。ProcessAはMemoryMappedFile.CreateNew()で1024バイトの空間を作成し、もう一方のProcessBでパスやキャッチの練習をしました。 1024バイトは2つのプログラムで共有されるため、最初の512バイトはProcessAがProcessBに書き、最後の512はProcessBがProcessAに書き込み、プログラムはCreateViewStreamを使って開始アドレスと長さを自分の領域に渡す予定です。 ProcessAとProcessBがMemoryMappedFileにアクセスする際の読み書き競合を避けるため、Mutexロックを使って一度に1つのプロセスだけがMemoryMappedFileにアクセスできるように制御しています。 テストプロセスはProcessAのためにMemoryMappedFileを作成し、メッセージ文字列を書き込みます。>ProcessBがメッセージ文字列を読み取り、応答文字列を書き込みます。>ProcessAは応答文字列を読み取り、終了します。

ProcessAの手順は以下の通りです:

ProcessBの手順は以下の通りです:

試験は成功しました!



【補足のヒント】

1. Windowsで現在有効になっているMemoryMappedFileはどうやって表示すればいいですか?

SystemInternalsにはAccessChkツールがあり、Windowsでアクセス可能なすべてのファイル、フォルダ、レジストリ、オブジェクト、Windowsサービスを一覧にしています。 MemoryMappedFileはWindowsのオブジェクトであり、以下のコマンドを使ってすべてのオブジェクトを一覧化し、アーカイブできます
accesschk -osv > e:\objList.txt
そこにMemoryMappedFileの名前を探してみてください。もし存在すれば、次のようなレコードが見られます:
\Sessions\1\BaseNamedObjects\DARKTHREAD
  タイプ:セクション
  中程度の必須レベル(デフォルト)【書面なし】
  RW NT AUTHORITY\SYSTEM
    SECTION_ALL_ACCESS
  RW DOMAIN\UserName
    SECTION_ALL_ACCESS
  RW DOMAIN\UserName-S-1-5-5-0-954410
    SECTION_ALL_ACCESS

AccessChk ツールのダウンロード:ハイパーリンクのログインが見えます。

2. MemoryMappedFileプリセットはユーザーのセッションで有効化されており、セッション間で使用することはできません。 例えば、異なるAppPoolに属する2つの ASP.NET が異なる実行識別子を持つ場合、MemoryMappedFileの名前が同じでもそれぞれのコピーは1つずつなので、両者が使用する実行識別子が同一であることを確認する必要があります。

3. 異なる実行識別子間で通信するために、MemoryMappedFileは「Global\ Filename」と名付けることができます(Globalの場合は違います。誤ってGLOBALパスと書かれた雷鳴を踏みました)。これにより、実行識別子間でアクセス可能です。
ただし、セッション0(Windowsサービス)以外のプロセスは、Global\...を作成するためにSeCreateGlobalPrivilege権限を持つ必要があることに注意してください。 MemoryMappedFile。 (MSDNファイル)
セッション0については、MVPの記事「セッション0の挿入 孤立(1)」を参照してください(ハイパーリンクのログインが見えます。その中には非常に詳細な導入があります。

転載元:ハイパーリンクのログインが見えます。





先の:Angular 18画像の静的リソース読み込み問題
次に:Bootstrap 5のファイル構成の概要を簡単にご確認ください
 地主| 掲載地 2024/08/10 21:36:57 |
.NET/C#はMutexとMemoryMappedFileに基づくプログラムのシングルトンを実装しています
https://www.itsvse.com/thread-10808-1-1.html
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com