これは、言語固有のものよりも、おそらくコンピューター サイエンスに関連した長いものになるでしょう (ただし、Java を使用する必要があります)。あなたは警告されました。
基本的なコンピューター ハードウェアをシミュレートするために、並列ワイヤ上の電気信号の伝播をモデル化しようとしています。各パスにはさまざまな要素があり、元の信号の遅延、拡大、およびその他の変換が発生します。
これが私が作ったばかりの画像です:
ありがたいことに、複雑な信号を表現しようとしているわけではなく、0 と 1 だけです。この例では、4 つの入力があります。ユーザーがそれらを 1011 に選択したとします。次に、これらの入力をワイヤを介してゲートに転送する必要があります。ゲートは適切な出力を生成し、信号を伝播し続けます。
問題はタイミングです。すべてのワイヤーとすべてのゲートに時間遅延を割り当てます。たとえば、一番左上のワイヤの時間遅延が 0.5 の場合、最初のゲートが入力を受け取るのに 0.5 単位の時間がかかります。すべてのゲートをマルチ入力として描いたので、次のことが起こる可能性があります (AND ゲートを考えてください): input1 は 1.1 単位の時間で到着し、ハイです。出力はまだゼロです。しかし、input2 (これも高い) がそこに到達するまでに 1.3 単位の遅延があったため、0.2 単位後に出力が再計算されて高くなります。実際、各ゲート自体には遅延があるため、AND ゲートの計算には 0.5 単位かかるとします。最終的な高出力が高になるには (1.3 + 0.5) = 1.8 単位かかります。
私が持っている現在のプログラミング モデルは次のとおりです。ワイヤとゲートは、互いに接続して信号を送信できるオブジェクトです。たとえば、wireA_input は実際の入力に接続され、wireA_output はゲートに接続されます。したがって、入力信号が入ってきて (以前の値から変化)、そのアクションは send_signal(wireA, input) を呼び出す必要があります。この関数は、wireA_delay の後に、wireA の値を入力値に変更します。次に、wireA は send_signal(gateA, wireA_value) を実行します。これにより、ゲートはその値を再計算し、gateA_delay などの後に次のオブジェクトに転送します。
しかし、信号を並列に伝搬する必要があります。1 つのシリアル パスだけに集中することはできません。したがって、私の考えは、すべての入力に対して複数のスレッドを作成することでした。せいぜい 32 個の入力信号が必要になると考えているので、32 スレッドです。私はそれらをラウンドロビンの順序で均等にスケジュールしたいと思っています.JVMでこれを行うことができるかどうかはわかりません. いずれにせよ、それらはすべて同じ優先度になります。
ここで、i 番目の入力スレッドが、上で説明したことを実行します。つまり、信号を伝播します。しかし、パスが多くのパスに分岐するとどうなりますか?
ゲートは複数の「ファンアウト」、つまり出力から他の場所へのリンクを持つことができることに注意することが重要です。その値は通常、最大で 4 です。したがって、gateA が設定された後、send_signal(wireB->E, gateA_value) を 4 回 (それぞれのファンアウトに対して 1 回) 呼び出す必要があることがわかります。
理想的には、さまざまなスレッドに分岐したくないのですが、それは本当にひどいことであり、大規模な設計ではおそらく不可能ですが、そもそもスレッドの概念全体が不要だったのかもしれません. 途方もない速度でシミュレートする必要はありません。人間のユーザーに反応するように見えるだけです。
考えられる実装に戻ると、入力スレッドは BAM までシリアル パスに沿って伝播します。4 つの異なるパスに分岐します。これが私の考えです。今のところ、同じスレッドに 4 つのパスがあるとします。各パスには独自の遅延があります (例: 1.4、2.2、3.6、1.1)。各遅延に 100 を掛け、N 反復をループします。ここで、N は最大遅延 (この場合: 360) に対応します。他の遅延 (i = 110、140、220) に対応するループ内のさまざまなチェックポイントで、これらのさまざまなパスを 1 ステップ前に伝播します (つまり、パス上のすぐ次のオブジェクトに信号を送信します)。ただし、このオブジェクトをループ リストに追加し、特定のパスをさらに伝播する前に、適切な反復回数を再度カウントする必要があります。
1 から 4 へのパスの 4 つのパスすべてがさらに 4 つのパスに分岐している場合 (などなど)、私はちょっとうんざりしています。しかし、おそらくこのアプローチは私を始めるのに十分でしょうか?
繰り返しますが、私は完全に間違った方向からこの問題に取り組んでいる可能性があり、一歩下がって再考したいと思っています。ですから、なぜ私は皆さんに尋ねているのですか。
なんらかのご意見をお寄せいただき、またはこのいまいましいことを読んでいただき、ありがとうございます。乾杯。