Squeak:キューイングシステムのモデリング

Squeakなどのプログラミング言語に関するHabréの情報はほとんどありません。 私は、 キューイングシステムのモデリングのコンテキストで彼について話そうとします 。 単純なクラスの作成方法を示し、その構造を伝え、複数のチャネルを通じてアプリケーションを提供するプログラムで使用します。



Squeakについて一言



Squeakは、動的な型指定とガベージコレクションを備えたSmalltalk-80プログラミング言語のオープンなクロスプラットフォーム実装です。 インターフェイスは非常に特殊ですが、デバッグと分析には非常に便利です。 Squeakは、OOPの概念に完全に対応しています。 if-then-elseを含め、すべてがオブジェクトで構成されますが、それらを使用してコンストラクトが実装されます。 構文全体は、次の形式でオブジェクトにメッセージを送信することになります。

<オブジェクト> <メッセージ>
どのメソッドも常にオブジェクトを返し、新しいメッセージを送信できます。

Squeakはプロセスのモデリングによく使用されますが、マルチメディアアプリケーションやさまざまな教育プラットフォームを作成するためのツールとしても使用できます。



キューイングシステム



キューシステム(QS)には、複数のソースからのアプリケーションを処理する1つ以上のチャネルが含まれています。 各アプリケーションにサービスを提供する時間は、固定または任意、および受信の間隔を設定できます。 電話交換、ランドリー、店のレジ、タイプライターデスクなどです。次のようになります。









QSには、一般的なキューに入るいくつかのソースが含まれており、処理チャネルが解放されるとサービスに送信されます。 実際のシステムの特定の機能に応じて、モデルには異なる数の要求ソースおよびサービスチャネルが含まれ、キューの長さおよび関連するアプリケーションの損失(障害)の可能性に対する制限が異なる場合があります。



QSをモデリングする場合、通常、平均および最大キュー長の推定、サービス拒否の頻度、チャネルの平均負荷、およびその数の決定の問題は解決されます。 タスクに応じて、プログラムブロックには、プロセスの動作に関する必要な統計データの収集、蓄積、処理が含まれます。 QSの分析で最も頻繁に使用されるイベントフローのモデルは、レギュラーモデルとポアソンモデルです。 レギュラーは、イベントの発生とポアソンの間の同じ時間によって特徴付けられます-ランダム。



ちょっとした数学



ポアソンストリームの場合、ポイントtに隣接する長さτ (tau)の間隔に収まるイベントXの数は、ポアソンの法則に従って分布します。









ここで、a (t、τ)は、時間間隔τで発生するイベントの平均数です。

単位時間あたりに発生するイベントの平均数はλ(t)に等しくなります。 したがって、時間tに隣接する時間間隔τのイベントの平均数は次のようになります。









λ(t)= const =λでの2つのイベント間の時間Tは、法則に従って分散されます。









確率変数Tの分布密度の形式は次のとおりです。









時間間隔t iの擬似ランダムポアソンシーケンスを取得するには、方程式を解きます。









ここで、 r iは区間[0、1]に均一に分布する乱数です。

私たちの場合、これは式を与えます:









乱数を生成することにより、ボリューム全体を書き込むことができます。 ここで、区間[0、1]に均等に分布する整数を生成するには、次のアルゴリズムを使用します。









ここで、 R iは別のランダムな整数です。

Pは、いくつかの大きな素数です(たとえば、2311)。

Qは整数です-間隔の上限。たとえば、2 21 = 2097152。

rem-整数除算の剰余を取得する操作。



R 0の初期値通常、たとえばタイマーを使用して、任意に設定されます。

Time totalSeconds
      
      





間隔[0、1]に均等に分散された数値を取得するには、言語演算子を使用します。

r:=(R / Q)asFloat


ランドクラス



間隔[0、1]に均等に分布する乱数を取得するには、クラス(実数のジェネレーター)を作成します。



 Float variableWordSubclass: #Rand " " instanceVariableNames: '' " " classVariableNames: 'R' " " poolDictionaries: '' " " category: 'Sample' " "
      
      





方法



 "" init R := Time totalSeconds.next "  " next R := (R * 2311 + 1) rem: 2097152. ^(R/2097152) asFloat
      
      





センサーの初期状態を設定するには、メッセージRand initを送信します。

別の乱数を取得するには、 Rand nextを送信します。



アプリケーション処理プログラム



そのため、簡単な例として、次のことを行います。 アプリケーション間のランダムな時間間隔で、1つのソースからのアプリケーションの定期的なフローのメンテナンスをモデル化する必要があります。 パフォーマンスの異なる2つのチャネルがあり、それぞれ2時間単位と7時間単位でアプリケーションを提供できます。 100時間単位の間隔で各チャネルがサービスするアプリケーションの数を登録する必要があります。



きしみコード
  "  " | proc1 proc2 t1 t2 s1 s2 sysPriority queue continue r | "  " Rand init. SysTime := 0. s1 := 0. s2 := 0. t1 := -1. t2 := -1. continue := true. sysPriority := Processor activeProcess priority. " " queue := Semaphore new. "  " "  -   1" (Process forContext: [ proc1 := Processor activeProcess. [continue] whileTrue: " " [ queue wait. " " t1 := SysTime + 2. "  " s1 := s1 + 1. proc1 suspend. "     " ]. proc1 := nil. "    1" ] priority: (sysPriority + 1)) resume. "   " "  -   2" (Process forContext: [ proc2 := Processor activeProcess.. [continue] whileTrue: [ queue wait. t2 := SysTime + 7. s2 := s2 + 1. proc2 suspend. ]. proc2 := nil. ] priority: (sysPriority + 1)) resume. "      " [SysTime < 100] whileTrue: [ r := (Rand next * 10) rounded. (r = 0) ifTrue: [r := 1]. ((SysTime rem: r) = 0) ifTrue: [queue signal]. " " "  " (t1 = SysTime) ifTrue: [proc1 resume]. (t2 = SysTime) ifTrue: [proc2 resume]. SysTime := SysTime + 1. "  " ]. "   " PopUpMenu inform: 'proc1: ',(s1 printString),', proc2: ',(s2 printString). continue := false.
      
      







開始時に、プロセス1が31のアプリケーションを処理し、プロセス2が11のみを処理したことがわかります。










All Articles