マルチスレッドアプリケーションのUML図


25

シングルスレッドアプリケーションの場合、クラス図を使用して、そのアプリケーションのアーキテクチャの概要を取得します。ただし、このタイプのダイアグラムは、たとえば、異なるスレッドでクラスの異なるインスタンスが「ライブ」であるため、重いマルチスレッド/同時実行アプリケーションを理解しようとするときにはあまり役に立ちません(つまり、インスタンスへのアクセスは、それが住んでいるスレッド)。したがって、クラス間の関連付けは、必ずしもそれらのオブジェクトのメソッドを呼び出すことができるという意味ではありませんが、代わりにターゲットオブジェクトのスレッドで呼び出しを行う必要があります。

Hassan GomaaによるUMLを使用した並行、分散、およびリアルタイムアプリケーションの設計などのトピックについて掘り下げたほとんどの文献には 、スレッド境界をオブジェクト図に描画するなどの素晴らしいアイデアがありましたが、本当に便利です。

これらの図を問題ドメインの高レベルのビューとして使用するのではなく、クラス/オブジェクト、それらの相互作用、および前述のスレッド境界による制限の詳細な説明として使用します。

したがって、私は知りたい:

  1. マルチスレッドアプリケーションの理解に最も役立つとわかったのは、どのような種類の図ですか?
  2. マルチスレッドアプリケーションの特性を考慮したクラシックUMLの拡張機能はありますか。たとえば、
    • 一部のオブジェクトは特定のスレッドに存在し、他のオブジェクトはスレッドアフィニティを持たない場合があります。
    • オブジェクトの一部のフィールドは、任意のスレッドから読み取ることができますが、1つのスレッドからのみ書き込むことができます。
    • いくつかのメソッドは同期して結果を返しますが、他のメソッドはリクエストをキューに入れて、たとえば異なるスレッドのコールバックを介して結果を返す非同期です。

2
個人的には、アクティビティ図は(潜在的に)同時使用のケース/プロセスのモデリングに役立つことがわかりましたが、クラス/オブジェクトレベルに移動したい場合にはあまり適していません。
ペテルトレック

回答:


12

スレッドの実行がどのように行われるかについての最も重要な洞察は、シーケンス図と呼ばれるもので表現できます。ウィキペディアの例です

ここに画像の説明を入力してください

この図は、本質的にイベントのリストを、ライフラインと呼ばれることもある垂直の単一線上の方向とともに描画します。この場合、各スレッドはそれ自身のライフラインの所有者です。この図では、同期、非同期など、あらゆる種類のイベントを表現できます。

そのようなシステムで他の最も重要なことは、状態図または状態図です。通常、これは、モデルがステートマシンとして表されている場合にのみ適用されます。ただし、ほとんどのマルチスレッドシステム(スレッドが自明ではない場合)では、さまざまな状態の分離されたアルゴリズムで機能するように設計するのが最適です。

相互作用図通信図のような他の種類の図もありますが、シーケンス図状態図を描くと最大限の明瞭さが得られると思います。


6

私の答えは、UMLシーケンス図が関係するという点でDipanの補足です。100%純粋なUMLではないスタイルでも問題ないことがわかりました。Concurrency Patternsで使用されている図を見てください。一部はほとんどUMLに似ています(ただし、これは間違いなく標準ではありません)。

ここに画像の説明を入力してください

Javaスレッド同期での待機/通知に精通している場合は、私が言及したドキュメントからの次のシーケンス図を理解できます。

ここに画像の説明を入力してください


これは.NET / C#にも適用でき、Visual Studioには、マルチスレッド動作を記述する制御フローフラグメントタイプを含むUMLシーケンス図が組み込まれています。msdn.microsoft.com/en-us/library/dd465153.aspx#Anchor_1
David Burg

0

同じクラスを使用するマルチスレッドアプリケーションの場合、スレッドを表す各モデルに同じクラスをドラッグアンドドロップするのがコツです。異なるビューを持つ同じクラスを作成し、クラス、図、またはコードをクリックしてモデルとコード内をナビゲートできます。モデルのマージはよく知られた概念ではありませんが、Omondoを使用したEclipse内では非常にうまく機能します。

つまり、複数のプロジェクトで構成される大規模なアプリケーションをモデル化するときです。各プロジェクトのモデルを作成し、それらをより大きなプロジェクト内にマージします。すべてのモデリングはクラス図を使用して行われます。クラス図は、JavaコードからUMLにプロジェクト全体を反転させるときに得たモデルです。私の例では、既存のコードを使用してそれを単一のUMLモデルに反転し、UMLモデルを作成したすべてのこの逆コードを単一の大きなモデルにマージします。既存のコードを逆にするのではなく、複数のモデルを作成することもできます。これは、コードなしの作成時、または既存のコードを使用したリバースエンジニアリング段階の両方で機能します。

意味があるかどうかはわかりませんが、1つの大きなモデルを作成して、マルチプロジェクトモデリングで行っているように、スレッドごとにサブモデルを再グループ化できますか?この助けを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.