8

共有メモリを使用して、複数のプロセス間で一部のデータを共有しています。プロセス間ミューテックスを使用して同期を実現します。

私の質問は次のとおりです。2 つのプロセス間でミューテックスを使用せずに、ロックフリーのデータ構造 AND/OR アトミック操作を使用してより高速な同期を実現することは可能ですか?

そうでない場合、これの主な理由は何ですか?

これらは、同じプロセスのスレッドを同期するためにのみ使用されます。これらの概念はプロセスにも移植できますか? そうでない場合、プロセス間でデータを共有/同期するためのより高速な方法を知っていますか?

4

2 に答える 2

9

これらの概念はプロセスにも移植できますか?

はい、アトミック操作はスレッドとプロセスの両方で普遍的です。IIF アトミックに使用されるメモリは共有されます。

アトミック操作はプロセッサ自体の特定の命令であり、スレッドやプロセスについては何も知らず、低レベルのハードウェア実装を使用したアクション (読み取り、比較、保存) のオール オア ナッシング (不可分) の複合体です。

したがって、プロセス間で共有メモリをセットアップし、atomic_t をそこに入れることができます。

ロックフリー

はい、ロックフリーがアトミックでのみ実装されている場合。(そうすべき)

データ構造

共有メモリが(データ構造内に)ポインタを格納するために使用される場合、両方のプロセスで同じアドレスにマップされていることを確認する必要があります。

メモリが別のアドレスにマップされる場合、ポインターは別のプロセスで壊れます。この場合、相対アドレスを使用し、単純なメモリ変換を行う必要があります。

相互プロセスミューテックス

そして、glibc>2.4 (NPTL) は、非競合ロック (プロセス共有ミューテックス = プロセス間ミューテックス) のためにアトミック操作と組み合わせた futex を使用していると言わざるを得ません。したがって、すでに共有メモリでアトミック操作を使用しています。

于 2011-11-16T23:47:53.793 に答える
2

NPTL を使用する x86 では、ほとんどの同期プリミティブは高速パスとして、完全なメモリ バリアを使用した 1 つのインターロック操作のみを使用します。x86 プラットフォームにはそれより軽いものは実際にはありません。既存のアトミック操作が必要なことを正確に実行しない限り、意味的に軽いプリミティブを使用するコストを返済するためのパフォーマンスの向上はありません。

于 2011-11-17T00:07:08.403 に答える