1

現在、ネットワーク上の送信 TCP および UDP パケットの IP アドレスとポートを保存しています。ネットワークを監視し、それらのパケットへの応答を待ちます。

ネットワークに着信するすべてのパケットは、最初に、過去のアウトバウンド パケットの IP アドレスとポートのリストを検索することによって、送信請求されたものか、送信請求されていないものかを確認します。

現在、私はロックされた動的配列を使用しており、ネットワークに到着する各パケットを検索しています。これは、100 mbps サービスにアップグレードするまで問題ありませんでした。ピーク時には、プロファイラーが示すように、検索機能で多くの競合が発生します。

多くの異なるアルゴリズムを見てみると、この特定のタイプの使用に適したものはあまり見つかりませんでした. アトミック挿入とアトミック アクセスの詳細を見てきましたが、これは全体的に非常に単純です。

最初に配列をコピーし、検索し、見つかった場合はアイテムを削除し、2 つの配列参照/ポインターの比較と交換を行うことが改善になるのではないかと考えていました。CAS が成功すれば、問題ありません。そうでない場合は、そうなるまでもう一度やり直してください。

ただし、これは非常にメモリが重いため、パフォーマンスが低下する可能性があると思います。使用するメモリはたくさんありますが、ピーク時には多くの CAS 障害が発生すると思います。

私はプロファイリングを行うためにこの実装に取り​​組んでいますが、他の誰かがこの問題の解決策を思いついたことがあり、喜んで共有してくれるかどうかに興味があります. 私は C と C# で作業していますが、どの言語の例も適切です。

4

2 に答える 2

1

問題を解決するには、むしろ辞書データ構造を使用したいと思います。ConcurrentDictionaryを使用する か、独自のものを作成して、ロックのないリンク リスト (Web には多くの参照があります) を使用して衝突を処理することができます。

于 2013-07-07T18:09:17.003 に答える